Remove some more of the crypt() calls in login_chpass.

Index: login_chpass/Makefile
===================================================================
RCS file: /cvs/src/libexec/login_chpass/Makefile,v
retrieving revision 1.7
diff -u -p -r1.7 Makefile
--- login_chpass/Makefile       22 Apr 2014 10:21:56 -0000      1.7
+++ login_chpass/Makefile       14 Oct 2015 19:39:03 -0000
@@ -13,7 +13,7 @@ CFLAGS+=-Wall
 
 .if (${YP:L} == "yes")
 CFLAGS+=-DYP
-SRCS+= yp_passwd.c pwd_check.c pwd_gensalt.c
+SRCS+= yp_passwd.c pwd_check.c
 DPADD+= ${LIBRPCSVC} ${LIBUTIL}
 LDADD+= -lrpcsvc -lutil
 .endif
Index: login_chpass/login_chpass.c
===================================================================
RCS file: /cvs/src/libexec/login_chpass/login_chpass.c,v
retrieving revision 1.16
diff -u -p -r1.16 login_chpass.c
--- login_chpass/login_chpass.c 4 Dec 2012 02:24:47 -0000       1.16
+++ login_chpass/login_chpass.c 14 Oct 2015 19:38:31 -0000
@@ -199,16 +199,11 @@ yp_chpass(char *username)
                }
        }
        if (pw == NULL) {
-               char *p, salt[_PASSWORD_LEN + 1];
-               login_cap_t *lc;
-
-               /* no such user, get appropriate salt to thwart timing attack */
+               char *p;
+               /* no such user, but fake to thwart timing attack */
                if ((p = getpass("Old password:")) != NULL) {
-                       if ((lc = login_getclass(NULL)) == NULL ||
-                           pwd_gensalt(salt, sizeof(salt), lc, 'y') == 0)
-                               strlcpy(salt, "xx", sizeof(salt));
-                       crypt(p, salt);
-                       memset(p, 0, strlen(p));
+                       crypt_checkpass(p, NULL);
+                       explicit_bzero(p, strlen(p));
                }
                warnx("YP passwd database unchanged.");
                exit(1);
Index: login_lchpass/Makefile
===================================================================
RCS file: /cvs/src/libexec/login_lchpass/Makefile,v
retrieving revision 1.3
diff -u -p -r1.3 Makefile
--- login_lchpass/Makefile      19 Jun 2001 16:38:21 -0000      1.3
+++ login_lchpass/Makefile      14 Oct 2015 19:39:16 -0000
@@ -3,7 +3,7 @@
 #      BSDI    $From: Makefile,v 1.2 1997/08/08 18:58:22 prb Exp $
 
 PROG=  login_lchpass
-SRCS=  login_lchpass.c local_passwd.c pwd_check.c pwd_gensalt.c
+SRCS=  login_lchpass.c local_passwd.c pwd_check.c
 MAN=   login_lchpass.8
 .PATH: ${.CURDIR}/../../usr.bin/passwd
 
Index: login_lchpass/login_lchpass.c
===================================================================
RCS file: /cvs/src/libexec/login_lchpass/login_lchpass.c,v
retrieving revision 1.14
diff -u -p -r1.14 login_lchpass.c
--- login_lchpass/login_lchpass.c       4 Dec 2012 02:24:47 -0000       1.14
+++ login_lchpass/login_lchpass.c       14 Oct 2015 19:39:33 -0000
@@ -63,7 +63,7 @@ main(int argc, char *argv[])
        login_cap_t *lc;
        struct iovec iov[2];
        struct passwd *pwd;
-       char *username = NULL, *salt, *p, saltbuf[_PASSWORD_LEN + 1];
+       char *username = NULL, *hash = NULL, *p;
        struct rlimit rl;
        int c;
 
@@ -119,15 +119,7 @@ main(int argc, char *argv[])
        }
 
        if (pwd)
-               salt = pwd->pw_passwd;
-       else {
-               /* no such user, get appropriate salt */
-               if ((lc = login_getclass(NULL)) == NULL ||
-                   pwd_gensalt(saltbuf, sizeof(saltbuf), lc, 'l') == 0)
-                       salt = "xx";
-               else
-                       salt = saltbuf;
-       }
+               hash = pwd->pw_passwd;
 
        (void)setpriority(PRIO_PROCESS, 0, -4);
 
@@ -135,10 +127,11 @@ main(int argc, char *argv[])
        if ((p = getpass("Old Password:")) == NULL)
                exit(1);
 
-       salt = crypt(p, salt);
-       memset(p, 0, strlen(p));
-       if (!pwd || strcmp(salt, pwd->pw_passwd) != 0)
+       if (crypt_checkpass(p, hash) != 0) {
+               explicit_bzero(p, strlen(p));
                exit(1);
+       }
+       explicit_bzero(p, strlen(p));
 
        /*
         * We rely on local_passwd() to block signals during the

Reply via email to