Blob Blame History Raw
diff -up cracklib-2.9.1/lib/packer.h.lookup cracklib-2.9.1/lib/packer.h
--- cracklib-2.9.1/lib/packer.h.lookup	2013-12-09 09:52:42.153260712 +0100
+++ cracklib-2.9.1/lib/packer.h	2013-12-09 09:52:42.155260757 +0100
@@ -60,6 +60,7 @@ typedef struct
     int count;
     char data_put[NUMWORDS][MAXWORDLEN];
     char data_get[NUMWORDS][MAXWORDLEN];
+    uint32_t prevblock;
 } PWDICT;
 
 #define PW_WORDS(x) ((x)->header.pih_numwords)
diff -up cracklib-2.9.1/lib/packlib.c.lookup cracklib-2.9.1/lib/packlib.c
--- cracklib-2.9.1/lib/packlib.c.lookup	2013-12-03 15:00:15.000000000 +0100
+++ cracklib-2.9.1/lib/packlib.c	2013-12-09 09:53:43.580643470 +0100
@@ -84,6 +84,7 @@ PWOpen(prefix, mode)
 
     memset(&pdesc, '\0', sizeof(pdesc));
     memset(&pdesc64, '\0', sizeof(pdesc64));
+    pdesc.prevblock = 0xffffffff;
 
     snprintf(iname, STRINGSIZE, "%s.pwi", prefix);
     snprintf(dname, STRINGSIZE, "%s.pwd", prefix);
@@ -446,12 +447,11 @@ GetPW(pwp, number)
     register char *nstr;
     register char *bptr;
     char buffer[NUMWORDS * MAXWORDLEN];
-    static uint32_t prevblock = 0xffffffff;
     uint32_t thisblock;
 
     thisblock = number / NUMWORDS;
 
-    if (prevblock == thisblock)
+    if (pwp->prevblock == thisblock)
     {
 #if DEBUG
 	fprintf(stderr, "returning (%s)\n", pwp->data_get[number % NUMWORDS]);
@@ -526,13 +526,16 @@ GetPW(pwp, number)
 	return NULL;
     }
 
-    prevblock = thisblock;
+    pwp->prevblock = thisblock;
 
     bptr = buffer;
 
     for (ostr = pwp->data_get[0]; (*(ostr++) = *(bptr++)); /* nothing */ );
 
     ostr = pwp->data_get[0];
+#if DEBUG
+    fprintf(stderr, "data_get[0]: %s\n", ostr);
+#endif
 
     for (i = 1; i < NUMWORDS; i++)
     {
@@ -543,6 +546,9 @@ GetPW(pwp, number)
 	while ((*(ostr++) = *(bptr++)));
 
 	ostr = nstr;
+#if DEBUG
+    fprintf(stderr, "data_get[%d]: %s\n", i, ostr);
+#endif
     }
 
     return (pwp->data_get[number % NUMWORDS]);
@@ -621,22 +627,28 @@ fprintf(stderr, "look for (%s)\n", strin
 	    return(middle);
         }
 
-        if (middle == hwm)
-        {
-#if DEBUG
-		fprintf(stderr, "at terminal subdivision, stopping search\n");
-#endif
-		break;
-        }
-
 	if (cmp < 0)
 	{
-	    hwm = middle;
-	}
+	    if (middle == lwm)
+	    {
+#if DEBUG 
+		fprintf(stderr, "at terminal subdivision from right, stopping search\n");
+#endif
+		break;
+	    }
+	    hwm = middle - 1;
+	} 
 	else if (cmp > 0)
 	{
-	    lwm = middle;
-	}
+	    if (middle == hwm)
+	    {
+#if DEBUG 
+		fprintf(stderr, "at terminal subdivision from left, stopping search\n");
+#endif
+		break;
+	    }
+	    lwm = middle + 1;
+	} 
     }
 
     return (PW_WORDS(pwp));