/src/lzma-fuzz/sdk/C/Lzma2Dec.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* Lzma2Dec.c -- LZMA2 Decoder |
2 | | 2019-02-02 : Igor Pavlov : Public domain */ |
3 | | |
4 | | /* #define SHOW_DEBUG_INFO */ |
5 | | |
6 | | #include "Precomp.h" |
7 | | |
8 | | #ifdef SHOW_DEBUG_INFO |
9 | | #include <stdio.h> |
10 | | #endif |
11 | | |
12 | | #include <string.h> |
13 | | |
14 | | #include "Lzma2Dec.h" |
15 | | |
16 | | /* |
17 | | 00000000 - End of data |
18 | | 00000001 U U - Uncompressed, reset dic, need reset state and set new prop |
19 | | 00000010 U U - Uncompressed, no reset |
20 | | 100uuuuu U U P P - LZMA, no reset |
21 | | 101uuuuu U U P P - LZMA, reset state |
22 | | 110uuuuu U U P P S - LZMA, reset state + set new prop |
23 | | 111uuuuu U U P P S - LZMA, reset state + set new prop, reset dic |
24 | | |
25 | | u, U - Unpack Size |
26 | | P - Pack Size |
27 | | S - Props |
28 | | */ |
29 | | |
30 | 214k | #define LZMA2_CONTROL_COPY_RESET_DIC 1 |
31 | | |
32 | 1.29M | #define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & (1 << 7)) == 0) |
33 | | |
34 | 300k | #define LZMA2_LCLP_MAX 4 |
35 | 175k | #define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)) |
36 | | |
37 | | #ifdef SHOW_DEBUG_INFO |
38 | | #define PRF(x) x |
39 | | #else |
40 | | #define PRF(x) |
41 | | #endif |
42 | | |
43 | | typedef enum |
44 | | { |
45 | | LZMA2_STATE_CONTROL, |
46 | | LZMA2_STATE_UNPACK0, |
47 | | LZMA2_STATE_UNPACK1, |
48 | | LZMA2_STATE_PACK0, |
49 | | LZMA2_STATE_PACK1, |
50 | | LZMA2_STATE_PROP, |
51 | | LZMA2_STATE_DATA, |
52 | | LZMA2_STATE_DATA_CONT, |
53 | | LZMA2_STATE_FINISHED, |
54 | | LZMA2_STATE_ERROR |
55 | | } ELzma2State; |
56 | | |
57 | | static SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props) |
58 | 87.7k | { |
59 | 87.7k | UInt32 dicSize; |
60 | 87.7k | if (prop > 40) |
61 | 0 | return SZ_ERROR_UNSUPPORTED; |
62 | 87.7k | dicSize = (prop == 40) ? 0xFFFFFFFF : LZMA2_DIC_SIZE_FROM_PROP(prop); |
63 | 87.7k | props[0] = (Byte)LZMA2_LCLP_MAX; |
64 | 87.7k | props[1] = (Byte)(dicSize); |
65 | 87.7k | props[2] = (Byte)(dicSize >> 8); |
66 | 87.7k | props[3] = (Byte)(dicSize >> 16); |
67 | 87.7k | props[4] = (Byte)(dicSize >> 24); |
68 | 87.7k | return SZ_OK; |
69 | 87.7k | } |
70 | | |
71 | | SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc) |
72 | 8.72k | { |
73 | 8.72k | Byte props[LZMA_PROPS_SIZE]; |
74 | 8.72k | RINOK(Lzma2Dec_GetOldProps(prop, props)); |
75 | 8.72k | return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc); |
76 | 8.72k | } |
77 | | |
78 | | SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc) |
79 | 78.9k | { |
80 | 78.9k | Byte props[LZMA_PROPS_SIZE]; |
81 | 78.9k | RINOK(Lzma2Dec_GetOldProps(prop, props)); |
82 | 78.9k | return LzmaDec_Allocate(&p->decoder, props, LZMA_PROPS_SIZE, alloc); |
83 | 78.9k | } |
84 | | |
85 | | void Lzma2Dec_Init(CLzma2Dec *p) |
86 | 87.7k | { |
87 | 87.7k | p->state = LZMA2_STATE_CONTROL; |
88 | 87.7k | p->needInitLevel = 0xE0; |
89 | 87.7k | p->isExtraMode = False; |
90 | 87.7k | p->unpackSize = 0; |
91 | | |
92 | | // p->decoder.dicPos = 0; // we can use it instead of full init |
93 | 87.7k | LzmaDec_Init(&p->decoder); |
94 | 87.7k | } |
95 | | |
96 | | static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) |
97 | 1.71M | { |
98 | 1.71M | switch (p->state) |
99 | 1.71M | { |
100 | 405k | case LZMA2_STATE_CONTROL: |
101 | 405k | p->isExtraMode = False; |
102 | 405k | p->control = b; |
103 | 405k | PRF(printf("\n %8X", (unsigned)p->decoder.dicPos)); |
104 | 405k | PRF(printf(" %02X", (unsigned)b)); |
105 | 405k | if (b == 0) |
106 | 76.3k | return LZMA2_STATE_FINISHED; |
107 | 328k | if (LZMA2_IS_UNCOMPRESSED_STATE(p)) |
108 | 107k | { |
109 | 107k | if (b == LZMA2_CONTROL_COPY_RESET_DIC) |
110 | 10.4k | p->needInitLevel = 0xC0; |
111 | 97.0k | else if (b > 2 || p->needInitLevel == 0xE0) |
112 | 62 | return LZMA2_STATE_ERROR; |
113 | 107k | } |
114 | 221k | else |
115 | 221k | { |
116 | 221k | if (b < p->needInitLevel) |
117 | 33 | return LZMA2_STATE_ERROR; |
118 | 221k | p->needInitLevel = 0; |
119 | 221k | p->unpackSize = (UInt32)(b & 0x1F) << 16; |
120 | 221k | } |
121 | 328k | return LZMA2_STATE_UNPACK0; |
122 | | |
123 | 328k | case LZMA2_STATE_UNPACK0: |
124 | 328k | p->unpackSize |= (UInt32)b << 8; |
125 | 328k | return LZMA2_STATE_UNPACK1; |
126 | | |
127 | 328k | case LZMA2_STATE_UNPACK1: |
128 | 328k | p->unpackSize |= (UInt32)b; |
129 | 328k | p->unpackSize++; |
130 | 328k | PRF(printf(" %7u", (unsigned)p->unpackSize)); |
131 | 328k | return LZMA2_IS_UNCOMPRESSED_STATE(p) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0; |
132 | | |
133 | 221k | case LZMA2_STATE_PACK0: |
134 | 221k | p->packSize = (UInt32)b << 8; |
135 | 221k | return LZMA2_STATE_PACK1; |
136 | | |
137 | 221k | case LZMA2_STATE_PACK1: |
138 | 221k | p->packSize |= (UInt32)b; |
139 | 221k | p->packSize++; |
140 | | // if (p->packSize < 5) return LZMA2_STATE_ERROR; |
141 | 221k | PRF(printf(" %5u", (unsigned)p->packSize)); |
142 | 221k | return (p->control & 0x40) ? LZMA2_STATE_PROP : LZMA2_STATE_DATA; |
143 | | |
144 | 212k | case LZMA2_STATE_PROP: |
145 | 212k | { |
146 | 212k | unsigned lc, lp; |
147 | 212k | if (b >= (9 * 5 * 5)) |
148 | 15 | return LZMA2_STATE_ERROR; |
149 | 212k | lc = b % 9; |
150 | 212k | b /= 9; |
151 | 212k | p->decoder.prop.pb = (Byte)(b / 5); |
152 | 212k | lp = b % 5; |
153 | 212k | if (lc + lp > LZMA2_LCLP_MAX) |
154 | 23 | return LZMA2_STATE_ERROR; |
155 | 212k | p->decoder.prop.lc = (Byte)lc; |
156 | 212k | p->decoder.prop.lp = (Byte)lp; |
157 | 212k | return LZMA2_STATE_DATA; |
158 | 212k | } |
159 | 1.71M | } |
160 | 0 | return LZMA2_STATE_ERROR; |
161 | 1.71M | } |
162 | | |
163 | | static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT size) |
164 | 110k | { |
165 | 110k | memcpy(p->dic + p->dicPos, src, size); |
166 | 110k | p->dicPos += size; |
167 | 110k | if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= size) |
168 | 570 | p->checkDicSize = p->prop.dicSize; |
169 | 110k | p->processedPos += (UInt32)size; |
170 | 110k | } |
171 | | |
172 | | void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState); |
173 | | |
174 | | |
175 | | SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, |
176 | | const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) |
177 | 302k | { |
178 | 302k | SizeT inSize = *srcLen; |
179 | 302k | *srcLen = 0; |
180 | 302k | *status = LZMA_STATUS_NOT_SPECIFIED; |
181 | | |
182 | 2.62M | while (p->state != LZMA2_STATE_ERROR) |
183 | 2.62M | { |
184 | 2.62M | SizeT dicPos; |
185 | | |
186 | 2.62M | if (p->state == LZMA2_STATE_FINISHED) |
187 | 197k | { |
188 | 197k | *status = LZMA_STATUS_FINISHED_WITH_MARK; |
189 | 197k | return SZ_OK; |
190 | 197k | } |
191 | | |
192 | 2.42M | dicPos = p->decoder.dicPos; |
193 | | |
194 | 2.42M | if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY) |
195 | 75.3k | { |
196 | 75.3k | *status = LZMA_STATUS_NOT_FINISHED; |
197 | 75.3k | return SZ_OK; |
198 | 75.3k | } |
199 | | |
200 | 2.35M | if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) |
201 | 1.71M | { |
202 | 1.71M | if (*srcLen == inSize) |
203 | 1.08k | { |
204 | 1.08k | *status = LZMA_STATUS_NEEDS_MORE_INPUT; |
205 | 1.08k | return SZ_OK; |
206 | 1.08k | } |
207 | 1.71M | (*srcLen)++; |
208 | 1.71M | p->state = Lzma2Dec_UpdateState(p, *src++); |
209 | 1.71M | if (dicPos == dicLimit && p->state != LZMA2_STATE_FINISHED) |
210 | 9 | break; |
211 | 1.71M | continue; |
212 | 1.71M | } |
213 | | |
214 | 633k | { |
215 | 633k | SizeT inCur = inSize - *srcLen; |
216 | 633k | SizeT outCur = dicLimit - dicPos; |
217 | 633k | ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY; |
218 | | |
219 | 633k | if (outCur >= p->unpackSize) |
220 | 536k | { |
221 | 536k | outCur = (SizeT)p->unpackSize; |
222 | 536k | curFinishMode = LZMA_FINISH_END; |
223 | 536k | } |
224 | | |
225 | 633k | if (LZMA2_IS_UNCOMPRESSED_STATE(p)) |
226 | 113k | { |
227 | 113k | if (inCur == 0) |
228 | 3.06k | { |
229 | 3.06k | *status = LZMA_STATUS_NEEDS_MORE_INPUT; |
230 | 3.06k | return SZ_OK; |
231 | 3.06k | } |
232 | | |
233 | 110k | if (p->state == LZMA2_STATE_DATA) |
234 | 107k | { |
235 | 107k | BoolInt initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); |
236 | 107k | LzmaDec_InitDicAndState(&p->decoder, initDic, False); |
237 | 107k | } |
238 | | |
239 | 110k | if (inCur > outCur) |
240 | 109k | inCur = outCur; |
241 | 110k | if (inCur == 0) |
242 | 4 | break; |
243 | | |
244 | 110k | LzmaDec_UpdateWithUncompressed(&p->decoder, src, inCur); |
245 | | |
246 | 110k | src += inCur; |
247 | 110k | *srcLen += inCur; |
248 | 110k | p->unpackSize -= (UInt32)inCur; |
249 | 110k | p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; |
250 | 110k | } |
251 | 520k | else |
252 | 520k | { |
253 | 520k | SRes res; |
254 | | |
255 | 520k | if (p->state == LZMA2_STATE_DATA) |
256 | 221k | { |
257 | 221k | BoolInt initDic = (p->control >= 0xE0); |
258 | 221k | BoolInt initState = (p->control >= 0xA0); |
259 | 221k | LzmaDec_InitDicAndState(&p->decoder, initDic, initState); |
260 | 221k | p->state = LZMA2_STATE_DATA_CONT; |
261 | 221k | } |
262 | | |
263 | 520k | if (inCur > p->packSize) |
264 | 468k | inCur = (SizeT)p->packSize; |
265 | | |
266 | 520k | res = LzmaDec_DecodeToDic(&p->decoder, dicPos + outCur, src, &inCur, curFinishMode, status); |
267 | | |
268 | 520k | src += inCur; |
269 | 520k | *srcLen += inCur; |
270 | 520k | p->packSize -= (UInt32)inCur; |
271 | 520k | outCur = p->decoder.dicPos - dicPos; |
272 | 520k | p->unpackSize -= (UInt32)outCur; |
273 | | |
274 | 520k | if (res != 0) |
275 | 2.09k | break; |
276 | | |
277 | 518k | if (*status == LZMA_STATUS_NEEDS_MORE_INPUT) |
278 | 23.6k | { |
279 | 23.6k | if (p->packSize == 0) |
280 | 203 | break; |
281 | 23.4k | return SZ_OK; |
282 | 23.6k | } |
283 | | |
284 | 494k | if (inCur == 0 && outCur == 0) |
285 | 211k | { |
286 | 211k | if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK |
287 | 211k | || p->unpackSize != 0 |
288 | 211k | || p->packSize != 0) |
289 | 187 | break; |
290 | 210k | p->state = LZMA2_STATE_CONTROL; |
291 | 210k | } |
292 | | |
293 | 494k | *status = LZMA_STATUS_NOT_SPECIFIED; |
294 | 494k | } |
295 | 633k | } |
296 | 633k | } |
297 | | |
298 | 2.62k | *status = LZMA_STATUS_NOT_SPECIFIED; |
299 | 2.62k | p->state = LZMA2_STATE_ERROR; |
300 | 2.62k | return SZ_ERROR_DATA; |
301 | 302k | } |
302 | | |
303 | | |
304 | | |
305 | | |
306 | | ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p, |
307 | | SizeT outSize, |
308 | | const Byte *src, SizeT *srcLen, |
309 | | int checkFinishBlock) |
310 | 0 | { |
311 | 0 | SizeT inSize = *srcLen; |
312 | 0 | *srcLen = 0; |
313 | |
|
314 | 0 | while (p->state != LZMA2_STATE_ERROR) |
315 | 0 | { |
316 | 0 | if (p->state == LZMA2_STATE_FINISHED) |
317 | 0 | return (ELzma2ParseStatus)LZMA_STATUS_FINISHED_WITH_MARK; |
318 | | |
319 | 0 | if (outSize == 0 && !checkFinishBlock) |
320 | 0 | return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; |
321 | | |
322 | 0 | if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) |
323 | 0 | { |
324 | 0 | if (*srcLen == inSize) |
325 | 0 | return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; |
326 | 0 | (*srcLen)++; |
327 | |
|
328 | 0 | p->state = Lzma2Dec_UpdateState(p, *src++); |
329 | |
|
330 | 0 | if (p->state == LZMA2_STATE_UNPACK0) |
331 | 0 | { |
332 | | // if (p->decoder.dicPos != 0) |
333 | 0 | if (p->control == LZMA2_CONTROL_COPY_RESET_DIC || p->control >= 0xE0) |
334 | 0 | return LZMA2_PARSE_STATUS_NEW_BLOCK; |
335 | | // if (outSize == 0) return LZMA_STATUS_NOT_FINISHED; |
336 | 0 | } |
337 | | |
338 | | // The following code can be commented. |
339 | | // It's not big problem, if we read additional input bytes. |
340 | | // It will be stopped later in LZMA2_STATE_DATA / LZMA2_STATE_DATA_CONT state. |
341 | | |
342 | 0 | if (outSize == 0 && p->state != LZMA2_STATE_FINISHED) |
343 | 0 | { |
344 | | // checkFinishBlock is true. So we expect that block must be finished, |
345 | | // We can return LZMA_STATUS_NOT_SPECIFIED or LZMA_STATUS_NOT_FINISHED here |
346 | | // break; |
347 | 0 | return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; |
348 | 0 | } |
349 | | |
350 | 0 | if (p->state == LZMA2_STATE_DATA) |
351 | 0 | return LZMA2_PARSE_STATUS_NEW_CHUNK; |
352 | | |
353 | 0 | continue; |
354 | 0 | } |
355 | | |
356 | 0 | if (outSize == 0) |
357 | 0 | return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; |
358 | | |
359 | 0 | { |
360 | 0 | SizeT inCur = inSize - *srcLen; |
361 | |
|
362 | 0 | if (LZMA2_IS_UNCOMPRESSED_STATE(p)) |
363 | 0 | { |
364 | 0 | if (inCur == 0) |
365 | 0 | return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; |
366 | 0 | if (inCur > p->unpackSize) |
367 | 0 | inCur = p->unpackSize; |
368 | 0 | if (inCur > outSize) |
369 | 0 | inCur = outSize; |
370 | 0 | p->decoder.dicPos += inCur; |
371 | 0 | src += inCur; |
372 | 0 | *srcLen += inCur; |
373 | 0 | outSize -= inCur; |
374 | 0 | p->unpackSize -= (UInt32)inCur; |
375 | 0 | p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; |
376 | 0 | } |
377 | 0 | else |
378 | 0 | { |
379 | 0 | p->isExtraMode = True; |
380 | |
|
381 | 0 | if (inCur == 0) |
382 | 0 | { |
383 | 0 | if (p->packSize != 0) |
384 | 0 | return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; |
385 | 0 | } |
386 | 0 | else if (p->state == LZMA2_STATE_DATA) |
387 | 0 | { |
388 | 0 | p->state = LZMA2_STATE_DATA_CONT; |
389 | 0 | if (*src != 0) |
390 | 0 | { |
391 | | // first byte of lzma chunk must be Zero |
392 | 0 | *srcLen += 1; |
393 | 0 | p->packSize--; |
394 | 0 | break; |
395 | 0 | } |
396 | 0 | } |
397 | | |
398 | 0 | if (inCur > p->packSize) |
399 | 0 | inCur = (SizeT)p->packSize; |
400 | |
|
401 | 0 | src += inCur; |
402 | 0 | *srcLen += inCur; |
403 | 0 | p->packSize -= (UInt32)inCur; |
404 | |
|
405 | 0 | if (p->packSize == 0) |
406 | 0 | { |
407 | 0 | SizeT rem = outSize; |
408 | 0 | if (rem > p->unpackSize) |
409 | 0 | rem = p->unpackSize; |
410 | 0 | p->decoder.dicPos += rem; |
411 | 0 | p->unpackSize -= (UInt32)rem; |
412 | 0 | outSize -= rem; |
413 | 0 | if (p->unpackSize == 0) |
414 | 0 | p->state = LZMA2_STATE_CONTROL; |
415 | 0 | } |
416 | 0 | } |
417 | 0 | } |
418 | 0 | } |
419 | | |
420 | 0 | p->state = LZMA2_STATE_ERROR; |
421 | 0 | return (ELzma2ParseStatus)LZMA_STATUS_NOT_SPECIFIED; |
422 | 0 | } |
423 | | |
424 | | |
425 | | |
426 | | |
427 | | SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) |
428 | 173k | { |
429 | 173k | SizeT outSize = *destLen, inSize = *srcLen; |
430 | 173k | *srcLen = *destLen = 0; |
431 | | |
432 | 173k | for (;;) |
433 | 293k | { |
434 | 293k | SizeT inCur = inSize, outCur, dicPos; |
435 | 293k | ELzmaFinishMode curFinishMode; |
436 | 293k | SRes res; |
437 | | |
438 | 293k | if (p->decoder.dicPos == p->decoder.dicBufSize) |
439 | 63.0k | p->decoder.dicPos = 0; |
440 | 293k | dicPos = p->decoder.dicPos; |
441 | 293k | curFinishMode = LZMA_FINISH_ANY; |
442 | 293k | outCur = p->decoder.dicBufSize - dicPos; |
443 | | |
444 | 293k | if (outCur >= outSize) |
445 | 66.2k | { |
446 | 66.2k | outCur = outSize; |
447 | 66.2k | curFinishMode = finishMode; |
448 | 66.2k | } |
449 | | |
450 | 293k | res = Lzma2Dec_DecodeToDic(p, dicPos + outCur, src, &inCur, curFinishMode, status); |
451 | | |
452 | 293k | src += inCur; |
453 | 293k | inSize -= inCur; |
454 | 293k | *srcLen += inCur; |
455 | 293k | outCur = p->decoder.dicPos - dicPos; |
456 | 293k | memcpy(dest, p->decoder.dic + dicPos, outCur); |
457 | 293k | dest += outCur; |
458 | 293k | outSize -= outCur; |
459 | 293k | *destLen += outCur; |
460 | 293k | if (res != 0) |
461 | 2.44k | return res; |
462 | 291k | if (outCur == 0 || outSize == 0) |
463 | 170k | return SZ_OK; |
464 | 291k | } |
465 | 173k | } |
466 | | |
467 | | |
468 | | SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, |
469 | | Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc) |
470 | 8.23k | { |
471 | 8.23k | CLzma2Dec p; |
472 | 8.23k | SRes res; |
473 | 8.23k | SizeT outSize = *destLen, inSize = *srcLen; |
474 | 8.23k | *destLen = *srcLen = 0; |
475 | 8.23k | *status = LZMA_STATUS_NOT_SPECIFIED; |
476 | 8.23k | Lzma2Dec_Construct(&p); |
477 | 8.23k | RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc)); |
478 | 8.23k | p.decoder.dic = dest; |
479 | 8.23k | p.decoder.dicBufSize = outSize; |
480 | 8.23k | Lzma2Dec_Init(&p); |
481 | 8.23k | *srcLen = inSize; |
482 | 8.23k | res = Lzma2Dec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); |
483 | 8.23k | *destLen = p.decoder.dicPos; |
484 | 8.23k | if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) |
485 | 0 | res = SZ_ERROR_INPUT_EOF; |
486 | 8.23k | Lzma2Dec_FreeProbs(&p, alloc); |
487 | 8.23k | return res; |
488 | 8.23k | } |