aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-05-18 13:08:57 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-05-18 13:08:57 +0200
commit167cd709df06fb0f7aa346a32133d54ed3ae6c48 (patch)
tree5594aac275c132c15beecad47f3bf067578ac90f
parent16bda3bd1f8e486ed93f5182fc777be1e813bce7 (diff)
downloadbusybox-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.c70
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);