aboutsummaryrefslogtreecommitdiff
path: root/archival
diff options
context:
space:
mode:
Diffstat (limited to 'archival')
-rw-r--r--archival/libarchive/decompress_uncompress.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/archival/libarchive/decompress_uncompress.c b/archival/libarchive/decompress_uncompress.c
index e9bbfb9bd..3826a65ea 100644
--- a/archival/libarchive/decompress_uncompress.c
+++ b/archival/libarchive/decompress_uncompress.c
@@ -78,7 +78,6 @@ unpack_Z_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
78 IF_DESKTOP(long long total_written = 0;) 78 IF_DESKTOP(long long total_written = 0;)
79 IF_DESKTOP(long long) int retval = -1; 79 IF_DESKTOP(long long) int retval = -1;
80 unsigned char *stackp; 80 unsigned char *stackp;
81 long code;
82 int finchar; 81 int finchar;
83 long oldcode; 82 long oldcode;
84 long incode; 83 long incode;
@@ -143,8 +142,10 @@ unpack_Z_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
143 /* As above, initialize the first 256 entries in the table. */ 142 /* As above, initialize the first 256 entries in the table. */
144 /*clear_tab_prefixof(); - done by xzalloc */ 143 /*clear_tab_prefixof(); - done by xzalloc */
145 144
146 for (code = 255; code >= 0; --code) { 145 {
147 tab_suffixof(code) = (unsigned char) code; 146 int i;
147 for (i = 255; i >= 0; --i)
148 tab_suffixof(i) = (unsigned char) i;
148 } 149 }
149 150
150 do { 151 do {
@@ -175,6 +176,8 @@ unpack_Z_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
175 (insize << 3) - (n_bits - 1)); 176 (insize << 3) - (n_bits - 1));
176 177
177 while (inbits > posbits) { 178 while (inbits > posbits) {
179 long code;
180
178 if (free_ent > maxcode) { 181 if (free_ent > maxcode) {
179 posbits = 182 posbits =
180 ((posbits - 1) + 183 ((posbits - 1) +
@@ -191,13 +194,12 @@ unpack_Z_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
191 } 194 }
192 { 195 {
193 unsigned char *p = &inbuf[posbits >> 3]; 196 unsigned char *p = &inbuf[posbits >> 3];
194 197 code = ((p[0]
195 code = ((((long) (p[0])) | ((long) (p[1]) << 8) | 198 | ((long) (p[1]) << 8)
196 ((long) (p[2]) << 16)) >> (posbits & 0x7)) & bitmask; 199 | ((long) (p[2]) << 16)) >> (posbits & 0x7)) & bitmask;
197 } 200 }
198 posbits += n_bits; 201 posbits += n_bits;
199 202
200
201 if (oldcode == -1) { 203 if (oldcode == -1) {
202 if (code >= 256) 204 if (code >= 256)
203 bb_error_msg_and_die("corrupted data"); /* %ld", code); */ 205 bb_error_msg_and_die("corrupted data"); /* %ld", code); */
@@ -226,15 +228,16 @@ unpack_Z_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
226 /* Special case for KwKwK string. */ 228 /* Special case for KwKwK string. */
227 if (code >= free_ent) { 229 if (code >= free_ent) {
228 if (code > free_ent) { 230 if (code > free_ent) {
231/*
229 unsigned char *p; 232 unsigned char *p;
230 233
231 posbits -= n_bits; 234 posbits -= n_bits;
232 p = &inbuf[posbits >> 3]; 235 p = &inbuf[posbits >> 3];
233
234 bb_error_msg 236 bb_error_msg
235 ("insize:%d posbits:%d inbuf:%02X %02X %02X %02X %02X (%d)", 237 ("insize:%d posbits:%d inbuf:%02X %02X %02X %02X %02X (%d)",
236 insize, posbits, p[-1], p[0], p[1], p[2], p[3], 238 insize, posbits, p[-1], p[0], p[1], p[2], p[3],
237 (posbits & 07)); 239 (posbits & 07));
240*/
238 bb_error_msg("corrupted data"); 241 bb_error_msg("corrupted data");
239 goto err; 242 goto err;
240 } 243 }
@@ -244,7 +247,7 @@ unpack_Z_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
244 } 247 }
245 248
246 /* Generate output characters in reverse order */ 249 /* Generate output characters in reverse order */
247 while ((long) code >= (long) 256) { 250 while (code >= 256) {
248 if (stackp <= &htabof(0)) 251 if (stackp <= &htabof(0))
249 bb_error_msg_and_die("corrupted data"); 252 bb_error_msg_and_die("corrupted data");
250 *--stackp = tab_suffixof(code); 253 *--stackp = tab_suffixof(code);
@@ -285,11 +288,10 @@ unpack_Z_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
285 } 288 }
286 289
287 /* Generate the new entry. */ 290 /* Generate the new entry. */
288 code = free_ent; 291 if (free_ent < maxmaxcode) {
289 if (code < maxmaxcode) { 292 tab_prefixof(free_ent) = (unsigned short) oldcode;
290 tab_prefixof(code) = (unsigned short) oldcode; 293 tab_suffixof(free_ent) = (unsigned char) finchar;
291 tab_suffixof(code) = (unsigned char) finchar; 294 free_ent++;
292 free_ent = code + 1;
293 } 295 }
294 296
295 /* Remember previous code. */ 297 /* Remember previous code. */