diff options
Diffstat (limited to 'archival')
-rw-r--r-- | archival/libarchive/decompress_uncompress.c | 30 |
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. */ |