error handling and prevent gunzip from hanging.
unsigned ml, md; /* masks for bl and bd bits */
register unsigned long b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
+ register int input_char;
/* make local copies of globals */
b = bb; /* initialize bit buffer */
md = mask_bits[bd];
for (;;) { /* do until end of block */
while (k < (unsigned) bl) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
if ((e = (t = tl + ((unsigned) b & ml))->e) > 16)
k -= t->b;
e -= 16;
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
} while ((e =
/* get length of block to copy */
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
n = t->v.n + ((unsigned) b & mask_bits[e]);
/* decode distance of block to copy */
while (k < (unsigned) bd) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
k -= t->b;
e -= 16;
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
} while ((e =
b >>= t->b;
k -= t->b;
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
d = w - t->v.n - ((unsigned) b & mask_bits[e]);
unsigned t; /* block type */
register unsigned long b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
+ int input_char;
/* make local bit buffer */
b = bb;
/* read in last block bit */
while (k < 1) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
*e = (int) b & 1;
/* read in block type */
while (k < 2) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
t = (unsigned) b & 3;
/* get the length and its complement */
while (k_stored < 16) {
- b_stored |= ((unsigned long) fgetc(in_file)) << k_stored;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_stored |= ((unsigned long)input_char) << k_stored;
k_stored += 8;
}
n = ((unsigned) b_stored & 0xffff);
b_stored >>= 16;
k_stored -= 16;
while (k_stored < 16) {
- b_stored |= ((unsigned long) fgetc(in_file)) << k_stored;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_stored |= ((unsigned long)input_char) << k_stored;
k_stored += 8;
}
if (n != (unsigned) ((~b_stored) & 0xffff)) {
/* read and output the compressed data */
while (n--) {
while (k_stored < 8) {
- b_stored |= ((unsigned long) fgetc(in_file)) << k_stored;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_stored |= ((unsigned long)input_char) << k_stored;
k_stored += 8;
}
window[w++] = (unsigned char) b_stored;
/* read in table lengths */
while (k_dynamic < 5) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
nl = 257 + ((unsigned) b_dynamic & 0x1f); /* number of literal/length codes */
b_dynamic >>= 5;
k_dynamic -= 5;
while (k_dynamic < 5) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
nd = 1 + ((unsigned) b_dynamic & 0x1f); /* number of distance codes */
b_dynamic >>= 5;
k_dynamic -= 5;
while (k_dynamic < 4) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
nb = 4 + ((unsigned) b_dynamic & 0xf); /* number of bit length codes */
/* read in bit-length-code lengths */
for (j = 0; j < nb; j++) {
while (k_dynamic < 3) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
ll[border[j]] = (unsigned) b_dynamic & 7;
i = l = 0;
while ((unsigned) i < n) {
while (k_dynamic < (unsigned) bl) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = (td = tl + ((unsigned) b_dynamic & m))->b;
ll[i++] = l = j; /* save last length in l */
} else if (j == 16) { /* repeat last length 3 to 6 times */
while (k_dynamic < 2) {
- b_dynamic |=
- ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = 3 + ((unsigned) b_dynamic & 3);
}
} else if (j == 17) { /* 3 to 10 zero length codes */
while (k_dynamic < 3) {
- b_dynamic |=
- ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = 3 + ((unsigned) b_dynamic & 7);
l = 0;
} else { /* j == 18: 11 to 138 zero length codes */
while (k_dynamic < 7) {
- b_dynamic |=
- ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = 11 + ((unsigned) b_dynamic & 0x7f);
}
/* Check the compression method */
- if (fgetc(l_in_file) != 8) {
+ if (fgetc(l_in_file) != 8) /* also catches EOF */ {
error_msg("Unknown compression method");
return (-1);
}
/* bit 2 set: extra field present */
const unsigned short extra =
fgetc(l_in_file) + (fgetc(l_in_file) << 8);
-
+ if (feof(in_file)) return 1;
for (i = 0; i < extra; i++) {
fgetc(l_in_file);
}
/* Discard original name if any */
if (flags & 0x08) {
/* bit 3 set: original file name present */
- while (fgetc(l_in_file) != 0); /* null */
+ while (fgetc(l_in_file) != 0 && !feof(l_in_file)); /* null */
}
/* Discard file comment if any */
if (flags & 0x10) {
/* bit 4 set: file comment present */
- while (fgetc(l_in_file) != 0); /* null */
+ while (fgetc(l_in_file) != 0 && !feof(l_in_file)); /* null */
}
/* Decompress */
unsigned ml, md; /* masks for bl and bd bits */
register unsigned long b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
+ register int input_char;
/* make local copies of globals */
b = bb; /* initialize bit buffer */
md = mask_bits[bd];
for (;;) { /* do until end of block */
while (k < (unsigned) bl) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
if ((e = (t = tl + ((unsigned) b & ml))->e) > 16)
k -= t->b;
e -= 16;
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
} while ((e =
/* get length of block to copy */
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
n = t->v.n + ((unsigned) b & mask_bits[e]);
/* decode distance of block to copy */
while (k < (unsigned) bd) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
k -= t->b;
e -= 16;
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
} while ((e =
b >>= t->b;
k -= t->b;
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
d = w - t->v.n - ((unsigned) b & mask_bits[e]);
unsigned t; /* block type */
register unsigned long b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
+ int input_char;
/* make local bit buffer */
b = bb;
/* read in last block bit */
while (k < 1) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
*e = (int) b & 1;
/* read in block type */
while (k < 2) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
t = (unsigned) b & 3;
/* get the length and its complement */
while (k_stored < 16) {
- b_stored |= ((unsigned long) fgetc(in_file)) << k_stored;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_stored |= ((unsigned long)input_char) << k_stored;
k_stored += 8;
}
n = ((unsigned) b_stored & 0xffff);
b_stored >>= 16;
k_stored -= 16;
while (k_stored < 16) {
- b_stored |= ((unsigned long) fgetc(in_file)) << k_stored;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_stored |= ((unsigned long)input_char) << k_stored;
k_stored += 8;
}
if (n != (unsigned) ((~b_stored) & 0xffff)) {
/* read and output the compressed data */
while (n--) {
while (k_stored < 8) {
- b_stored |= ((unsigned long) fgetc(in_file)) << k_stored;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_stored |= ((unsigned long)input_char) << k_stored;
k_stored += 8;
}
window[w++] = (unsigned char) b_stored;
/* read in table lengths */
while (k_dynamic < 5) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
nl = 257 + ((unsigned) b_dynamic & 0x1f); /* number of literal/length codes */
b_dynamic >>= 5;
k_dynamic -= 5;
while (k_dynamic < 5) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
nd = 1 + ((unsigned) b_dynamic & 0x1f); /* number of distance codes */
b_dynamic >>= 5;
k_dynamic -= 5;
while (k_dynamic < 4) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
nb = 4 + ((unsigned) b_dynamic & 0xf); /* number of bit length codes */
/* read in bit-length-code lengths */
for (j = 0; j < nb; j++) {
while (k_dynamic < 3) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
ll[border[j]] = (unsigned) b_dynamic & 7;
i = l = 0;
while ((unsigned) i < n) {
while (k_dynamic < (unsigned) bl) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = (td = tl + ((unsigned) b_dynamic & m))->b;
ll[i++] = l = j; /* save last length in l */
} else if (j == 16) { /* repeat last length 3 to 6 times */
while (k_dynamic < 2) {
- b_dynamic |=
- ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = 3 + ((unsigned) b_dynamic & 3);
}
} else if (j == 17) { /* 3 to 10 zero length codes */
while (k_dynamic < 3) {
- b_dynamic |=
- ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = 3 + ((unsigned) b_dynamic & 7);
l = 0;
} else { /* j == 18: 11 to 138 zero length codes */
while (k_dynamic < 7) {
- b_dynamic |=
- ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = 11 + ((unsigned) b_dynamic & 0x7f);
}
/* Check the compression method */
- if (fgetc(l_in_file) != 8) {
+ if (fgetc(l_in_file) != 8) /* also catches EOF */ {
error_msg("Unknown compression method");
return (-1);
}
/* bit 2 set: extra field present */
const unsigned short extra =
fgetc(l_in_file) + (fgetc(l_in_file) << 8);
-
+ if (feof(in_file)) return 1;
for (i = 0; i < extra; i++) {
fgetc(l_in_file);
}
/* Discard original name if any */
if (flags & 0x08) {
/* bit 3 set: original file name present */
- while (fgetc(l_in_file) != 0); /* null */
+ while (fgetc(l_in_file) != 0 && !feof(l_in_file)); /* null */
}
/* Discard file comment if any */
if (flags & 0x10) {
/* bit 4 set: file comment present */
- while (fgetc(l_in_file) != 0); /* null */
+ while (fgetc(l_in_file) != 0 && !feof(l_in_file)); /* null */
}
/* Decompress */
unsigned ml, md; /* masks for bl and bd bits */
register unsigned long b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
+ register int input_char;
/* make local copies of globals */
b = bb; /* initialize bit buffer */
md = mask_bits[bd];
for (;;) { /* do until end of block */
while (k < (unsigned) bl) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
if ((e = (t = tl + ((unsigned) b & ml))->e) > 16)
k -= t->b;
e -= 16;
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
} while ((e =
/* get length of block to copy */
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
n = t->v.n + ((unsigned) b & mask_bits[e]);
/* decode distance of block to copy */
while (k < (unsigned) bd) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
k -= t->b;
e -= 16;
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
} while ((e =
b >>= t->b;
k -= t->b;
while (k < e) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
d = w - t->v.n - ((unsigned) b & mask_bits[e]);
unsigned t; /* block type */
register unsigned long b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
+ int input_char;
/* make local bit buffer */
b = bb;
/* read in last block bit */
while (k < 1) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
*e = (int) b & 1;
/* read in block type */
while (k < 2) {
- b |= ((unsigned long) fgetc(in_file)) << k;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b |= ((unsigned long)input_char) << k;
k += 8;
}
t = (unsigned) b & 3;
/* get the length and its complement */
while (k_stored < 16) {
- b_stored |= ((unsigned long) fgetc(in_file)) << k_stored;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_stored |= ((unsigned long)input_char) << k_stored;
k_stored += 8;
}
n = ((unsigned) b_stored & 0xffff);
b_stored >>= 16;
k_stored -= 16;
while (k_stored < 16) {
- b_stored |= ((unsigned long) fgetc(in_file)) << k_stored;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_stored |= ((unsigned long)input_char) << k_stored;
k_stored += 8;
}
if (n != (unsigned) ((~b_stored) & 0xffff)) {
/* read and output the compressed data */
while (n--) {
while (k_stored < 8) {
- b_stored |= ((unsigned long) fgetc(in_file)) << k_stored;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_stored |= ((unsigned long)input_char) << k_stored;
k_stored += 8;
}
window[w++] = (unsigned char) b_stored;
/* read in table lengths */
while (k_dynamic < 5) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
nl = 257 + ((unsigned) b_dynamic & 0x1f); /* number of literal/length codes */
b_dynamic >>= 5;
k_dynamic -= 5;
while (k_dynamic < 5) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
nd = 1 + ((unsigned) b_dynamic & 0x1f); /* number of distance codes */
b_dynamic >>= 5;
k_dynamic -= 5;
while (k_dynamic < 4) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
nb = 4 + ((unsigned) b_dynamic & 0xf); /* number of bit length codes */
/* read in bit-length-code lengths */
for (j = 0; j < nb; j++) {
while (k_dynamic < 3) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
ll[border[j]] = (unsigned) b_dynamic & 7;
i = l = 0;
while ((unsigned) i < n) {
while (k_dynamic < (unsigned) bl) {
- b_dynamic |= ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = (td = tl + ((unsigned) b_dynamic & m))->b;
ll[i++] = l = j; /* save last length in l */
} else if (j == 16) { /* repeat last length 3 to 6 times */
while (k_dynamic < 2) {
- b_dynamic |=
- ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = 3 + ((unsigned) b_dynamic & 3);
}
} else if (j == 17) { /* 3 to 10 zero length codes */
while (k_dynamic < 3) {
- b_dynamic |=
- ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = 3 + ((unsigned) b_dynamic & 7);
l = 0;
} else { /* j == 18: 11 to 138 zero length codes */
while (k_dynamic < 7) {
- b_dynamic |=
- ((unsigned long) fgetc(in_file)) << k_dynamic;
+ input_char = fgetc(in_file);
+ if (input_char == EOF) return 1;
+ b_dynamic |= ((unsigned long)input_char) << k_dynamic;
k_dynamic += 8;
}
j = 11 + ((unsigned) b_dynamic & 0x7f);
}
/* Check the compression method */
- if (fgetc(l_in_file) != 8) {
+ if (fgetc(l_in_file) != 8) /* also catches EOF */ {
error_msg("Unknown compression method");
return (-1);
}
/* bit 2 set: extra field present */
const unsigned short extra =
fgetc(l_in_file) + (fgetc(l_in_file) << 8);
-
+ if (feof(in_file)) return 1;
for (i = 0; i < extra; i++) {
fgetc(l_in_file);
}
/* Discard original name if any */
if (flags & 0x08) {
/* bit 3 set: original file name present */
- while (fgetc(l_in_file) != 0); /* null */
+ while (fgetc(l_in_file) != 0 && !feof(l_in_file)); /* null */
}
/* Discard file comment if any */
if (flags & 0x10) {
/* bit 4 set: file comment present */
- while (fgetc(l_in_file) != 0); /* null */
+ while (fgetc(l_in_file) != 0 && !feof(l_in_file)); /* null */
}
/* Decompress */