From 1b6fab85d627114f1a8f7674e47b867e2d00d8a9 Mon Sep 17 00:00:00 2001 From: sin Date: Mon, 9 Jun 2014 12:46:40 +0100 Subject: [PATCH] Fix passwd semantics --- passwd.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/passwd.c b/passwd.c index a69ce1e..ebf1431 100644 --- a/passwd.c +++ b/passwd.c @@ -45,25 +45,26 @@ main(int argc, char *argv[]) else if (!pw) eprintf("who are you?\n"); - uid = getuid(); - if (uid == 0) - goto newpass; - - switch (pw->pw_passwd[0]) { - case '!': - case '*': - eprintf("denied\n"); - } - - if (pw->pw_passwd[0] == '\0') { - /* Default to SHA-512 for empty passwords */ - pw->pw_passwd = "$6$"; - goto newpass; - } - if (pw->pw_passwd[0] == 'x' && pw->pw_passwd[1] == '\0') eprintf("no shadow support\n"); + uid = getuid(); + if (uid == 0) { + if (pw->pw_passwd[0] == '!' || + pw->pw_passwd[0] == '*' || + pw->pw_passwd[0] == '\0') + pw->pw_passwd = "$6$"; + goto newpass; + } else { + if (pw->pw_passwd[0] == '!' || + pw->pw_passwd[0] == '*') + eprintf("denied\n"); + if (pw->pw_passwd[0] == '\0') { + pw->pw_passwd = "$6$"; + goto newpass; + } + } + /* Flush pending input */ ioctl(STDIN_FILENO, TCFLSH, (void *)0);