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