|
|
7519b3 |
commit 8596e298f761c32cecff45424f5242cd14269292
|
|
|
7519b3 |
Author: Zack Weinberg <zackw@panix.com>
|
|
|
7519b3 |
Date: Tue Aug 7 21:35:12 2018 -0400
|
|
|
7519b3 |
|
|
|
7519b3 |
Add configure option --disable-failure-tokens.
|
|
|
7519b3 |
|
|
|
7519b3 |
When this option is given, crypt and crypt_r will return NULL on
|
|
|
7519b3 |
failure, instead of a special "failure token" string that isn't the
|
|
|
7519b3 |
hash of any passphrase. This was the historical behavior of glibc,
|
|
|
7519b3 |
FreeBSD libc, and several other implementations.
|
|
|
7519b3 |
|
|
|
7519b3 |
diff --git a/configure.ac b/configure.ac
|
|
|
7519b3 |
index a22a5926bd82f729..23651f9c5c886107 100644
|
|
|
7519b3 |
--- a/configure.ac
|
|
|
7519b3 |
+++ b/configure.ac
|
|
|
7519b3 |
@@ -152,6 +152,25 @@ AC_CHECK_FUNCS_ONCE([
|
|
|
7519b3 |
])
|
|
|
7519b3 |
|
|
|
7519b3 |
# Configure options.
|
|
|
7519b3 |
+AC_ARG_ENABLE([failure-tokens],
|
|
|
7519b3 |
+ AS_HELP_STRING(
|
|
|
7519b3 |
+ [--disable-failure-tokens],
|
|
|
7519b3 |
+ [Make crypt and crypt_r return NULL on failure, instead of a
|
|
|
7519b3 |
+ special "failure token" string that isn't the hash of any
|
|
|
7519b3 |
+ passphrase. This matches the behavior of several other
|
|
|
7519b3 |
+ crypt implementations, but will break programs that assume these
|
|
|
7519b3 |
+ functions never return NULL. crypt_rn and crypt_ra are not affected
|
|
|
7519b3 |
+ by this option, and will always return NULL on failure.]
|
|
|
7519b3 |
+ ),
|
|
|
7519b3 |
+ [case "$enableval" in
|
|
|
7519b3 |
+ yes) enable_failure_tokens=1;;
|
|
|
7519b3 |
+ no) enable_failure_tokens=0;;
|
|
|
7519b3 |
+ *) AC_MSG_ERROR([bad value ${enableval} for --enable-failure-tokens]);;
|
|
|
7519b3 |
+ esac],
|
|
|
7519b3 |
+ [enable_failure_tokens=1])
|
|
|
7519b3 |
+AC_DEFINE_UNQUOTED([ENABLE_FAILURE_TOKENS], [$enable_failure_tokens],
|
|
|
7519b3 |
+ [Define to 1 if crypt and crypt_r should return a "failure token" on
|
|
|
7519b3 |
+ failure, or 0 if they should return NULL.])
|
|
|
7519b3 |
|
|
|
7519b3 |
AC_ARG_ENABLE([obsolete-api],
|
|
|
7519b3 |
AS_HELP_STRING(
|
|
|
7519b3 |
diff --git a/crypt.c b/crypt.c
|
|
|
7519b3 |
index 9a3e19214e613097..839763afad14eaa9 100644
|
|
|
7519b3 |
--- a/crypt.c
|
|
|
7519b3 |
+++ b/crypt.c
|
|
|
7519b3 |
@@ -235,7 +235,11 @@ crypt_r (const char *phrase, const char *setting, struct crypt_data *data)
|
|
|
7519b3 |
{
|
|
|
7519b3 |
make_failure_token (setting, data->output, sizeof data->output);
|
|
|
7519b3 |
do_crypt (phrase, setting, data);
|
|
|
7519b3 |
+#if ENABLE_FAILURE_TOKENS
|
|
|
7519b3 |
return data->output;
|
|
|
7519b3 |
+#else
|
|
|
7519b3 |
+ return data->output[0] == '*' ? 0 : data->output;
|
|
|
7519b3 |
+#endif
|
|
|
7519b3 |
}
|
|
|
7519b3 |
SYMVER_crypt_r;
|
|
|
7519b3 |
#endif
|
|
|
7519b3 |
diff --git a/crypt_rn.3 b/crypt_rn.3
|
|
|
7519b3 |
index 24da44cfce19716b..d021c4ed4a046e04 100644
|
|
|
7519b3 |
--- a/crypt_rn.3
|
|
|
7519b3 |
+++ b/crypt_rn.3
|
|
|
7519b3 |
@@ -204,17 +204,31 @@ multiple threads simultaneously, as long as a separate
|
|
|
7519b3 |
object is used for each thread.
|
|
|
7519b3 |
.PP
|
|
|
7519b3 |
Upon error,
|
|
|
7519b3 |
-.B crypt
|
|
|
7519b3 |
-and
|
|
|
7519b3 |
-.B crypt_r
|
|
|
7519b3 |
-return a pointer to an
|
|
|
7519b3 |
+.BR crypt_r ", " crypt_rn ", and " crypt_ra
|
|
|
7519b3 |
+write an
|
|
|
7519b3 |
.I invalid
|
|
|
7519b3 |
-hashed passphrase.
|
|
|
7519b3 |
+hashed passphrase to the
|
|
|
7519b3 |
+.I output
|
|
|
7519b3 |
+field of their
|
|
|
7519b3 |
+.I crypt_data
|
|
|
7519b3 |
+object, and
|
|
|
7519b3 |
+.B crypt
|
|
|
7519b3 |
+writes an invalid hash to its static storage area.
|
|
|
7519b3 |
This string will be shorter than 13 characters,
|
|
|
7519b3 |
will begin with a \(oq\fB*\fR\(cq,
|
|
|
7519b3 |
and will not compare equal to
|
|
|
7519b3 |
.IR setting .
|
|
|
7519b3 |
-(This peculiar behavior is for compatibility
|
|
|
7519b3 |
+.PP
|
|
|
7519b3 |
+Upon error,
|
|
|
7519b3 |
+.BR crypt_rn " and " crypt_ra
|
|
|
7519b3 |
+return a null pointer.
|
|
|
7519b3 |
+.BR crypt_r " and " crypt
|
|
|
7519b3 |
+may also return a null pointer,
|
|
|
7519b3 |
+or they may return a pointer to the invalid hash,
|
|
|
7519b3 |
+depending on how
|
|
|
7519b3 |
+.I libcrypt
|
|
|
7519b3 |
+was configured.
|
|
|
7519b3 |
+(The option to return the invalid hash is for compatibility
|
|
|
7519b3 |
with old applications that assume that
|
|
|
7519b3 |
.B crypt
|
|
|
7519b3 |
cannot return a null pointer.
|
|
|
7519b3 |
@@ -222,15 +236,6 @@ See
|
|
|
7519b3 |
.B "PORTABILITY NOTES"
|
|
|
7519b3 |
below.)
|
|
|
7519b3 |
.PP
|
|
|
7519b3 |
-.B crypt_rn
|
|
|
7519b3 |
-and
|
|
|
7519b3 |
-.B crypt_ra
|
|
|
7519b3 |
-also write an invalid hashed passphrase to the
|
|
|
7519b3 |
-.I output
|
|
|
7519b3 |
-field of their
|
|
|
7519b3 |
-.I crypt_data
|
|
|
7519b3 |
-object when they fail, but they return a null pointer.
|
|
|
7519b3 |
-.PP
|
|
|
7519b3 |
All four functions set
|
|
|
7519b3 |
.I errno
|
|
|
7519b3 |
when they fail.
|
|
|
7519b3 |
diff --git a/test-badsalt.c b/test-badsalt.c
|
|
|
7519b3 |
index b2743373628b1f3f..3d2e47ac0e7647bd 100644
|
|
|
7519b3 |
--- a/test-badsalt.c
|
|
|
7519b3 |
+++ b/test-badsalt.c
|
|
|
7519b3 |
@@ -222,12 +222,28 @@ check_crypt (const char *label, const char *fn,
|
|
|
7519b3 |
const char *retval, const char *setting,
|
|
|
7519b3 |
bool expected_to_succeed)
|
|
|
7519b3 |
{
|
|
|
7519b3 |
- /* crypt/crypt_r should never return null */
|
|
|
7519b3 |
+#if ENABLE_FAILURE_TOKENS
|
|
|
7519b3 |
+ /* crypt/crypt_r never return null when failure tokens are enabled */
|
|
|
7519b3 |
if (!retval)
|
|
|
7519b3 |
{
|
|
|
7519b3 |
printf ("FAIL: %s/%s/%s: returned NULL\n", label, setting, fn);
|
|
|
7519b3 |
return false;
|
|
|
7519b3 |
}
|
|
|
7519b3 |
+#else
|
|
|
7519b3 |
+ if (expected_to_succeed && !retval)
|
|
|
7519b3 |
+ {
|
|
|
7519b3 |
+ printf ("FAIL: %s/%s/%s: returned NULL\n", label, setting, fn);
|
|
|
7519b3 |
+ return false;
|
|
|
7519b3 |
+ }
|
|
|
7519b3 |
+ else if (!expected_to_succeed && retval)
|
|
|
7519b3 |
+ {
|
|
|
7519b3 |
+ printf ("FAIL: %s/%s/%s: returned %p, should be NULL\n",
|
|
|
7519b3 |
+ label, setting, fn, (const void *)retval);
|
|
|
7519b3 |
+ return false;
|
|
|
7519b3 |
+ }
|
|
|
7519b3 |
+ else if (!expected_to_succeed && !retval)
|
|
|
7519b3 |
+ return true;
|
|
|
7519b3 |
+#endif
|
|
|
7519b3 |
if (!check_results (label, fn, retval, setting,
|
|
|
7519b3 |
expected_to_succeed))
|
|
|
7519b3 |
return false;
|
|
|
7519b3 |
diff --git a/test-crypt-badargs.c b/test-crypt-badargs.c
|
|
|
7519b3 |
index 0e6af1626a605086..6be24a99ca7f9015 100644
|
|
|
7519b3 |
--- a/test-crypt-badargs.c
|
|
|
7519b3 |
+++ b/test-crypt-badargs.c
|
|
|
7519b3 |
@@ -169,6 +169,14 @@ test_crypt_ra (const char *tag,
|
|
|
7519b3 |
check (tag, expect, got);
|
|
|
7519b3 |
}
|
|
|
7519b3 |
|
|
|
7519b3 |
+#if ENABLE_FAILURE_TOKENS
|
|
|
7519b3 |
+# define FT0 "*0"
|
|
|
7519b3 |
+# define FT1 "*1"
|
|
|
7519b3 |
+#else
|
|
|
7519b3 |
+# define FT0 0
|
|
|
7519b3 |
+# define FT1 0
|
|
|
7519b3 |
+#endif
|
|
|
7519b3 |
+
|
|
|
7519b3 |
/* PAGE should point to PAGESIZE bytes of read-write memory followed
|
|
|
7519b3 |
by another PAGESIZE bytes of inaccessible memory. */
|
|
|
7519b3 |
|
|
|
7519b3 |
@@ -187,55 +195,55 @@ do_tests(char *page, size_t pagesize)
|
|
|
7519b3 |
size_t i;
|
|
|
7519b3 |
|
|
|
7519b3 |
/* When SETTING is null, it shouldn't matter what PHRASE is. */
|
|
|
7519b3 |
- expect_no_fault ("0.0.crypt", 0, 0, "*0", test_crypt);
|
|
|
7519b3 |
- expect_no_fault ("0.0.crypt_r", 0, 0, "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_no_fault ("0.0.crypt", 0, 0, FT0, test_crypt);
|
|
|
7519b3 |
+ expect_no_fault ("0.0.crypt_r", 0, 0, FT0, test_crypt_r);
|
|
|
7519b3 |
expect_no_fault ("0.0.crypt_rn", 0, 0, 0, test_crypt_rn);
|
|
|
7519b3 |
expect_no_fault ("0.0.crypt_ra", 0, 0, 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
- expect_no_fault ("''.0.crypt", "", 0, "*0", test_crypt);
|
|
|
7519b3 |
- expect_no_fault ("''.0.crypt_r", "", 0, "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_no_fault ("''.0.crypt", "", 0, FT0, test_crypt);
|
|
|
7519b3 |
+ expect_no_fault ("''.0.crypt_r", "", 0, FT0, test_crypt_r);
|
|
|
7519b3 |
expect_no_fault ("''.0.crypt_rn", "", 0, 0, test_crypt_rn);
|
|
|
7519b3 |
expect_no_fault ("''.0.crypt_ra", "", 0, 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
- expect_no_fault ("ph.0.crypt", phrase, 0, "*0", test_crypt);
|
|
|
7519b3 |
- expect_no_fault ("ph.0.crypt_r", phrase, 0, "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_no_fault ("ph.0.crypt", phrase, 0, FT0, test_crypt);
|
|
|
7519b3 |
+ expect_no_fault ("ph.0.crypt_r", phrase, 0, FT0, test_crypt_r);
|
|
|
7519b3 |
expect_no_fault ("ph.0.crypt_rn", phrase, 0, 0, test_crypt_rn);
|
|
|
7519b3 |
expect_no_fault ("ph.0.crypt_ra", phrase, 0, 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
- expect_no_fault ("p1.0.crypt", p1, 0, "*0", test_crypt);
|
|
|
7519b3 |
- expect_no_fault ("p1.0.crypt_r", p1, 0, "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_no_fault ("p1.0.crypt", p1, 0, FT0, test_crypt);
|
|
|
7519b3 |
+ expect_no_fault ("p1.0.crypt_r", p1, 0, FT0, test_crypt_r);
|
|
|
7519b3 |
expect_no_fault ("p1.0.crypt_rn", p1, 0, 0, test_crypt_rn);
|
|
|
7519b3 |
expect_no_fault ("p1.0.crypt_ra", p1, 0, 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
- expect_no_fault ("p2.0.crypt", p2, 0, "*0", test_crypt);
|
|
|
7519b3 |
- expect_no_fault ("p2.0.crypt_r", p2, 0, "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_no_fault ("p2.0.crypt", p2, 0, FT0, test_crypt);
|
|
|
7519b3 |
+ expect_no_fault ("p2.0.crypt_r", p2, 0, FT0, test_crypt_r);
|
|
|
7519b3 |
expect_no_fault ("p2.0.crypt_rn", p2, 0, 0, test_crypt_rn);
|
|
|
7519b3 |
expect_no_fault ("p2.0.crypt_ra", p2, 0, 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
/* Conversely, when PHRASE is null,
|
|
|
7519b3 |
it shouldn't matter what SETTING is... */
|
|
|
7519b3 |
- expect_no_fault ("0.''.crypt", 0, "", "*0", test_crypt);
|
|
|
7519b3 |
- expect_no_fault ("0.''.crypt_r", 0, "", "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_no_fault ("0.''.crypt", 0, "", FT0, test_crypt);
|
|
|
7519b3 |
+ expect_no_fault ("0.''.crypt_r", 0, "", FT0, test_crypt_r);
|
|
|
7519b3 |
expect_no_fault ("0.''.crypt_rn", 0, "", 0, test_crypt_rn);
|
|
|
7519b3 |
expect_no_fault ("0.''.crypt_ra", 0, "", 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
- expect_no_fault ("0.'*'.crypt", 0, "*", "*0", test_crypt);
|
|
|
7519b3 |
- expect_no_fault ("0.'*'.crypt_r", 0, "*", "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_no_fault ("0.'*'.crypt", 0, "*", FT0, test_crypt);
|
|
|
7519b3 |
+ expect_no_fault ("0.'*'.crypt_r", 0, "*", FT0, test_crypt_r);
|
|
|
7519b3 |
expect_no_fault ("0.'*'.crypt_rn", 0, "*", 0, test_crypt_rn);
|
|
|
7519b3 |
expect_no_fault ("0.'*'.crypt_ra", 0, "*", 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
- expect_no_fault ("0.'*0'.crypt", 0, "*0", "*1", test_crypt);
|
|
|
7519b3 |
- expect_no_fault ("0.'*0'.crypt_r", 0, "*0", "*1", test_crypt_r);
|
|
|
7519b3 |
+ expect_no_fault ("0.'*0'.crypt", 0, "*0", FT1, test_crypt);
|
|
|
7519b3 |
+ expect_no_fault ("0.'*0'.crypt_r", 0, "*0", FT1, test_crypt_r);
|
|
|
7519b3 |
expect_no_fault ("0.'*0'.crypt_rn", 0, "*0", 0, test_crypt_rn);
|
|
|
7519b3 |
expect_no_fault ("0.'*0'.crypt_ra", 0, "*0", 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
- expect_no_fault ("0.'*1'.crypt", 0, "*1", "*0", test_crypt);
|
|
|
7519b3 |
- expect_no_fault ("0.'*1'.crypt_r", 0, "*1", "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_no_fault ("0.'*1'.crypt", 0, "*1", FT0, test_crypt);
|
|
|
7519b3 |
+ expect_no_fault ("0.'*1'.crypt_r", 0, "*1", FT0, test_crypt_r);
|
|
|
7519b3 |
expect_no_fault ("0.'*1'.crypt_rn", 0, "*1", 0, test_crypt_rn);
|
|
|
7519b3 |
expect_no_fault ("0.'*1'.crypt_ra", 0, "*1", 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
- expect_no_fault ("0.p1.crypt", 0, p1, "*0", test_crypt);
|
|
|
7519b3 |
- expect_no_fault ("0.p1.crypt_r", 0, p1, "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_no_fault ("0.p1.crypt", 0, p1, FT0, test_crypt);
|
|
|
7519b3 |
+ expect_no_fault ("0.p1.crypt_r", 0, p1, FT0, test_crypt_r);
|
|
|
7519b3 |
expect_no_fault ("0.p1.crypt_rn", 0, p1, 0, test_crypt_rn);
|
|
|
7519b3 |
expect_no_fault ("0.p1.crypt_ra", 0, p1, 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
@@ -245,8 +253,8 @@ do_tests(char *page, size_t pagesize)
|
|
|
7519b3 |
bug, but it's impractical to fix without breaking the property
|
|
|
7519b3 |
that 'crypt' _never_ creates a failure token that is equal to the
|
|
|
7519b3 |
setting string, which is more important than this corner case. */
|
|
|
7519b3 |
- expect_a_fault ("0.p2.crypt", 0, p2, "*0", test_crypt);
|
|
|
7519b3 |
- expect_a_fault ("0.p2.crypt_r", 0, p2, "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_a_fault ("0.p2.crypt", 0, p2, FT0, test_crypt);
|
|
|
7519b3 |
+ expect_a_fault ("0.p2.crypt_r", 0, p2, FT0, test_crypt_r);
|
|
|
7519b3 |
expect_a_fault ("0.p2.crypt_rn", 0, p2, 0, test_crypt_rn);
|
|
|
7519b3 |
expect_a_fault ("0.p2.crypt_ra", 0, p2, 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
@@ -257,9 +265,9 @@ do_tests(char *page, size_t pagesize)
|
|
|
7519b3 |
strcpy (page, "p1.'");
|
|
|
7519b3 |
strcat (page, settings[i]);
|
|
|
7519b3 |
strcat (page, "'.crypt");
|
|
|
7519b3 |
- expect_a_fault (page, p1, settings[i], "*0", test_crypt);
|
|
|
7519b3 |
+ expect_a_fault (page, p1, settings[i], FT0, test_crypt);
|
|
|
7519b3 |
strcat (page, "_r");
|
|
|
7519b3 |
- expect_a_fault (page, p1, settings[i], "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_a_fault (page, p1, settings[i], FT0, test_crypt_r);
|
|
|
7519b3 |
strcat (page, "n");
|
|
|
7519b3 |
expect_a_fault (page, p1, settings[i], 0, test_crypt_rn);
|
|
|
7519b3 |
page [strlen (page) - 1] = 'a';
|
|
|
7519b3 |
@@ -268,9 +276,9 @@ do_tests(char *page, size_t pagesize)
|
|
|
7519b3 |
strcpy (page, "p2.'");
|
|
|
7519b3 |
strcat (page, settings[i]);
|
|
|
7519b3 |
strcat (page, "'.crypt");
|
|
|
7519b3 |
- expect_a_fault (page, p2, settings[i], "*0", test_crypt);
|
|
|
7519b3 |
+ expect_a_fault (page, p2, settings[i], FT0, test_crypt);
|
|
|
7519b3 |
strcat (page, "_r");
|
|
|
7519b3 |
- expect_a_fault (page, p2, settings[i], "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_a_fault (page, p2, settings[i], FT0, test_crypt_r);
|
|
|
7519b3 |
strcat (page, "n");
|
|
|
7519b3 |
expect_a_fault (page, p2, settings[i], 0, test_crypt_rn);
|
|
|
7519b3 |
page [strlen (page) - 1] = 'a';
|
|
|
7519b3 |
@@ -279,8 +287,8 @@ do_tests(char *page, size_t pagesize)
|
|
|
7519b3 |
|
|
|
7519b3 |
/* Conversely, when PHRASE is valid, passing an invalid string as SETTING
|
|
|
7519b3 |
should crash reliably. */
|
|
|
7519b3 |
- expect_a_fault ("ph.p2.crypt", phrase, p2, "*0", test_crypt);
|
|
|
7519b3 |
- expect_a_fault ("ph.p2.crypt_r", phrase, p2, "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_a_fault ("ph.p2.crypt", phrase, p2, FT0, test_crypt);
|
|
|
7519b3 |
+ expect_a_fault ("ph.p2.crypt_r", phrase, p2, FT0, test_crypt_r);
|
|
|
7519b3 |
expect_a_fault ("ph.p2.crypt_rn", phrase, p2, 0, test_crypt_rn);
|
|
|
7519b3 |
expect_a_fault ("ph.p2.crypt_ra", phrase, p2, 0, test_crypt_ra);
|
|
|
7519b3 |
|
|
|
7519b3 |
@@ -292,9 +300,9 @@ do_tests(char *page, size_t pagesize)
|
|
|
7519b3 |
strcpy (page, "ph.'");
|
|
|
7519b3 |
strcat (page, settings[i]);
|
|
|
7519b3 |
strcat (page, ".crypt");
|
|
|
7519b3 |
- expect_a_fault (page, phrase, p1, "*0", test_crypt);
|
|
|
7519b3 |
+ expect_a_fault (page, phrase, p1, FT0, test_crypt);
|
|
|
7519b3 |
strcat (page, "_r");
|
|
|
7519b3 |
- expect_a_fault (page, phrase, p1, "*0", test_crypt_r);
|
|
|
7519b3 |
+ expect_a_fault (page, phrase, p1, FT0, test_crypt_r);
|
|
|
7519b3 |
strcat (page, "n");
|
|
|
7519b3 |
expect_a_fault (page, phrase, p1, 0, test_crypt_rn);
|
|
|
7519b3 |
page [strlen (page) - 1] = 'a';
|
|
|
7519b3 |
diff --git a/test-crypt-bcrypt.c b/test-crypt-bcrypt.c
|
|
|
7519b3 |
index c984e4d47d8df2c6..bf149b405bd408c7 100644
|
|
|
7519b3 |
--- a/test-crypt-bcrypt.c
|
|
|
7519b3 |
+++ b/test-crypt-bcrypt.c
|
|
|
7519b3 |
@@ -194,8 +194,12 @@ main (void)
|
|
|
7519b3 |
errno = 0;
|
|
|
7519b3 |
p = crypt (key, setting);
|
|
|
7519b3 |
errnm = errno;
|
|
|
7519b3 |
+#if ENABLE_FAILURE_TOKENS
|
|
|
7519b3 |
match = strcmp (p, hash);
|
|
|
7519b3 |
- if ((!ok && !errno) || strcmp (p, hash))
|
|
|
7519b3 |
+#else
|
|
|
7519b3 |
+ match = (ok ? strcmp (p, hash) : p != 0);
|
|
|
7519b3 |
+#endif
|
|
|
7519b3 |
+ if ((!ok && !errno) || match)
|
|
|
7519b3 |
{
|
|
|
7519b3 |
printf ("FAIL: %d/crypt.1: key=%s setting=%s: xhash=%s xerr=%d, "
|
|
|
7519b3 |
"p=%s match=%d err=%s\n",
|