Merge pull request #1469 from val-ms/CLAM-2745-zlib-zip64-undefined-behavior

Fix possible undefined behavior in inflate64 module
pull/1476/head
Val S. 2 months ago committed by GitHub
commit 1e879873cc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 18
      libclamav/inflate64.c

@ -857,7 +857,7 @@ unsigned short FAR *work;
code FAR *next; /* next available space in table */
const unsigned short FAR *base; /* base value table to use */
const unsigned short FAR *extra; /* extra bits table to use */
int end; /* use base and extra for symbol > end */
unsigned match; /* use base and extra for symbol >= match */
unsigned short count[MAXBITS+1]; /* number of codes of each length */
unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
static const unsigned short lbase[31] = { /* Length codes 257..285 base */
@ -987,19 +987,17 @@ unsigned short FAR *work;
switch (type) {
case CODES:
base = extra = work; /* dummy value--not used */
end = 19;
match = 20;
break;
case LENS:
base = lbase;
base -= 257;
extra = lext;
extra -= 257;
end = 256;
match = 257;
break;
default: /* DISTS */
base = dbase;
extra = dext;
end = -1;
match = 0;
}
/* initialize state for loop */
@ -1021,13 +1019,13 @@ unsigned short FAR *work;
for (;;) {
/* create table entry */
this.bits = (unsigned char)(len - drop);
if ((int)(work[sym]) < end) {
if (work[sym] + 1U < match) {
this.op = (unsigned char)0;
this.val = work[sym];
}
else if ((int)(work[sym]) > end) {
this.op = (unsigned char)(extra[work[sym]]);
this.val = base[work[sym]];
else if (work[sym] >= match) {
this.op = (unsigned char)(extra[work[sym] - match]);
this.val = base[work[sym] - match];
}
else {
this.op = (unsigned char)(32 + 64); /* end of block */

Loading…
Cancel
Save