diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-05-18 13:08:57 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-05-18 13:08:57 +0200 |
commit | 167cd709df06fb0f7aa346a32133d54ed3ae6c48 (patch) | |
tree | 5594aac275c132c15beecad47f3bf067578ac90f | |
parent | 16bda3bd1f8e486ed93f5182fc777be1e813bce7 (diff) | |
download | busybox-167cd709df06fb0f7aa346a32133d54ed3ae6c48.tar.gz |
gzip: fix gzip with many files corrupting some files after first
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | archival/gzip.c | 70 |
1 files changed, 32 insertions, 38 deletions
diff --git a/archival/gzip.c b/archival/gzip.c index a8f8fa4a5..335846908 100644 --- a/archival/gzip.c +++ b/archival/gzip.c @@ -267,7 +267,7 @@ struct globals { #define DECLARE(type, array, size) \ type * array #define ALLOC(type, array, size) \ - array = xzalloc((size_t)(((size)+1L)/2) * 2*sizeof(type)); + array = xzalloc((size_t)(((size)+1L)/2) * 2*sizeof(type)) #define FREE(array) \ do { free(array); array = NULL; } while (0) @@ -389,19 +389,6 @@ static void put_32bit(ulg n) } /* =========================================================================== - * Clear input and output buffers - */ -static void clear_bufs(void) -{ - G1.outcnt = 0; -#ifdef DEBUG - G1.insize = 0; -#endif - G1.isize = 0; -} - - -/* =========================================================================== * Run a set of bytes through the crc shift register. If s is a NULL * pointer, then initialize the crc shift register contents instead. * Return the current crc in either case. @@ -2019,7 +2006,37 @@ IF_DESKTOP(long long) int pack_gzip(unpack_info_t *info UNUSED_PARAM) { struct stat s; - clear_bufs(); + /* Clear input and output buffers */ + G1.outcnt = 0; +#ifdef DEBUG + G1.insize = 0; +#endif + G1.isize = 0; + + /* Reinit G2.xxx */ + memset(&G2, 0, sizeof(G2)); + G2.l_desc.dyn_tree = G2.dyn_ltree; + G2.l_desc.static_tree = G2.static_ltree; + G2.l_desc.extra_bits = extra_lbits; + G2.l_desc.extra_base = LITERALS + 1; + G2.l_desc.elems = L_CODES; + G2.l_desc.max_length = MAX_BITS; + //G2.l_desc.max_code = 0; + G2.d_desc.dyn_tree = G2.dyn_dtree; + G2.d_desc.static_tree = G2.static_dtree; + G2.d_desc.extra_bits = extra_dbits; + //G2.d_desc.extra_base = 0; + G2.d_desc.elems = D_CODES; + G2.d_desc.max_length = MAX_BITS; + //G2.d_desc.max_code = 0; + G2.bl_desc.dyn_tree = G2.bl_tree; + //G2.bl_desc.static_tree = NULL; + G2.bl_desc.extra_bits = extra_blbits, + //G2.bl_desc.extra_base = 0; + G2.bl_desc.elems = BL_CODES; + G2.bl_desc.max_length = MAX_BL_BITS; + //G2.bl_desc.max_code = 0; + s.st_ctime = 0; fstat(STDIN_FILENO, &s); zip(s.st_ctime); @@ -2064,29 +2081,6 @@ int gzip_main(int argc UNUSED_PARAM, char **argv) SET_PTR_TO_GLOBALS(xzalloc(sizeof(struct globals) + sizeof(struct globals2)) + sizeof(struct globals)); barrier(); - G2.l_desc.dyn_tree = G2.dyn_ltree; - G2.l_desc.static_tree = G2.static_ltree; - G2.l_desc.extra_bits = extra_lbits; - G2.l_desc.extra_base = LITERALS + 1; - G2.l_desc.elems = L_CODES; - G2.l_desc.max_length = MAX_BITS; - //G2.l_desc.max_code = 0; - - G2.d_desc.dyn_tree = G2.dyn_dtree; - G2.d_desc.static_tree = G2.static_dtree; - G2.d_desc.extra_bits = extra_dbits; - //G2.d_desc.extra_base = 0; - G2.d_desc.elems = D_CODES; - G2.d_desc.max_length = MAX_BITS; - //G2.d_desc.max_code = 0; - - G2.bl_desc.dyn_tree = G2.bl_tree; - //G2.bl_desc.static_tree = NULL; - G2.bl_desc.extra_bits = extra_blbits, - //G2.bl_desc.extra_base = 0; - G2.bl_desc.elems = BL_CODES; - G2.bl_desc.max_length = MAX_BL_BITS; - //G2.bl_desc.max_code = 0; /* Allocate all global buffers (for DYN_ALLOC option) */ ALLOC(uch, G1.l_buf, INBUFSIZ); |