summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xdelta3/xdelta3-lzma.h45
-rw-r--r--xdelta3/xdelta3-second.h2
-rw-r--r--xdelta3/xdelta3-test.h34
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
29struct _xd3_lzma_stream { 29struct _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
33xd3_sec_stream* 35xd3_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
121static const usize_t TWO_MEGS_AND_DELTA = (2 << 20) + (1 << 10); 121static const usize_t TWO_MEGS_AND_DELTA = (3 << 20);
122static const usize_t ADDR_CACHE_ROUNDS = 10000; 122static const usize_t ADDR_CACHE_ROUNDS = 10000;
123 123
124static const usize_t TEST_FILE_MEAN = 16384; 124static 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
1645test_compressed_stream_overflow (xd3_stream *stream, int ignore) 1648test_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
2848failure: 2868failure:
2849 test_cleanup (); 2869 test_cleanup ();