Author: igor
Date: Sat Oct 19 11:28:40 2013
New Revision: 2750

Log:
shadow fix for glibc >= 2.17 crypt

Added:
   trunk/shadow/shadow-4.1.5.1-crypt-1.patch

Added: trunk/shadow/shadow-4.1.5.1-crypt-1.patch
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ trunk/shadow/shadow-4.1.5.1-crypt-1.patch   Sat Oct 19 11:28:40 2013        
(r2750)
@@ -0,0 +1,62 @@
+Submitted By:            Igor Živković <cont...@igor-zivkovic.from.hr>
+Date:                    2013-10-19
+Initial Package Version: 4.1.5.1
+Upstream Status:         Unknown
+Origin:                  Slackware
+Description:             Addresses a change in Glibc >= 2.17 crypt()'s handling
+                         of an invalid seed, which in the past returned an
+                         encrypted string and now returns a NULL.
+
+diff -Naur shadow-4.1.5.1.orig/lib/encrypt.c shadow-4.1.5.1/lib/encrypt.c
+--- shadow-4.1.5.1.orig/lib/encrypt.c  2010-08-22 15:05:02.000000000 +0200
++++ shadow-4.1.5.1/lib/encrypt.c       2013-10-19 20:01:19.670397191 +0200
+@@ -45,15 +45,40 @@
+       static char cipher[128];
+       char *cp;
+ 
+-      cp = crypt (clear, salt);
+-      if (!cp) {
+-              /*
+-               * Single Unix Spec: crypt() may return a null pointer,
+-               * and set errno to indicate an error.  The caller doesn't
+-               * expect us to return NULL, so...
+-               */
+-              perror ("crypt");
+-              exit (EXIT_FAILURE);
++      cp = crypt (clear, salt);
++      if (!cp) {
++              /*
++               * In glibc-2.17 and newer, crypt() will return NULL if
++               * it was called using an invalid salt format.  Previous
++               * versions of glibc would go ahead and compute a DES hash
++               * using the invalid salt.  The salt value in this case was
++               * always '!'.  We might arrive at this place if either the
++               * user does not exist, or if the hash in /etc/shadow doesn't
++               * have the proper magic for one of the supported hash
++               * formats (for example, if the account was locked using
++               * "passwd -l".  To handle this situation, we will recompute
++               * the hash using a hardcoded salt as was previously done
++               * by glibc.  The hash returned by the old glibc function
++               * always began with "!!", which would ensure that it could
++               * never match an otherwise valid hash in /etc/shadow that
++               * was disabled with a "!" at the beginning (since the second
++               * character would never be "!" as well), so we will also
++               * prepend the resulting hash with "!!".  Finally, in case
++               * crypt() failed for some other reason we will check to see
++               * if we still get NULL from crypt even with the valid salt
++               * and will fail if that's the case.
++               */
++
++              /* Recalculate hash using a hardcoded, valid SHA512 salt: */
++              cp = crypt (clear, "$6$8IIcy/1EPOk/");
++
++              if (!cp) {
++                      perror ("crypt");
++                      exit (EXIT_FAILURE);
++              } else {
++                      sprintf (cipher, "!!%s", cp);
++                      return cipher;
++              }
+       }
+ 
+       /* The GNU crypt does not return NULL if the algorithm is not
-- 
http://linuxfromscratch.org/mailman/listinfo/patches
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to