summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-12-30 19:08:37 -0800
committerKaz Kylheku <kaz@kylheku.com>2022-12-30 19:08:37 -0800
commite7f65d97c80d3604f8aedf67b057c7b79ea3b183 (patch)
tree153b92e2755fb13ffeb8358d2a935ad9215adf95
parent39437afb997f53b33ac34a0c2ae07074ecda94e3 (diff)
downloadtxr-e7f65d97c80d3604f8aedf67b057c7b79ea3b183.tar.gz
txr-e7f65d97c80d3604f8aedf67b057c7b79ea3b183.tar.bz2
txr-e7f65d97c80d3604f8aedf67b057c7b79ea3b183.zip
crypt: fix for platforms that lack crypt_r.
* sysif.c (crypt_wrap): Don't call free(cd) on platforms where we don't have crypt_r and have not defined the cd variable. * test/018/crypt.tl: Move the (crypt "a" "b") test case to be GNU/Linux-only. On Solaris, it yields a valid-looking hash instead of failing. That hash will not validate the password though; i.e. (crypt "a" (crypt "a" "b")) is not equal to (crypt "a" "b").
-rw-r--r--sysif.c4
-rw-r--r--tests/018/crypt.tl2
2 files changed, 5 insertions, 1 deletions
diff --git a/sysif.c b/sysif.c
index 5af269d5..00354a10 100644
--- a/sysif.c
+++ b/sysif.c
@@ -2083,11 +2083,15 @@ static val crypt_wrap(val wkey, val wsalt)
if (hash != 0) {
val ret = string_utf8(hash);
+#if HAVE_CRYPT_R
free(cd);
+#endif
return ret;
}
+#if HAVE_CRYPT_R
free(cd);
+#endif
uw_ethrowf(error_s, lit("crypt failed: ~d/~s"), num(errno),
errno_to_str(errno), nao);
diff --git a/tests/018/crypt.tl b/tests/018/crypt.tl
index 55a897af..3652b6e1 100644
--- a/tests/018/crypt.tl
+++ b/tests/018/crypt.tl
@@ -2,12 +2,12 @@
(mtest
(crypt nil nil) :error
- (crypt "a" "b") :error
(crypt "a" "bc") "bcshMw5X24ayQ"
(crypt "a" "bcd") "bcshMw5X24ayQ")
(if (eq :linux (os-symbol))
(mtest
+ (crypt "a" "b") :error
(crypt "a" "$0$") :error
(crypt "a" "$9$") :error
(crypt "a" "$1$") "$1$$Ij31LCAysPM23KuPlm1wA/"