diff -up cracklib-2.9.0/lib/packer.h.lookup cracklib-2.9.0/lib/packer.h --- cracklib-2.9.0/lib/packer.h.lookup 2013-08-21 14:43:16.832990712 +0200 +++ cracklib-2.9.0/lib/packer.h 2013-08-21 14:43:16.835990775 +0200 @@ -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.0/lib/packlib.c.lookup cracklib-2.9.0/lib/packlib.c --- cracklib-2.9.0/lib/packlib.c.lookup 2013-06-01 16:47:13.000000000 +0200 +++ cracklib-2.9.0/lib/packlib.c 2013-08-21 14:44:12.325177107 +0200 @@ -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]); @@ -528,13 +528,16 @@ GetPW(pwp, number) return ((char *) 0); } - 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++) { @@ -545,6 +548,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]); @@ -623,21 +629,27 @@ fprintf(stderr, "look for (%s)\n", strin return(middle); } - if (middle == hwm) - { + if (cmp < 0) + { + if (middle == lwm) + { #if DEBUG - fprintf(stderr, "at terminal subdivision, stopping search\n"); + fprintf(stderr, "at terminal subdivision from right, stopping search\n"); #endif break; - } - - if (cmp < 0) - { - hwm = middle; + } + 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; } }