Commit 18e337dd authored by Mike Gabriel's avatar Mike Gabriel

Revert "Do proper input validation to fix for CVE-2011-2895."

This reverts commit 6acafc93.
parent 26cfe931
...@@ -99,7 +99,7 @@ static char_type magic_header[] = { "\037\235" }; /* 1F 9D */ ...@@ -99,7 +99,7 @@ static char_type magic_header[] = { "\037\235" }; /* 1F 9D */
#define FIRST 257 /* first free entry */ #define FIRST 257 /* first free entry */
#define CLEAR 256 /* table clear output code */ #define CLEAR 256 /* table clear output code */
#define STACK_SIZE 65300 #define STACK_SIZE 8192
typedef struct _compressedFILE { typedef struct _compressedFILE {
BufFilePtr file; BufFilePtr file;
...@@ -180,12 +180,14 @@ BufFilePushCompressed (BufFilePtr f) ...@@ -180,12 +180,14 @@ BufFilePushCompressed (BufFilePtr f)
file->tab_suffix[code] = (char_type) code; file->tab_suffix[code] = (char_type) code;
} }
file->free_ent = ((file->block_compress) ? FIRST : 256 ); file->free_ent = ((file->block_compress) ? FIRST : 256 );
file->oldcode = -1;
file->clear_flg = 0; file->clear_flg = 0;
file->offset = 0; file->offset = 0;
file->size = 0; file->size = 0;
file->stackp = file->de_stack; file->stackp = file->de_stack;
bzero(file->buf, BITS); bzero(file->buf, BITS);
file->finchar = file->oldcode = getcode (file);
if (file->oldcode != -1)
*file->stackp++ = file->finchar;
return BufFileCreate ((char *) file, return BufFileCreate ((char *) file,
BufCompressedFill, BufCompressedFill,
0, 0,
...@@ -230,6 +232,9 @@ BufCompressedFill (BufFilePtr f) ...@@ -230,6 +232,9 @@ BufCompressedFill (BufFilePtr f)
if (buf == bufend) if (buf == bufend)
break; break;
if (oldcode == -1)
break;
code = getcode (file); code = getcode (file);
if (code == -1) if (code == -1)
break; break;
...@@ -238,34 +243,26 @@ BufCompressedFill (BufFilePtr f) ...@@ -238,34 +243,26 @@ BufCompressedFill (BufFilePtr f)
for ( code = 255; code >= 0; code-- ) for ( code = 255; code >= 0; code-- )
file->tab_prefix[code] = 0; file->tab_prefix[code] = 0;
file->clear_flg = 1; file->clear_flg = 1;
file->free_ent = FIRST; file->free_ent = FIRST - 1;
oldcode = -1; if ( (code = getcode (file)) == -1 ) /* O, untimely death! */
continue; break;
} }
incode = code; incode = code;
/* /*
* Special case for KwKwK string. * Special case for KwKwK string.
*/ */
if ( code >= file->free_ent ) { if ( code >= file->free_ent ) {
if ( code > file->free_ent || oldcode == -1 ) {
/* Bad stream. */
return BUFFILEEOF;
}
*stackp++ = finchar; *stackp++ = finchar;
code = oldcode; code = oldcode;
} }
+ /*
+ * The above condition ensures that code < free_ent.
+ * The construction of tab_prefixof in turn guarantees that
+ * each iteration decreases code and therefore stack usage is
+ * bound by 1 << BITS - 256.
+ */
/* /*
* Generate output characters in reverse order * Generate output characters in reverse order
*/ */
while ( code >= 256 ) while ( code >= 256 )
{ {
if (stackp - de_stack >= STACK_SIZE - 1)
return BUFFILEEOF;
*stackp++ = file->tab_suffix[code]; *stackp++ = file->tab_suffix[code];
code = file->tab_prefix[code]; code = file->tab_prefix[code];
} }
...@@ -275,7 +272,7 @@ BufCompressedFill (BufFilePtr f) ...@@ -275,7 +272,7 @@ BufCompressedFill (BufFilePtr f)
/* /*
* Generate the new entry. * Generate the new entry.
*/ */
if ( (code=file->free_ent) < file->maxmaxcode && oldcode != -1) { if ( (code=file->free_ent) < file->maxmaxcode ) {
file->tab_prefix[code] = (unsigned short)oldcode; file->tab_prefix[code] = (unsigned short)oldcode;
file->tab_suffix[code] = finchar; file->tab_suffix[code] = finchar;
file->free_ent = code+1; file->free_ent = code+1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment