aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archival/libarchive/decompress_unlzma.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/archival/libarchive/decompress_unlzma.c b/archival/libarchive/decompress_unlzma.c
index 90a428583..a9040877e 100644
--- a/archival/libarchive/decompress_unlzma.c
+++ b/archival/libarchive/decompress_unlzma.c
@@ -432,6 +432,21 @@ unpack_lzma_stream(transformer_state_t *xstate)
432 } 432 }
433 433
434 len += LZMA_MATCH_MIN_LEN; 434 len += LZMA_MATCH_MIN_LEN;
435 /*
436 * LZMA SDK has this optimized:
437 * it precalculates size and copies many bytes
438 * in a loop with simpler checks, a-la:
439 * do
440 * *(dest) = *(dest + ofs);
441 * while (++dest != lim);
442 * and
443 * do {
444 * buffer[buffer_pos++] = buffer[pos];
445 * if (++pos == header.dict_size)
446 * pos = 0;
447 * } while (--cur_len != 0);
448 * Our code is slower (more checks per byte copy):
449 */
435 IF_NOT_FEATURE_LZMA_FAST(string:) 450 IF_NOT_FEATURE_LZMA_FAST(string:)
436 do { 451 do {
437 uint32_t pos = buffer_pos - rep0; 452 uint32_t pos = buffer_pos - rep0;
@@ -451,6 +466,9 @@ unpack_lzma_stream(transformer_state_t *xstate)
451 } while (len != 0 && buffer_pos < header.dst_size); 466 } while (len != 0 && buffer_pos < header.dst_size);
452 /* FIXME: ...........^^^^^ 467 /* FIXME: ...........^^^^^
453 * shouldn't it be "global_pos + buffer_pos < header.dst_size"? 468 * shouldn't it be "global_pos + buffer_pos < header.dst_size"?
469 * It probably should, but it is a "do we accidentally
470 * unpack more bytes than expected?" check - which
471 * never happens for well-formed compression data...
454 */ 472 */
455 } 473 }
456 } 474 }