diff options
author | Ilya Leoshkevich <iii@linux.ibm.com> | 2020-09-24 00:08:56 +0200 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2020-09-24 16:37:39 -0700 |
commit | be0a534ba2b6e77da289de8da79e70843b1028cc (patch) | |
tree | 4f085665863ad31d8d624ad4077ef6f9b4e4dffd | |
parent | 80769f1ea3518cf7c328c5c52dcd7723d6fdfeda (diff) | |
download | gzip-be0a534ba2b6e77da289de8da79e70843b1028cc.tar.gz |
Fix DFLTCC segfault when compressing or decompressing two files
The value in total_in global variable from processing the first file
affected processing of the second file. Fix by making total_in local.
-rw-r--r-- | dfltcc.c | 14 |
1 files changed, 8 insertions, 6 deletions
@@ -242,10 +242,8 @@ dfltcc_gdht (struct dfltcc_param_v0 *param) dfltcc (DFLTCC_GDHT, param, NULL, NULL, &next_in, &avail_in, NULL); } -static off_t total_in; - static dfltcc_cc -dfltcc_cmpr_xpnd (struct dfltcc_param_v0 *param, int fn) +dfltcc_cmpr_xpnd (struct dfltcc_param_v0 *param, int fn, off_t *total_in) { uch *next_out = outbuf + outcnt; size_t avail_out = OUTBUFSIZ - outcnt; @@ -257,7 +255,7 @@ dfltcc_cmpr_xpnd (struct dfltcc_param_v0 *param, int fn) window); off_t consumed_in = next_in - (inbuf + inptr); inptr += consumed_in; - total_in += consumed_in; + *total_in += consumed_in; outcnt += ((OUTBUFSIZ - outcnt) - avail_out); return cc; } @@ -349,6 +347,7 @@ dfltcc_deflate (int pack_level) union aligned_dfltcc_param_v0 ctx_v0; struct dfltcc_param_v0 *param = init_param (&ctx_v0); + off_t total_in = 0; /* Compress ifd into ofd in a loop. */ while (true) @@ -398,7 +397,8 @@ dfltcc_deflate (int pack_level) } /* Compress inbuf into outbuf. */ - while (dfltcc_cmpr_xpnd (param, DFLTCC_CMPR) == DFLTCC_CC_AGAIN) + while (dfltcc_cmpr_xpnd (param, DFLTCC_CMPR, &total_in) + == DFLTCC_CC_AGAIN) ; /* Unmask the input data. */ @@ -427,6 +427,7 @@ dfltcc_inflate (void) union aligned_dfltcc_param_v0 ctx_v0; struct dfltcc_param_v0 *param = init_param (&ctx_v0); + off_t total_in = 0; /* Decompress ifd into ofd in a loop. */ while (true) @@ -446,7 +447,8 @@ dfltcc_inflate (void) /* Decompress inbuf into outbuf. */ dfltcc_cc cc; - while ((cc = dfltcc_cmpr_xpnd (param, DFLTCC_XPND)) == DFLTCC_CC_AGAIN) + while ((cc = dfltcc_cmpr_xpnd (param, DFLTCC_XPND, &total_in)) + == DFLTCC_CC_AGAIN) ; if (cc == DFLTCC_CC_OK) { |