From 8392fd349dfc25080fcd022a0bbd32e6590c85a8 Mon Sep 17 00:00:00 2001 From: Marco d'Itri Date: Sun, 9 Sep 2018 01:10:59 +0200 Subject: [PATCH] mkpasswd: use perror with crypt and crypt_gensalt Only some implementations of crypt(3) set errno on errors. --- config.h | 7 +++++++ mkpasswd.c | 13 ++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/config.h b/config.h index 112d14c..66f7e71 100644 --- a/config.h +++ b/config.h @@ -95,6 +95,13 @@ # define HAVE_GETENTROPY #endif +/* some versions of crypt(3) set errno on error */ +#if defined __GLIBC__ || (defined __SVR4 && defined __sun) || defined OpenBSD || AIX +# define CRYPT_SETS_ERRNO 1 +#else +# define CRYPT_SETS_ERRNO 0 +#endif + #ifdef ENABLE_NLS # ifndef NLS_CAT_NAME # define NLS_CAT_NAME "whois" diff --git a/mkpasswd.c b/mkpasswd.c index 0eb89f3..558624c 100644 --- a/mkpasswd.c +++ b/mkpasswd.c @@ -283,16 +283,16 @@ int main(int argc, char *argv[]) #ifdef HAVE_SOLARIS_CRYPT_GENSALT salt = crypt_gensalt(salt_prefix, NULL); if (!salt) { - perror("crypt_gensalt"); - exit(2); + perror("crypt_gensalt"); + exit(2); } #elif defined HAVE_LINUX_CRYPT_GENSALT void *entropy = get_random_bytes(64); salt = crypt_gensalt(salt_prefix, rounds, entropy, 64); if (!salt) { - fprintf(stderr, "crypt_gensalt failed.\n"); - exit(2); + perror("crypt_gensalt"); + exit(2); } free(entropy); #else @@ -342,7 +342,10 @@ int main(int argc, char *argv[]) result = crypt(password, salt); /* xcrypt returns "*0" on errors */ if (!result || result[0] == '*') { - fprintf(stderr, "crypt failed.\n"); + if (CRYPT_SETS_ERRNO) + perror("crypt"); + else + fprintf(stderr, "crypt failed.\n"); exit(2); } /* yes, using strlen(salt_prefix) on salt. It's not