Bring in fix from gzip 1.3.3 to avoid crashes when processing certain
authorDavid Rhodus <drhodus@dragonflybsd.org>
Tue, 14 Sep 2004 00:03:32 +0000 (00:03 +0000)
committerDavid Rhodus <drhodus@dragonflybsd.org>
Tue, 14 Sep 2004 00:03:32 +0000 (00:03 +0000)
corrupt input files:

1999-06-25  Paul Eggert  <eggert@twinsun.com>

        * inflate.c (huft_build):
        Set n to length of v, to detect improper tables.
        Don't accidentally grow j past z.

Merged from fbsd.

gnu/usr.bin/gzip/inflate.c

index 094ebf7..e342d82 100644 (file)
@@ -2,7 +2,7 @@
  * version c10p1, 10 January 1993
  *
  * $FreeBSD: src/gnu/usr.bin/gzip/inflate.c,v 1.8 1999/08/27 23:35:51 peter Exp $
- * $DragonFly: src/gnu/usr.bin/gzip/Attic/inflate.c,v 1.2 2003/06/17 04:25:46 dillon Exp $
+ * $DragonFly: src/gnu/usr.bin/gzip/Attic/inflate.c,v 1.3 2004/09/14 00:03:32 drhodus Exp $
  */
 
 /* You can do whatever you like with this source file, though I would
@@ -360,6 +360,7 @@ int *m;                 /* maximum lookup bits, returns actual */
     if ((j = *p++) != 0)
       v[x[j]++] = i;
   } while (++i < n);
+  n = x[g];
 
 
   /* Generate the Huffman codes and for each, make the table entries */
@@ -390,12 +391,13 @@ int *m;                 /* maximum lookup bits, returns actual */
         {                       /* too few codes for k-w bit table */
           f -= a + 1;           /* deduct codes from patterns left */
           xp = c + k;
-          while (++j < z)       /* try smaller tables up to z bits */
-          {
-            if ((f <<= 1) <= *++xp)
-              break;            /* enough codes to use up j bits */
-            f -= *xp;           /* else deduct codes from patterns */
-          }
+         if (j < z)
+           while (++j < z)       /* try smaller tables up to z bits */
+           {
+             if ((f <<= 1) <= *++xp)
+               break;            /* enough codes to use up j bits */
+             f -= *xp;           /* else deduct codes from patterns */
+           }
         }
         z = 1 << j;             /* table entries for j-bit table */