Blob Blame History Raw
diff -up Linux-PAM-1.1.6/modules/pam_userdb/pam_userdb.c.case Linux-PAM-1.1.6/modules/pam_userdb/pam_userdb.c
--- Linux-PAM-1.1.6/modules/pam_userdb/pam_userdb.c.case	2014-12-04 11:46:33.225540015 +0100
+++ Linux-PAM-1.1.6/modules/pam_userdb/pam_userdb.c	2014-12-04 11:48:54.492734888 +0100
@@ -214,24 +214,23 @@ user_lookup (pam_handle_t *pamh, const c
 	  /* crypt(3) password storage */
 
 	  char *cryptpw;
-	  char salt[2];
 
-	  if (data.dsize != 13) {
+	  if (data.dsize < 13) {
 	    compare = -2;
 	  } else if (ctrl & PAM_ICASE_ARG) {
 	    compare = -2;
 	  } else {
-	    salt[0] = *data.dptr;
-	    salt[1] = *(data.dptr + 1);
+	    cryptpw = crypt (pass, data.dptr);
 
-	    cryptpw = crypt (pass, salt);
-
-	    if (cryptpw) {
-	      compare = strncasecmp (data.dptr, cryptpw, data.dsize);
+	    if (cryptpw && strlen(cryptpw) == (size_t)data.dsize) {
+	      compare = memcmp(data.dptr, cryptpw, data.dsize);
 	    } else {
 	      compare = -2;
 	      if (ctrl & PAM_DEBUG_ARG) {
-		pam_syslog(pamh, LOG_INFO, "crypt() returned NULL");
+		if (cryptpw)
+		  pam_syslog(pamh, LOG_INFO, "lengths of computed and stored hashes differ");
+		else
+		  pam_syslog(pamh, LOG_INFO, "crypt() returned NULL");
 	      }
 	    };