#define MAGIC5 19
#define INBUFSIZ BUFSIZ
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+
struct _UNLZHHandler
{
void *user_val;
if(i == i_special)
{
c = getbits(decoder, 2);
- while(--c >= 0)
+ while(--c >= 0 && i < NPT)
decoder->pt_len[i++] = 0;
}
}
else
{
i = 0;
+ n = MIN(n, NC);
while(i < n)
{
c = decoder->pt_table[decoder->bitbuf >> (16 - 8)];
else
c = decoder->left[c];
mask >>= 1;
- } while(c >= NT);
+ } while(c >= NT && (mask || c != decoder->left[c]));
}
fillbuf(decoder, decoder->pt_len[c]);
if(c <= 2)
else
j = decoder->left[j];
mask >>= 1;
- } while(j >= NC);
+ } while(j >= NC && (mask || j != decoder->left[j]));
fillbuf(decoder, decoder->c_len[j] - 12);
}
return j;
else
j = decoder->left[j];
mask >>= 1;
- } while(j >= np);
+ } while(j >= np && (mask || j != decoder->left[j]));
fillbuf(decoder, decoder->pt_len[j] - 8);
}
if(j != 0)
unsigned short start[17]; /* first code of bitlen */
unsigned short total;
unsigned int i;
- int j, k, l, m, n, available;
+ int j, k, l, m, n, available, tablelimit;
unsigned short *p;
+ tablelimit = 1 << tablebits;
available = nchar;
/* initialize */
/* cnttable */
for(i = 0; i < nchar; i++)
+ {
+ if(bitlen[i] > 16)
+ {
+ fprintf(stderr, "Decode: Bad table (4)\n");
+ return 1;
+ }
cnttable[bitlen[i]]++;
+ }
/* calculate first code */
total = 0;
/* initialize */
j = start[tablebits + 1] >> m;
- k = 1 << tablebits;
if(j != 0)
+ {
+ k = MIN(1 << tablebits, tablelimit);
for(i = j; i < k; i++)
table[i] = 0;
+ }
/* create table and tree */
for(j = 0; j < nchar; j++)
if(k <= tablebits)
{
/* code in table */
+ l = MIN(l, tablelimit);
for(i = start[k]; i < l; i++)
table[i] = j;
}
else
{
/* code not in table */
- p = &table[(i = start[k]) >> m];
+ i = start[k];
+ if ((i >> m) >= tablelimit)
+ {
+ fprintf(stderr, "Decode: Bad table (6)\n");
+ return 1;
+ }
+ p = &table[i >> m];
i <<= tablebits;
n = k - tablebits;
/* make tree (n length) */