cryptpw: do not segfault on EOF. Closes 6350
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 30 Jun 2013 19:28:55 +0000 (21:28 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 30 Jun 2013 19:28:55 +0000 (21:28 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
loginutils/cryptpw.c

index a36f920f40a735ae106fbf1f8e61ded9a9951ff2..29f0fbe91abc23b3fb3c690a7315a009cf8090ef 100644 (file)
@@ -92,6 +92,7 @@ int cryptpw_main(int argc UNUSED_PARAM, char **argv)
 {
        char salt[MAX_PW_SALT_LEN];
        char *salt_ptr;
+       char *password;
        const char *opt_m, *opt_S;
        int fd;
 
@@ -123,15 +124,19 @@ int cryptpw_main(int argc UNUSED_PARAM, char **argv)
 
        xmove_fd(fd, STDIN_FILENO);
 
-       puts(pw_encrypt(
-               argv[0] ? argv[0] : (
-                       /* Only mkpasswd, and only from tty, prompts.
-                        * Otherwise it is a plain read. */
-                       (isatty(STDIN_FILENO) && applet_name[0] == 'm')
+       password = argv[0];
+       if (!password) {
+               /* Only mkpasswd, and only from tty, prompts.
+                * Otherwise it is a plain read. */
+               password = (isatty(STDIN_FILENO) && applet_name[0] == 'm')
                        ? bb_ask_stdin("Password: ")
                        : xmalloc_fgetline(stdin)
-               ),
-               salt, 1));
+               ;
+               /* may still be NULL on EOF/error */
+       }
+
+       if (password)
+               puts(pw_encrypt(password, salt, 1));
 
        return EXIT_SUCCESS;
 }