gzip: fix gzip with many files corrupting some files after first
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
16bda3bd1f
commit
167cd709df
@ -267,7 +267,7 @@ struct globals {
|
|||||||
#define DECLARE(type, array, size) \
|
#define DECLARE(type, array, size) \
|
||||||
type * array
|
type * array
|
||||||
#define ALLOC(type, array, size) \
|
#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) \
|
#define FREE(array) \
|
||||||
do { free(array); array = NULL; } while (0)
|
do { free(array); array = NULL; } while (0)
|
||||||
|
|
||||||
@ -388,19 +388,6 @@ static void put_32bit(ulg n)
|
|||||||
put_16bit(n >> 16);
|
put_16bit(n >> 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* 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
|
* Run a set of bytes through the crc shift register. If s is a NULL
|
||||||
* pointer, then initialize the crc shift register contents instead.
|
* pointer, then initialize the crc shift register contents instead.
|
||||||
@ -2019,7 +2006,37 @@ IF_DESKTOP(long long) int pack_gzip(unpack_info_t *info UNUSED_PARAM)
|
|||||||
{
|
{
|
||||||
struct stat s;
|
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;
|
s.st_ctime = 0;
|
||||||
fstat(STDIN_FILENO, &s);
|
fstat(STDIN_FILENO, &s);
|
||||||
zip(s.st_ctime);
|
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))
|
SET_PTR_TO_GLOBALS(xzalloc(sizeof(struct globals) + sizeof(struct globals2))
|
||||||
+ sizeof(struct globals));
|
+ sizeof(struct globals));
|
||||||
barrier();
|
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) */
|
/* Allocate all global buffers (for DYN_ALLOC option) */
|
||||||
ALLOC(uch, G1.l_buf, INBUFSIZ);
|
ALLOC(uch, G1.l_buf, INBUFSIZ);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user