Tomas Mraz a483b3
diff -up cracklib-2.9.0/lib/fascist.c.reentrant cracklib-2.9.0/lib/fascist.c
Tomas Mraz a483b3
--- cracklib-2.9.0/lib/fascist.c.reentrant	2013-06-01 16:52:33.000000000 +0200
Tomas Mraz a483b3
+++ cracklib-2.9.0/lib/fascist.c	2013-08-21 15:31:18.700090735 +0200
Tomas Mraz a483b3
@@ -36,8 +36,8 @@ typedef unsigned short uint16_t;
Tomas Mraz a483b3
 #undef DEBUG
Tomas Mraz a483b3
 #undef DEBUG2
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-extern char *Reverse(char *buf);
Tomas Mraz a483b3
-extern char *Lowercase(char *buf);
Tomas Mraz a483b3
+extern char *Reverse(char *buf, char *area);
Tomas Mraz a483b3
+extern char *Lowercase(char *buf, char *area);
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 static char *r_destructors[] = {
Tomas Mraz a483b3
     ":",                        /* noop - must do this to test raw word. */
Tomas Mraz a483b3
@@ -439,6 +439,8 @@ GTry(rawtext, password)
Tomas Mraz a483b3
     int i;
Tomas Mraz a483b3
     int len;
Tomas Mraz a483b3
     char *mp;
Tomas Mraz a483b3
+    char area[STRINGSIZE];
Tomas Mraz a483b3
+    char revarea[STRINGSIZE];
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     /* use destructors to turn password into rawtext */
Tomas Mraz a483b3
     /* note use of Reverse() to save duplicating all rules */
Tomas Mraz a483b3
@@ -447,7 +449,7 @@ GTry(rawtext, password)
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     for (i = 0; r_destructors[i]; i++)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
-	if (!(mp = Mangle(password, r_destructors[i])))
Tomas Mraz a483b3
+	if (!(mp = Mangle(password, r_destructors[i], area)))
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	    continue;
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
@@ -462,10 +464,10 @@ GTry(rawtext, password)
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 #ifdef DEBUG
Tomas Mraz a483b3
-	printf("%-16s = %-16s (destruct %s reversed)\n", Reverse(mp), rawtext, r_destructors[i]);
Tomas Mraz a483b3
+	printf("%-16s = %-16s (destruct %s reversed)\n", Reverse(mp, revarea), rawtext, r_destructors[i]);
Tomas Mraz a483b3
 #endif
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	if (!strncmp(Reverse(mp), rawtext, len))
Tomas Mraz a483b3
+	if (!strncmp(Reverse(mp, revarea), rawtext, len))
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	    return (1);
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
@@ -473,7 +475,7 @@ GTry(rawtext, password)
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     for (i = 0; r_constructors[i]; i++)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
-	if (!(mp = Mangle(rawtext, r_constructors[i])))
Tomas Mraz a483b3
+	if (!(mp = Mangle(rawtext, r_constructors[i], area)))
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	    continue;
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
@@ -520,7 +522,7 @@ FascistGecosUser(char *password, const c
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     strncpy(tbuffer, gecos, STRINGSIZE);
Tomas Mraz a483b3
     tbuffer[STRINGSIZE-1] = '\0';
Tomas Mraz a483b3
-    strcpy(gbuffer, Lowercase(tbuffer));
Tomas Mraz a483b3
+    Lowercase(tbuffer, gbuffer);
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     wc = 0;
Tomas Mraz a483b3
     ptr = gbuffer;
Tomas Mraz a483b3
@@ -695,6 +697,7 @@ FascistLookUser(PWDICT *pwp, char *instr
Tomas Mraz a483b3
     char junk[STRINGSIZE];
Tomas Mraz a483b3
     char *password;
Tomas Mraz a483b3
     char rpassword[STRINGSIZE];
Tomas Mraz a483b3
+    char area[STRINGSIZE];
Tomas Mraz a483b3
     uint32_t notfound;
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     notfound = PW_WORDS(pwp);
Tomas Mraz a483b3
@@ -731,7 +734,7 @@ FascistLookUser(PWDICT *pwp, char *instr
Tomas Mraz a483b3
 	return _("it does not contain enough DIFFERENT characters");
Tomas Mraz a483b3
     }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-    strcpy(password, (char *)Lowercase(password));
Tomas Mraz a483b3
+    strcpy(password, (char *)Lowercase(password, area));
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     Trim(password);
Tomas Mraz a483b3
 
Tomas Mraz a483b3
@@ -787,7 +790,7 @@ FascistLookUser(PWDICT *pwp, char *instr
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
 	char *a;
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	if (!(a = Mangle(password, r_destructors[i])))
Tomas Mraz a483b3
+	if (!(a = Mangle(password, r_destructors[i], area)))
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	    continue;
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
@@ -802,13 +805,13 @@ FascistLookUser(PWDICT *pwp, char *instr
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
     }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-    strcpy(password, (char *)Reverse(password));
Tomas Mraz a483b3
+    strcpy(password, (char *)Reverse(password, area));
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     for (i = 0; r_destructors[i]; i++)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
 	char *a;
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	if (!(a = Mangle(password, r_destructors[i])))
Tomas Mraz a483b3
+	if (!(a = Mangle(password, r_destructors[i], area)))
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	    continue;
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
diff -up cracklib-2.9.0/lib/packer.h.in.reentrant cracklib-2.9.0/lib/packer.h.in
Tomas Mraz a483b3
--- cracklib-2.9.0/lib/packer.h.in.reentrant	2013-08-21 15:29:24.245641356 +0200
Tomas Mraz a483b3
+++ cracklib-2.9.0/lib/packer.h.in	2013-08-21 15:29:24.247641399 +0200
Tomas Mraz a483b3
@@ -86,7 +86,7 @@ extern int PWClose(PWDICT *pwp);
Tomas Mraz a483b3
 extern unsigned int FindPW(PWDICT *pwp, char *string);
Tomas Mraz a483b3
 extern int PutPW(PWDICT *pwp, char *string);
Tomas Mraz a483b3
 extern int PMatch(char *control, char *string);
Tomas Mraz a483b3
-extern char *Mangle(char *input, char *control);
Tomas Mraz a483b3
+extern char *Mangle(char *input, char *control, char *area);
Tomas Mraz a483b3
 extern char Chop(char *string);
Tomas Mraz a483b3
 extern char *Trim(char *string);
Tomas Mraz a483b3
 extern char *FascistLook(PWDICT *pwp, char *instring);
Tomas Mraz a483b3
diff -up cracklib-2.9.0/lib/packlib.c.reentrant cracklib-2.9.0/lib/packlib.c
Tomas Mraz a483b3
--- cracklib-2.9.0/lib/packlib.c.reentrant	2013-08-21 15:29:24.245641356 +0200
Tomas Mraz a483b3
+++ cracklib-2.9.0/lib/packlib.c	2013-08-21 15:29:24.247641399 +0200
Tomas Mraz a483b3
@@ -67,8 +67,8 @@ PWOpen(prefix, mode)
Tomas Mraz a483b3
     char *mode;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     int use64 = 0;
Tomas Mraz a483b3
-    static PWDICT pdesc;
Tomas Mraz a483b3
-    static PWDICT64 pdesc64;
Tomas Mraz a483b3
+    PWDICT *pdesc;
Tomas Mraz a483b3
+    PWDICT64 pdesc64;
Tomas Mraz a483b3
     char iname[STRINGSIZE];
Tomas Mraz a483b3
     char dname[STRINGSIZE];
Tomas Mraz a483b3
     char wname[STRINGSIZE];
Tomas Mraz a483b3
@@ -76,15 +76,13 @@ PWOpen(prefix, mode)
Tomas Mraz a483b3
     FILE *ifp;
Tomas Mraz a483b3
     FILE *wfp;
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-    if (pdesc.header.pih_magic == PIH_MAGIC)
Tomas Mraz a483b3
-    {
Tomas Mraz a483b3
-	fprintf(stderr, "%s: another dictionary already open\n", prefix);
Tomas Mraz a483b3
-	return ((PWDICT *) 0);
Tomas Mraz a483b3
-    }
Tomas Mraz a483b3
+    pdesc = malloc(sizeof(*pdesc));
Tomas Mraz a483b3
+    if (pdesc == NULL)
Tomas Mraz a483b3
+	return NULL;
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-    memset(&pdesc, '\0', sizeof(pdesc));
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
+    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
@@ -92,77 +90,80 @@ PWOpen(prefix, mode)
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     if (mode[0] == 'r')
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
-		pdesc.flags &= ~PFOR_USEZLIB;
Tomas Mraz a483b3
+		pdesc->flags &= ~PFOR_USEZLIB;
Tomas Mraz a483b3
 		/* first try the normal db file */
Tomas Mraz a483b3
-		if (!(pdesc.dfp = fopen(dname, mode)))
Tomas Mraz a483b3
+		if (!(pdesc->dfp = fopen(dname, mode)))
Tomas Mraz a483b3
 		{
Tomas Mraz a483b3
 #ifdef HAVE_ZLIB_H
Tomas Mraz a483b3
-			pdesc.flags |= PFOR_USEZLIB;
Tomas Mraz a483b3
+			pdesc->flags |= PFOR_USEZLIB;
Tomas Mraz a483b3
 			/* try extension .gz */
Tomas Mraz a483b3
 			snprintf(dname, STRINGSIZE, "%s.pwd.gz", prefix);
Tomas Mraz a483b3
-			if (!(pdesc.dfp = gzopen(dname, mode)))
Tomas Mraz a483b3
+			if (!(pdesc->dfp = gzopen(dname, mode)))
Tomas Mraz a483b3
 			{
Tomas Mraz a483b3
 				perror(dname);
Tomas Mraz a483b3
+				free(pdesc);
Tomas Mraz a483b3
 				return ((PWDICT *) 0);
Tomas Mraz a483b3
 			}
Tomas Mraz a483b3
 #else
Tomas Mraz a483b3
 		perror(dname);
Tomas Mraz a483b3
+		free(pdesc);
Tomas Mraz a483b3
 		return ((PWDICT *) 0);
Tomas Mraz a483b3
 #endif
Tomas Mraz a483b3
 		}
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
 	else
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
-		pdesc.flags &= ~PFOR_USEZLIB;
Tomas Mraz a483b3
+		pdesc->flags &= ~PFOR_USEZLIB;
Tomas Mraz a483b3
 		/* write mode: use fopen */
Tomas Mraz a483b3
-		if (!(pdesc.dfp = fopen(dname, mode)))
Tomas Mraz a483b3
+		if (!(pdesc->dfp = fopen(dname, mode)))
Tomas Mraz a483b3
 		{
Tomas Mraz a483b3
 			perror(dname);
Tomas Mraz a483b3
+			free(pdesc);
Tomas Mraz a483b3
 			return ((PWDICT *) 0);
Tomas Mraz a483b3
 		}
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-    if (!(pdesc.ifp = fopen(iname, mode)))
Tomas Mraz a483b3
+    if (!(pdesc->ifp = fopen(iname, mode)))
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
 #ifdef HAVE_ZLIB_H
Tomas Mraz a483b3
-		if(pdesc.flags & PFOR_USEZLIB)
Tomas Mraz a483b3
-			gzclose(pdesc.dfp);
Tomas Mraz a483b3
+		if(pdesc->flags & PFOR_USEZLIB)
Tomas Mraz a483b3
+			gzclose(pdesc->dfp);
Tomas Mraz a483b3
 		else
Tomas Mraz a483b3
 #endif
Tomas Mraz a483b3
-			fclose(pdesc.dfp);
Tomas Mraz a483b3
+			fclose(pdesc->dfp);
Tomas Mraz a483b3
 	perror(iname);
Tomas Mraz a483b3
+	free(pdesc);
Tomas Mraz a483b3
 	return ((PWDICT *) 0);
Tomas Mraz a483b3
     }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-    if ((pdesc.wfp = fopen(wname, mode)))
Tomas Mraz a483b3
+    if ((pdesc->wfp = fopen(wname, mode)))
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
-	pdesc.flags |= PFOR_USEHWMS;
Tomas Mraz a483b3
+	pdesc->flags |= PFOR_USEHWMS;
Tomas Mraz a483b3
     }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-    ifp = pdesc.ifp;
Tomas Mraz a483b3
-    dfp = pdesc.dfp;
Tomas Mraz a483b3
-    wfp = pdesc.wfp;
Tomas Mraz a483b3
+    ifp = pdesc->ifp;
Tomas Mraz a483b3
+    dfp = pdesc->dfp;
Tomas Mraz a483b3
+    wfp = pdesc->wfp;
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     if (mode[0] == 'w')
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
-	pdesc.flags |= PFOR_WRITE;
Tomas Mraz a483b3
-	pdesc.header.pih_magic = PIH_MAGIC;
Tomas Mraz a483b3
-	pdesc.header.pih_blocklen = NUMWORDS;
Tomas Mraz a483b3
-	pdesc.header.pih_numwords = 0;
Tomas Mraz a483b3
+	pdesc->flags |= PFOR_WRITE;
Tomas Mraz a483b3
+	pdesc->header.pih_magic = PIH_MAGIC;
Tomas Mraz a483b3
+	pdesc->header.pih_blocklen = NUMWORDS;
Tomas Mraz a483b3
+	pdesc->header.pih_numwords = 0;
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	fwrite((char *) &pdesc.header, sizeof(pdesc.header), 1, ifp);
Tomas Mraz a483b3
+	fwrite((char *) &pdesc->header, sizeof(pdesc->header), 1, ifp);
Tomas Mraz a483b3
     } else
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
-	pdesc.flags &= ~PFOR_WRITE;
Tomas Mraz a483b3
+	pdesc->flags &= ~PFOR_WRITE;
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	if (!fread((char *) &pdesc.header, sizeof(pdesc.header), 1, ifp))
Tomas Mraz a483b3
+	if (!fread((char *) &pdesc->header, sizeof(pdesc->header), 1, ifp))
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	    fprintf(stderr, "%s: error reading header\n", prefix);
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	    pdesc.header.pih_magic = 0;
Tomas Mraz a483b3
 	    fclose(ifp);
Tomas Mraz a483b3
 #ifdef HAVE_ZLIB_H
Tomas Mraz a483b3
-		if(pdesc.flags & PFOR_USEZLIB)
Tomas Mraz a483b3
+		if(pdesc->flags & PFOR_USEZLIB)
Tomas Mraz a483b3
 			gzclose(dfp);
Tomas Mraz a483b3
 		else
Tomas Mraz a483b3
 #endif
Tomas Mraz a483b3
@@ -171,21 +172,21 @@ PWOpen(prefix, mode)
Tomas Mraz a483b3
 	    {
Tomas Mraz a483b3
 		fclose(wfp);
Tomas Mraz a483b3
 	    }
Tomas Mraz a483b3
+	    free(pdesc);
Tomas Mraz a483b3
 	    return ((PWDICT *) 0);
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-        if ((pdesc.header.pih_magic == 0) || (pdesc.header.pih_numwords == 0))
Tomas Mraz a483b3
+        if ((pdesc->header.pih_magic == 0) || (pdesc->header.pih_numwords == 0))
Tomas Mraz a483b3
         {
Tomas Mraz a483b3
             /* uh-oh. either a broken "64-bit" file or a garbage file. */
Tomas Mraz a483b3
             rewind (ifp);
Tomas Mraz a483b3
             if (!fread((char *) &pdesc64.header, sizeof(pdesc64.header), 1, ifp))
Tomas Mraz a483b3
             {
Tomas Mraz a483b3
                 fprintf(stderr, "%s: error reading header\n", prefix);
Tomas Mraz a483b3
- 
Tomas Mraz a483b3
-                pdesc.header.pih_magic = 0;
Tomas Mraz a483b3
+
Tomas Mraz a483b3
                 fclose(ifp);
Tomas Mraz a483b3
 #ifdef HAVE_ZLIB_H
Tomas Mraz a483b3
-				if(pdesc.flags & PFOR_USEZLIB)
Tomas Mraz a483b3
+				if(pdesc->flags & PFOR_USEZLIB)
Tomas Mraz a483b3
 					gzclose(dfp);
Tomas Mraz a483b3
 				else
Tomas Mraz a483b3
 #endif
Tomas Mraz a483b3
@@ -194,17 +195,17 @@ PWOpen(prefix, mode)
Tomas Mraz a483b3
 		{
Tomas Mraz a483b3
 			fclose(wfp);
Tomas Mraz a483b3
 		}
Tomas Mraz a483b3
+		free(pdesc);
Tomas Mraz a483b3
                 return ((PWDICT *) 0);
Tomas Mraz a483b3
             }
Tomas Mraz a483b3
             if (pdesc64.header.pih_magic != PIH_MAGIC)
Tomas Mraz a483b3
             {
Tomas Mraz a483b3
                 /* nope, not "64-bit" after all */
Tomas Mraz a483b3
                 fprintf(stderr, "%s: error reading header\n", prefix);
Tomas Mraz a483b3
- 
Tomas Mraz a483b3
-                pdesc.header.pih_magic = 0;
Tomas Mraz a483b3
+
Tomas Mraz a483b3
                 fclose(ifp);
Tomas Mraz a483b3
 #ifdef HAVE_ZLIB_H
Tomas Mraz a483b3
-				if(pdesc.flags & PFOR_USEZLIB)
Tomas Mraz a483b3
+				if(pdesc->flags & PFOR_USEZLIB)
Tomas Mraz a483b3
 					gzclose(dfp);
Tomas Mraz a483b3
 				else
Tomas Mraz a483b3
 #endif
Tomas Mraz a483b3
@@ -214,23 +215,23 @@ PWOpen(prefix, mode)
Tomas Mraz a483b3
 		{
Tomas Mraz a483b3
 			fclose(wfp);
Tomas Mraz a483b3
 		}
Tomas Mraz a483b3
+		free(pdesc);
Tomas Mraz a483b3
                 return ((PWDICT *) 0);
Tomas Mraz a483b3
             }
Tomas Mraz a483b3
-            pdesc.header.pih_magic = pdesc64.header.pih_magic;
Tomas Mraz a483b3
-            pdesc.header.pih_numwords = pdesc64.header.pih_numwords;
Tomas Mraz a483b3
-            pdesc.header.pih_blocklen = pdesc64.header.pih_blocklen;
Tomas Mraz a483b3
-            pdesc.header.pih_pad = pdesc64.header.pih_pad;
Tomas Mraz a483b3
+            pdesc->header.pih_magic = pdesc64.header.pih_magic;
Tomas Mraz a483b3
+            pdesc->header.pih_numwords = pdesc64.header.pih_numwords;
Tomas Mraz a483b3
+            pdesc->header.pih_blocklen = pdesc64.header.pih_blocklen;
Tomas Mraz a483b3
+            pdesc->header.pih_pad = pdesc64.header.pih_pad;
Tomas Mraz a483b3
             use64 = 1;
Tomas Mraz a483b3
         }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	if (pdesc.header.pih_magic != PIH_MAGIC)
Tomas Mraz a483b3
+	if (pdesc->header.pih_magic != PIH_MAGIC)
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	    fprintf(stderr, "%s: magic mismatch\n", prefix);
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	    pdesc.header.pih_magic = 0;
Tomas Mraz a483b3
 	    fclose(ifp);
Tomas Mraz a483b3
 #ifdef HAVE_ZLIB_H
Tomas Mraz a483b3
-		if(pdesc.flags & PFOR_USEZLIB)
Tomas Mraz a483b3
+		if(pdesc->flags & PFOR_USEZLIB)
Tomas Mraz a483b3
 			gzclose(dfp);
Tomas Mraz a483b3
 		else
Tomas Mraz a483b3
 #endif
Tomas Mraz a483b3
@@ -240,17 +241,17 @@ PWOpen(prefix, mode)
Tomas Mraz a483b3
 	    {
Tomas Mraz a483b3
 		fclose(wfp);
Tomas Mraz a483b3
 	    }
Tomas Mraz a483b3
+	    free(pdesc);
Tomas Mraz a483b3
 	    return ((PWDICT *) 0);
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-        if (pdesc.header.pih_numwords < 1)
Tomas Mraz a483b3
+        if (pdesc->header.pih_numwords < 1)
Tomas Mraz a483b3
         {
Tomas Mraz a483b3
             fprintf(stderr, "%s: invalid word count\n", prefix);
Tomas Mraz a483b3
  
Tomas Mraz a483b3
-            pdesc.header.pih_magic = 0;
Tomas Mraz a483b3
             fclose(ifp);
Tomas Mraz a483b3
 #ifdef HAVE_ZLIB_H
Tomas Mraz a483b3
-			if(pdesc.flags & PFOR_USEZLIB)
Tomas Mraz a483b3
+			if(pdesc->flags & PFOR_USEZLIB)
Tomas Mraz a483b3
 				gzclose(dfp);
Tomas Mraz a483b3
 			else
Tomas Mraz a483b3
 #endif
Tomas Mraz a483b3
@@ -259,17 +260,17 @@ PWOpen(prefix, mode)
Tomas Mraz a483b3
 	    {
Tomas Mraz a483b3
 		fclose(wfp);
Tomas Mraz a483b3
 	    }
Tomas Mraz a483b3
+	    free(pdesc);
Tomas Mraz a483b3
             return ((PWDICT *) 0);
Tomas Mraz a483b3
         }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	if (pdesc.header.pih_blocklen != NUMWORDS)
Tomas Mraz a483b3
+	if (pdesc->header.pih_blocklen != NUMWORDS)
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	    fprintf(stderr, "%s: size mismatch\n", prefix);
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	    pdesc.header.pih_magic = 0;
Tomas Mraz a483b3
 	    fclose(ifp);
Tomas Mraz a483b3
 #ifdef HAVE_ZLIB_H
Tomas Mraz a483b3
-		if(pdesc.flags & PFOR_USEZLIB)
Tomas Mraz a483b3
+		if(pdesc->flags & PFOR_USEZLIB)
Tomas Mraz a483b3
 			gzclose(dfp);
Tomas Mraz a483b3
 		else
Tomas Mraz a483b3
 #endif
Tomas Mraz a483b3
@@ -278,10 +279,11 @@ PWOpen(prefix, mode)
Tomas Mraz a483b3
 	    {
Tomas Mraz a483b3
 		fclose(wfp);
Tomas Mraz a483b3
 	    }
Tomas Mraz a483b3
+	    free(pdesc);
Tomas Mraz a483b3
 	    return ((PWDICT *) 0);
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-	if (pdesc.flags & PFOR_USEHWMS)
Tomas Mraz a483b3
+	if (pdesc->flags & PFOR_USEHWMS)
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
             int i;
Tomas Mraz a483b3
 
Tomas Mraz a483b3
@@ -289,27 +291,27 @@ PWOpen(prefix, mode)
Tomas Mraz a483b3
             {
Tomas Mraz a483b3
                 if (fread(pdesc64.hwms, 1, sizeof(pdesc64.hwms), wfp) != sizeof(pdesc64.hwms))
Tomas Mraz a483b3
                 {
Tomas Mraz a483b3
-                    pdesc.flags &= ~PFOR_USEHWMS;
Tomas Mraz a483b3
+                    pdesc->flags &= ~PFOR_USEHWMS;
Tomas Mraz a483b3
                 }
Tomas Mraz a483b3
-                for (i = 0; i < sizeof(pdesc.hwms) / sizeof(pdesc.hwms[0]); i++)
Tomas Mraz a483b3
+                for (i = 0; i < sizeof(pdesc->hwms) / sizeof(pdesc->hwms[0]); i++)
Tomas Mraz a483b3
                 {
Tomas Mraz a483b3
-                    pdesc.hwms[i] = pdesc64.hwms[i];
Tomas Mraz a483b3
+                    pdesc->hwms[i] = pdesc64.hwms[i];
Tomas Mraz a483b3
                 }
Tomas Mraz a483b3
             } 
Tomas Mraz a483b3
-            else if (fread(pdesc.hwms, 1, sizeof(pdesc.hwms), wfp) != sizeof(pdesc.hwms))
Tomas Mraz a483b3
+            else if (fread(pdesc->hwms, 1, sizeof(pdesc->hwms), wfp) != sizeof(pdesc->hwms))
Tomas Mraz a483b3
 	    {
Tomas Mraz a483b3
-		pdesc.flags &= ~PFOR_USEHWMS;
Tomas Mraz a483b3
+		pdesc->flags &= ~PFOR_USEHWMS;
Tomas Mraz a483b3
 	    }
Tomas Mraz a483b3
 #if DEBUG
Tomas Mraz a483b3
             for (i=1; i<=0xff; i++)
Tomas Mraz a483b3
             {
Tomas Mraz a483b3
-                printf("hwm[%02x] = %d\n", i, pdesc.hwms[i]);
Tomas Mraz a483b3
+                printf("hwm[%02x] = %d\n", i, pdesc->hwms[i]);
Tomas Mraz a483b3
             }
Tomas Mraz a483b3
 #endif
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
     }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
-    return (&pdesc);
Tomas Mraz a483b3
+    return (pdesc);
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 int
Tomas Mraz a483b3
@@ -319,6 +321,7 @@ PWClose(pwp)
Tomas Mraz a483b3
     if (pwp->header.pih_magic != PIH_MAGIC)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
 	fprintf(stderr, "PWClose: close magic mismatch\n");
Tomas Mraz a483b3
+        /* we do not try to free memory that is probably corrupted */
Tomas Mraz a483b3
 	return (-1);
Tomas Mraz a483b3
     }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
@@ -330,12 +333,14 @@ PWClose(pwp)
Tomas Mraz a483b3
 	if (fseek(pwp->ifp, 0L, 0))
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	    fprintf(stderr, "index magic fseek failed\n");
Tomas Mraz a483b3
+	    free(pwp);
Tomas Mraz a483b3
 	    return (-1);
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 	if (!fwrite((char *) &pwp->header, sizeof(pwp->header), 1, pwp->ifp))
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	    fprintf(stderr, "index magic fwrite failed\n");
Tomas Mraz a483b3
+            free(pwp);
Tomas Mraz a483b3
 	    return (-1);
Tomas Mraz a483b3
 	}
Tomas Mraz a483b3
 
Tomas Mraz a483b3
@@ -369,6 +374,7 @@ PWClose(pwp)
Tomas Mraz a483b3
     }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     pwp->header.pih_magic = 0;
Tomas Mraz a483b3
+    free(pwp);
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     return (0);
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
diff -up cracklib-2.9.0/lib/rules.c.reentrant cracklib-2.9.0/lib/rules.c
Tomas Mraz a483b3
--- cracklib-2.9.0/lib/rules.c.reentrant	2013-06-01 16:47:13.000000000 +0200
Tomas Mraz a483b3
+++ cracklib-2.9.0/lib/rules.c	2013-08-21 15:29:24.247641399 +0200
Tomas Mraz a483b3
@@ -82,12 +82,12 @@ Suffix(myword, suffix)
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 char *
Tomas Mraz a483b3
-Reverse(str)			/* return a pointer to a reversal */
Tomas Mraz a483b3
+Reverse(str, area)			/* return a pointer to a reversal */
Tomas Mraz a483b3
     register char *str;
Tomas Mraz a483b3
+    char *area;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     register int i;
Tomas Mraz a483b3
     register int j;
Tomas Mraz a483b3
-    static char area[STRINGSIZE];
Tomas Mraz a483b3
     j = i = strlen(str);
Tomas Mraz a483b3
     while (*str)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
@@ -98,11 +98,11 @@ Reverse(str)			/* return a pointer to a
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 char *
Tomas Mraz a483b3
-Uppercase(str)			/* return a pointer to an uppercase */
Tomas Mraz a483b3
+Uppercase(str, area)			/* return a pointer to an uppercase */
Tomas Mraz a483b3
     register char *str;
Tomas Mraz a483b3
+    char *area;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     register char *ptr;
Tomas Mraz a483b3
-    static char area[STRINGSIZE];
Tomas Mraz a483b3
     ptr = area;
Tomas Mraz a483b3
     while (*str)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
@@ -115,11 +115,11 @@ Uppercase(str)			/* return a pointer to
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 char *
Tomas Mraz a483b3
-Lowercase(str)			/* return a pointer to an lowercase */
Tomas Mraz a483b3
+Lowercase(str, area)			/* return a pointer to an lowercase */
Tomas Mraz a483b3
     register char *str;
Tomas Mraz a483b3
+    char *area;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     register char *ptr;
Tomas Mraz a483b3
-    static char area[STRINGSIZE];
Tomas Mraz a483b3
     ptr = area;
Tomas Mraz a483b3
     while (*str)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
@@ -132,11 +132,11 @@ Lowercase(str)			/* return a pointer to
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 char *
Tomas Mraz a483b3
-Capitalise(str)			/* return a pointer to an capitalised */
Tomas Mraz a483b3
+Capitalise(str, area)			/* return a pointer to an capitalised */
Tomas Mraz a483b3
     register char *str;
Tomas Mraz a483b3
+    char *area;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     register char *ptr;
Tomas Mraz a483b3
-    static char area[STRINGSIZE];
Tomas Mraz a483b3
     ptr = area;
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     while (*str)
Tomas Mraz a483b3
@@ -151,11 +151,11 @@ Capitalise(str)			/* return a pointer to
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 char *
Tomas Mraz a483b3
-Pluralise(string)		/* returns a pointer to a plural */
Tomas Mraz a483b3
+Pluralise(string, area)		/* returns a pointer to a plural */
Tomas Mraz a483b3
     register char *string;
Tomas Mraz a483b3
+    char *area;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     register int length;
Tomas Mraz a483b3
-    static char area[STRINGSIZE];
Tomas Mraz a483b3
     length = strlen(string);
Tomas Mraz a483b3
     strcpy(area, string);
Tomas Mraz a483b3
 
Tomas Mraz a483b3
@@ -192,13 +192,13 @@ Pluralise(string)		/* returns a pointer
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 char *
Tomas Mraz a483b3
-Substitute(string, old, new)	/* returns pointer to a swapped about copy */
Tomas Mraz a483b3
+Substitute(string, old, new, area)	/* returns pointer to a swapped about copy */
Tomas Mraz a483b3
     register char *string;
Tomas Mraz a483b3
     register char old;
Tomas Mraz a483b3
     register char new;
Tomas Mraz a483b3
+    char *area;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     register char *ptr;
Tomas Mraz a483b3
-    static char area[STRINGSIZE];
Tomas Mraz a483b3
     ptr = area;
Tomas Mraz a483b3
     while (*string)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
@@ -210,12 +210,12 @@ Substitute(string, old, new)	/* returns
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 char *
Tomas Mraz a483b3
-Purge(string, target)		/* returns pointer to a purged copy */
Tomas Mraz a483b3
+Purge(string, target, area)		/* returns pointer to a purged copy */
Tomas Mraz a483b3
     register char *string;
Tomas Mraz a483b3
     register char target;
Tomas Mraz a483b3
+    char *area;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     register char *ptr;
Tomas Mraz a483b3
-    static char area[STRINGSIZE];
Tomas Mraz a483b3
     ptr = area;
Tomas Mraz a483b3
     while (*string)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
@@ -372,13 +372,13 @@ PolyStrchr(string, class)
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 char *
Tomas Mraz a483b3
-PolySubst(string, class, new)	/* returns pointer to a swapped about copy */
Tomas Mraz a483b3
+PolySubst(string, class, new, area)	/* returns pointer to a swapped about copy */
Tomas Mraz a483b3
     register char *string;
Tomas Mraz a483b3
     register char class;
Tomas Mraz a483b3
     register char new;
Tomas Mraz a483b3
+    char *area;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     register char *ptr;
Tomas Mraz a483b3
-    static char area[STRINGSIZE];
Tomas Mraz a483b3
     ptr = area;
Tomas Mraz a483b3
     while (*string)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
@@ -390,12 +390,12 @@ PolySubst(string, class, new)	/* returns
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 char *
Tomas Mraz a483b3
-PolyPurge(string, class)	/* returns pointer to a purged copy */
Tomas Mraz a483b3
+PolyPurge(string, class, area)	/* returns pointer to a purged copy */
Tomas Mraz a483b3
     register char *string;
Tomas Mraz a483b3
     register char class;
Tomas Mraz a483b3
+    char *area;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     register char *ptr;
Tomas Mraz a483b3
-    static char area[STRINGSIZE];
Tomas Mraz a483b3
     ptr = area;
Tomas Mraz a483b3
     while (*string)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
@@ -428,40 +428,41 @@ Char2Int(character)
Tomas Mraz a483b3
 }
Tomas Mraz a483b3
 
Tomas Mraz a483b3
 char *
Tomas Mraz a483b3
-Mangle(input, control)		/* returns a pointer to a controlled Mangle */
Tomas Mraz a483b3
+Mangle(input, control, area)		/* returns a pointer to a controlled Mangle */
Tomas Mraz a483b3
     char *input;
Tomas Mraz a483b3
     char *control;
Tomas Mraz a483b3
+    char *area;
Tomas Mraz a483b3
 {
Tomas Mraz a483b3
     int limit;
Tomas Mraz a483b3
     register char *ptr;
Tomas Mraz a483b3
-    static char area[STRINGSIZE];
Tomas Mraz a483b3
     char area2[STRINGSIZE];
Tomas Mraz a483b3
     area[0] = '\0';
Tomas Mraz a483b3
     strcpy(area, input);
Tomas Mraz a483b3
 
Tomas Mraz a483b3
     for (ptr = control; *ptr; ptr++)
Tomas Mraz a483b3
     {
Tomas Mraz a483b3
+	strcpy(area2, area);
Tomas Mraz a483b3
 	switch (*ptr)
Tomas Mraz a483b3
 	{
Tomas Mraz a483b3
 	case RULE_NOOP:
Tomas Mraz a483b3
 	    break;
Tomas Mraz a483b3
 	case RULE_REVERSE:
Tomas Mraz a483b3
-	    strcpy(area, Reverse(area));
Tomas Mraz a483b3
+	    Reverse(area2, area);
Tomas Mraz a483b3
 	    break;
Tomas Mraz a483b3
 	case RULE_UPPERCASE:
Tomas Mraz a483b3
-	    strcpy(area, Uppercase(area));
Tomas Mraz a483b3
+	    Uppercase(area2, area);
Tomas Mraz a483b3
 	    break;
Tomas Mraz a483b3
 	case RULE_LOWERCASE:
Tomas Mraz a483b3
-	    strcpy(area, Lowercase(area));
Tomas Mraz a483b3
+	    Lowercase(area2, area);
Tomas Mraz a483b3
 	    break;
Tomas Mraz a483b3
 	case RULE_CAPITALISE:
Tomas Mraz a483b3
-	    strcpy(area, Capitalise(area));
Tomas Mraz a483b3
+	    Capitalise(area2, area);
Tomas Mraz a483b3
 	    break;
Tomas Mraz a483b3
 	case RULE_PLURALISE:
Tomas Mraz a483b3
-	    strcpy(area, Pluralise(area));
Tomas Mraz a483b3
+	    Pluralise(area2, area);
Tomas Mraz a483b3
 	    break;
Tomas Mraz a483b3
 	case RULE_REFLECT:
Tomas Mraz a483b3
-	    strcat(area, Reverse(area));
Tomas Mraz a483b3
+	    strcat(area, Reverse(area, area2));
Tomas Mraz a483b3
 	    break;
Tomas Mraz a483b3
 	case RULE_DUPLICATE:
Tomas Mraz a483b3
 	    strcpy(area2, area);
Tomas Mraz a483b3
@@ -548,7 +549,6 @@ Mangle(input, control)		/* returns a poi
Tomas Mraz a483b3
 		    Debug(1, "Mangle: extract: weird argument in '%s'\n", control);
Tomas Mraz a483b3
 		    return ((char *) 0);
Tomas Mraz a483b3
 		}
Tomas Mraz a483b3
-		strcpy(area2, area);
Tomas Mraz a483b3
 		for (i = 0; length-- && area2[start + i]; i++)
Tomas Mraz a483b3
 		{
Tomas Mraz a483b3
 		    area[i] = area2[start + i];
Tomas Mraz a483b3
@@ -619,10 +619,10 @@ Mangle(input, control)		/* returns a poi
Tomas Mraz a483b3
 		return ((char *) 0);
Tomas Mraz a483b3
 	    } else if (ptr[1] != RULE_CLASS)
Tomas Mraz a483b3
 	    {
Tomas Mraz a483b3
-		strcpy(area, Purge(area, *(++ptr)));
Tomas Mraz a483b3
+		Purge(area2, *(++ptr), area);
Tomas Mraz a483b3
 	    } else
Tomas Mraz a483b3
 	    {
Tomas Mraz a483b3
-		strcpy(area, PolyPurge(area, ptr[2]));
Tomas Mraz a483b3
+		PolyPurge(area2, ptr[2], area);
Tomas Mraz a483b3
 		ptr += 2;
Tomas Mraz a483b3
 	    }
Tomas Mraz a483b3
 	    break;
Tomas Mraz a483b3
@@ -633,11 +633,11 @@ Mangle(input, control)		/* returns a poi
Tomas Mraz a483b3
 		return ((char *) 0);
Tomas Mraz a483b3
 	    } else if (ptr[1] != RULE_CLASS)
Tomas Mraz a483b3
 	    {
Tomas Mraz a483b3
-		strcpy(area, Substitute(area, ptr[1], ptr[2]));
Tomas Mraz a483b3
+		Substitute(area2, ptr[1], ptr[2], area);
Tomas Mraz a483b3
 		ptr += 2;
Tomas Mraz a483b3
 	    } else
Tomas Mraz a483b3
 	    {
Tomas Mraz a483b3
-		strcpy(area, PolySubst(area, ptr[2], ptr[3]));
Tomas Mraz a483b3
+		PolySubst(area2, ptr[2], ptr[3], area);
Tomas Mraz a483b3
 		ptr += 3;
Tomas Mraz a483b3
 	    }
Tomas Mraz a483b3
 	    break;