diff options
Diffstat (limited to 'xdelta3')
-rw-r--r-- | xdelta3/xdelta3-lzma.h | 45 | ||||
-rw-r--r-- | xdelta3/xdelta3-second.h | 2 | ||||
-rw-r--r-- | xdelta3/xdelta3-test.h | 34 |
3 files changed, 56 insertions, 25 deletions
diff --git a/xdelta3/xdelta3-lzma.h b/xdelta3/xdelta3-lzma.h index aa48e84..ef81bb0 100644 --- a/xdelta3/xdelta3-lzma.h +++ b/xdelta3/xdelta3-lzma.h | |||
@@ -28,6 +28,8 @@ typedef struct _xd3_lzma_stream xd3_lzma_stream; | |||
28 | 28 | ||
29 | struct _xd3_lzma_stream { | 29 | struct _xd3_lzma_stream { |
30 | lzma_stream lzma; | 30 | lzma_stream lzma; |
31 | lzma_options_lzma options; | ||
32 | lzma_filter filters[2]; | ||
31 | }; | 33 | }; |
32 | 34 | ||
33 | xd3_sec_stream* | 35 | xd3_sec_stream* |
@@ -53,13 +55,23 @@ xd3_lzma_init (xd3_stream *stream, xd3_lzma_stream *sec, int is_encode) | |||
53 | 55 | ||
54 | if (is_encode) | 56 | if (is_encode) |
55 | { | 57 | { |
56 | int level = (stream->flags & XD3_COMPLEVEL_MASK) >> XD3_COMPLEVEL_SHIFT; | 58 | int preset = (stream->flags & XD3_COMPLEVEL_MASK) >> XD3_COMPLEVEL_SHIFT; |
57 | 59 | ||
58 | ret = lzma_easy_encoder (&sec->lzma, level, LZMA_CHECK_CRC32); | 60 | if (lzma_lzma_preset(&sec->options, preset)) |
61 | { | ||
62 | stream->msg = "invalid lzma preset"; | ||
63 | return XD3_INVALID; | ||
64 | } | ||
65 | |||
66 | sec->filters[0].id = LZMA_FILTER_LZMA2; | ||
67 | sec->filters[0].options = &sec->options; | ||
68 | sec->filters[1].id = LZMA_VLI_UNKNOWN; | ||
69 | |||
70 | ret = lzma_stream_encoder (&sec->lzma, &sec->filters[0], LZMA_CHECK_NONE); | ||
59 | } | 71 | } |
60 | else | 72 | else |
61 | { | 73 | { |
62 | ret = lzma_stream_decoder (&sec->lzma, UINT64_MAX, 0); | 74 | ret = lzma_stream_decoder (&sec->lzma, UINT64_MAX, LZMA_TELL_NO_CHECK); |
63 | } | 75 | } |
64 | 76 | ||
65 | if (ret != LZMA_OK) | 77 | if (ret != LZMA_OK) |
@@ -87,21 +99,20 @@ int xd3_decode_lzma (xd3_stream *stream, xd3_lzma_stream *sec, | |||
87 | sec->lzma.avail_out = avail_out; | 99 | sec->lzma.avail_out = avail_out; |
88 | sec->lzma.next_out = output; | 100 | sec->lzma.next_out = output; |
89 | 101 | ||
90 | while (sec->lzma.avail_in != 0 || sec->lzma.avail_out != 0) | 102 | while (1) |
91 | { | 103 | { |
92 | int lret = lzma_code (&sec->lzma, LZMA_FINISH); | 104 | int lret = lzma_code (&sec->lzma, LZMA_RUN); |
93 | |||
94 | if (sec->lzma.avail_out == 0 || lret == LZMA_STREAM_END) | ||
95 | { | ||
96 | (*output_pos) = sec->lzma.next_out; | ||
97 | (*input_pos) = sec->lzma.next_in; | ||
98 | } | ||
99 | 105 | ||
100 | switch (lret) | 106 | switch (lret) |
101 | { | 107 | { |
102 | case LZMA_STREAM_END: | 108 | case LZMA_NO_CHECK: |
103 | return 0; | ||
104 | case LZMA_OK: | 109 | case LZMA_OK: |
110 | if (sec->lzma.avail_out == 0) | ||
111 | { | ||
112 | (*output_pos) = sec->lzma.next_out; | ||
113 | (*input_pos) = sec->lzma.next_in; | ||
114 | return 0; | ||
115 | } | ||
105 | break; | 116 | break; |
106 | 117 | ||
107 | default: | 118 | default: |
@@ -109,8 +120,6 @@ int xd3_decode_lzma (xd3_stream *stream, xd3_lzma_stream *sec, | |||
109 | return XD3_INTERNAL; | 120 | return XD3_INTERNAL; |
110 | } | 121 | } |
111 | } | 122 | } |
112 | |||
113 | return 0; | ||
114 | } | 123 | } |
115 | 124 | ||
116 | #if XD3_ENCODER | 125 | #if XD3_ENCODER |
@@ -124,6 +133,7 @@ int xd3_encode_lzma (xd3_stream *stream, | |||
124 | { | 133 | { |
125 | lzma_action action = LZMA_RUN; | 134 | lzma_action action = LZMA_RUN; |
126 | 135 | ||
136 | cfg->inefficient = 1; /* Can't skip windows */ | ||
127 | sec->lzma.next_in = NULL; | 137 | sec->lzma.next_in = NULL; |
128 | sec->lzma.avail_in = 0; | 138 | sec->lzma.avail_in = 0; |
129 | sec->lzma.next_out = (output->base + output->next); | 139 | sec->lzma.next_out = (output->base + output->next); |
@@ -146,9 +156,10 @@ int xd3_encode_lzma (xd3_stream *stream, | |||
146 | 156 | ||
147 | lret = lzma_code (&sec->lzma, action); | 157 | lret = lzma_code (&sec->lzma, action); |
148 | 158 | ||
149 | if (sec->lzma.avail_out == 0 || lret == LZMA_STREAM_END) | 159 | size_t nwrite = (output->avail - output->next) - sec->lzma.avail_out; |
160 | |||
161 | if (nwrite != 0) | ||
150 | { | 162 | { |
151 | size_t nwrite = (output->avail - output->next) - sec->lzma.avail_out; | ||
152 | output->next += nwrite; | 163 | output->next += nwrite; |
153 | 164 | ||
154 | if (output->next == output->avail) | 165 | if (output->next == output->avail) |
diff --git a/xdelta3/xdelta3-second.h b/xdelta3/xdelta3-second.h index b9830ab..02e27f6 100644 --- a/xdelta3/xdelta3-second.h +++ b/xdelta3/xdelta3-second.h | |||
@@ -290,7 +290,7 @@ xd3_encode_secondary (xd3_stream *stream, | |||
290 | XD3_ASSERT (comp_size == xd3_sizeof_output (tmp_head)); | 290 | XD3_ASSERT (comp_size == xd3_sizeof_output (tmp_head)); |
291 | XD3_ASSERT (tmp_tail != NULL); | 291 | XD3_ASSERT (tmp_tail != NULL); |
292 | 292 | ||
293 | if (comp_size < (orig_size - SECONDARY_MIN_SAVINGS)) | 293 | if (comp_size < (orig_size - SECONDARY_MIN_SAVINGS) || cfg->inefficient) |
294 | { | 294 | { |
295 | IF_DEBUG1(DP(RINT "secondary saved %u bytes: %u -> %u (%0.2f%%)\n", | 295 | IF_DEBUG1(DP(RINT "secondary saved %u bytes: %u -> %u (%0.2f%%)\n", |
296 | orig_size - comp_size, orig_size, comp_size, | 296 | orig_size - comp_size, orig_size, comp_size, |
diff --git a/xdelta3/xdelta3-test.h b/xdelta3/xdelta3-test.h index fe62a4b..a2ba64f 100644 --- a/xdelta3/xdelta3-test.h +++ b/xdelta3/xdelta3-test.h | |||
@@ -118,7 +118,7 @@ mt_exp_rand (uint32_t mean, uint32_t max_value) | |||
118 | 118 | ||
119 | #define MSG_IS(x) (stream->msg != NULL && strcmp ((x), stream->msg) == 0) | 119 | #define MSG_IS(x) (stream->msg != NULL && strcmp ((x), stream->msg) == 0) |
120 | 120 | ||
121 | static const usize_t TWO_MEGS_AND_DELTA = (2 << 20) + (1 << 10); | 121 | static const usize_t TWO_MEGS_AND_DELTA = (3 << 20); |
122 | static const usize_t ADDR_CACHE_ROUNDS = 10000; | 122 | static const usize_t ADDR_CACHE_ROUNDS = 10000; |
123 | 123 | ||
124 | static const usize_t TEST_FILE_MEAN = 16384; | 124 | static const usize_t TEST_FILE_MEAN = 16384; |
@@ -1590,9 +1590,12 @@ test_streaming (xd3_stream *in_stream, uint8_t *encbuf, uint8_t *decbuf, uint8_t | |||
1590 | xd3_stream estream, dstream; | 1590 | xd3_stream estream, dstream; |
1591 | int ret; | 1591 | int ret; |
1592 | usize_t i, delsize, decsize; | 1592 | usize_t i, delsize, decsize; |
1593 | xd3_config cfg; | ||
1594 | xd3_init_config (& cfg, in_stream->flags); | ||
1595 | cfg.flags |= XD3_COMPLEVEL_6; | ||
1593 | 1596 | ||
1594 | if ((ret = xd3_config_stream (& estream, NULL)) || | 1597 | if ((ret = xd3_config_stream (& estream, & cfg)) || |
1595 | (ret = xd3_config_stream (& dstream, NULL))) | 1598 | (ret = xd3_config_stream (& dstream, & cfg))) |
1596 | { | 1599 | { |
1597 | goto fail; | 1600 | goto fail; |
1598 | } | 1601 | } |
@@ -1605,7 +1608,7 @@ test_streaming (xd3_stream *in_stream, uint8_t *encbuf, uint8_t *decbuf, uint8_t | |||
1605 | 1608 | ||
1606 | if ((ret = xd3_process_stream (1, & estream, xd3_encode_input, 0, | 1609 | if ((ret = xd3_process_stream (1, & estream, xd3_encode_input, 0, |
1607 | encbuf, 1 << 20, | 1610 | encbuf, 1 << 20, |
1608 | delbuf, & delsize, 1 << 10))) | 1611 | delbuf, & delsize, 1 << 20))) |
1609 | { | 1612 | { |
1610 | in_stream->msg = estream.msg; | 1613 | in_stream->msg = estream.msg; |
1611 | goto fail; | 1614 | goto fail; |
@@ -1645,11 +1648,21 @@ static int | |||
1645 | test_compressed_stream_overflow (xd3_stream *stream, int ignore) | 1648 | test_compressed_stream_overflow (xd3_stream *stream, int ignore) |
1646 | { | 1649 | { |
1647 | int ret; | 1650 | int ret; |
1651 | int i; | ||
1648 | uint8_t *buf; | 1652 | uint8_t *buf; |
1649 | 1653 | ||
1650 | if ((buf = (uint8_t*) malloc (TWO_MEGS_AND_DELTA)) == NULL) { return ENOMEM; } | 1654 | if ((buf = (uint8_t*) malloc (TWO_MEGS_AND_DELTA)) == NULL) { return ENOMEM; } |
1651 | 1655 | ||
1652 | memset (buf, 0, TWO_MEGS_AND_DELTA); | 1656 | memset (buf, 0, TWO_MEGS_AND_DELTA); |
1657 | for (i = 0; i < (2 << 20); i += 256) | ||
1658 | { | ||
1659 | int j; | ||
1660 | int off = mt_random(& static_mtrand) % 10; | ||
1661 | for (j = 0; j < 256; j++) | ||
1662 | { | ||
1663 | buf[i + j] = j + off; | ||
1664 | } | ||
1665 | } | ||
1653 | 1666 | ||
1654 | /* Test overflow of a 32-bit file offset. */ | 1667 | /* Test overflow of a 32-bit file offset. */ |
1655 | if (SIZEOF_XOFF_T == 4) | 1668 | if (SIZEOF_XOFF_T == 4) |
@@ -1670,8 +1683,14 @@ test_compressed_stream_overflow (xd3_stream *stream, int ignore) | |||
1670 | } | 1683 | } |
1671 | 1684 | ||
1672 | /* Test transfer of exactly 32bits worth of data. */ | 1685 | /* Test transfer of exactly 32bits worth of data. */ |
1673 | if ((ret = test_streaming (stream, buf, buf + (1 << 20), buf + (2 << 20), 1 << 12))) { goto fail; } | 1686 | if ((ret = test_streaming (stream, |
1674 | 1687 | buf, | |
1688 | buf + (1 << 20), | ||
1689 | buf + (2 << 20), | ||
1690 | 1 << 12))) | ||
1691 | { | ||
1692 | goto fail; | ||
1693 | } | ||
1675 | fail: | 1694 | fail: |
1676 | free (buf); | 1695 | free (buf); |
1677 | return ret; | 1696 | return ret; |
@@ -2816,7 +2835,7 @@ xd3_selftest (void) | |||
2816 | DO_TEST (decompress_single_bit_error, 0, 3); | 2835 | DO_TEST (decompress_single_bit_error, 0, 3); |
2817 | DO_TEST (decompress_single_bit_error, XD3_ADLER32, 3); | 2836 | DO_TEST (decompress_single_bit_error, XD3_ADLER32, 3); |
2818 | 2837 | ||
2819 | IF_LZMA (DO_TEST (decompress_single_bit_error, XD3_SEC_LZMA, 3)); | 2838 | IF_LZMA (DO_TEST (decompress_single_bit_error, XD3_SEC_LZMA, 54)); |
2820 | IF_FGK (DO_TEST (decompress_single_bit_error, XD3_SEC_FGK, 3)); | 2839 | IF_FGK (DO_TEST (decompress_single_bit_error, XD3_SEC_FGK, 3)); |
2821 | IF_DJW (DO_TEST (decompress_single_bit_error, XD3_SEC_DJW, 8)); | 2840 | IF_DJW (DO_TEST (decompress_single_bit_error, XD3_SEC_DJW, 8)); |
2822 | 2841 | ||
@@ -2844,6 +2863,7 @@ xd3_selftest (void) | |||
2844 | IF_FGK (DO_TEST (secondary_fgk, 0, 1)); | 2863 | IF_FGK (DO_TEST (secondary_fgk, 0, 1)); |
2845 | 2864 | ||
2846 | DO_TEST (compressed_stream_overflow, 0, 0); | 2865 | DO_TEST (compressed_stream_overflow, 0, 0); |
2866 | IF_LZMA (DO_TEST (compressed_stream_overflow, XD3_SEC_LZMA, 0)); | ||
2847 | 2867 | ||
2848 | failure: | 2868 | failure: |
2849 | test_cleanup (); | 2869 | test_cleanup (); |