Coverage Report

Created: 2026-10-28 06:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libhtp/htp/lzma/LzmaDec.c
Line
Count
Source
1
/* LzmaDec.c -- LZMA Decoder
2
2018-07-04 : Igor Pavlov : Public domain */
3
4
#include "Precomp.h"
5
6
#include <string.h>
7
#include <stdlib.h>
8
#include <stdint.h>
9
10
/* #include "CpuArch.h" */
11
#include "LzmaDec.h"
12
13
688M
#define kNumTopBits 24
14
688M
#define kTopValue ((UInt32)1 << kNumTopBits)
15
16
3.73G
#define kNumBitModelTotalBits 11
17
3.05G
#define kBitModelTotal (1 << kNumBitModelTotalBits)
18
675M
#define kNumMoveBits 5
19
20
84.3k
#define RC_INIT_SIZE 5
21
22
679M
#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
23
24
675M
#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound)
25
77.2M
#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
26
598M
#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
27
387M
#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \
28
387M
  { UPDATE_0(p); i = (i + i); A0; } else \
29
387M
  { UPDATE_1(p); i = (i + i) + 1; A1; }
30
31
387M
#define TREE_GET_BIT(probs, i) { GET_BIT2(probs + i, i, ;, ;); }
32
33
142k
#define REV_BIT(p, i, A0, A1) IF_BIT_0(p + i) \
34
142k
  { UPDATE_0(p + i); A0; } else \
35
142k
  { UPDATE_1(p + i); A1; }
36
51.8k
#define REV_BIT_VAR(  p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m; )
37
68.3k
#define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m;       , i += m * 2; )
38
22.7k
#define REV_BIT_LAST( p, i, m) REV_BIT(p, i, i -= m        , ; )
39
40
#define TREE_DECODE(probs, limit, i) \
41
318M
  { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
42
43
/* #define _LZMA_SIZE_OPT */
44
45
#ifdef _LZMA_SIZE_OPT
46
#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
47
#else
48
#define TREE_6_DECODE(probs, i) \
49
41.2k
  { i = 1; \
50
41.2k
  TREE_GET_BIT(probs, i); \
51
41.2k
  TREE_GET_BIT(probs, i); \
52
41.2k
  TREE_GET_BIT(probs, i); \
53
41.2k
  TREE_GET_BIT(probs, i); \
54
41.2k
  TREE_GET_BIT(probs, i); \
55
41.2k
  TREE_GET_BIT(probs, i); \
56
41.2k
  i -= 0x40; }
57
#endif
58
59
68.0M
#define NORMAL_LITER_DEC TREE_GET_BIT(prob, symbol)
60
#define MATCHED_LITER_DEC \
61
377k
  matchByte += matchByte; \
62
377k
  bit = offs; \
63
377k
  offs &= matchByte; \
64
377k
  probLit = prob + (offs + bit + symbol); \
65
377k
  GET_BIT2(probLit, symbol, offs ^= bit; , ;)
66
67
68
69
8.45M
#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
70
71
7.83M
#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound)
72
968k
#define UPDATE_0_CHECK range = bound;
73
6.80M
#define UPDATE_1_CHECK range -= bound; code -= bound;
74
4.34M
#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
75
4.30M
  { UPDATE_0_CHECK; i = (i + i); A0; } else \
76
4.30M
  { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
77
4.14M
#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
78
#define TREE_DECODE_CHECK(probs, limit, i) \
79
3.70M
  { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
80
81
82
68.0k
#define REV_BIT_CHECK(p, i, m) IF_BIT_0_CHECK(p + i) \
83
65.6k
  { UPDATE_0_CHECK; i += m; m += m; } else \
84
65.6k
  { UPDATE_1_CHECK; m += m; i += m; }
85
86
87
908M
#define kNumPosBitsMax 4
88
478M
#define kNumPosStatesMax (1 << kNumPosBitsMax)
89
90
576M
#define kLenNumLowBits 3
91
57.0M
#define kLenNumLowSymbols (1 << kLenNumLowBits)
92
455M
#define kLenNumHighBits 8
93
455M
#define kLenNumHighSymbols (1 << kLenNumHighBits)
94
95
559M
#define LenLow 0
96
478M
#define LenHigh (LenLow + 2 * (kNumPosStatesMax << kLenNumLowBits))
97
438M
#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
98
99
40.4M
#define LenChoice LenLow
100
40.3M
#define LenChoice2 (LenLow + (1 << kLenNumLowBits))
101
102
317M
#define kNumStates 12
103
429M
#define kNumStates2 16
104
48.6M
#define kNumLitStates 7
105
106
64.8k
#define kStartPosModelIndex 4
107
259M
#define kEndPosModelIndex 14
108
259M
#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
109
110
8.72M
#define kNumPosSlotBits 6
111
8.79M
#define kNumLenToPosStates 4
112
113
170M
#define kNumAlignBits 4
114
170M
#define kAlignTableSize (1 << kNumAlignBits)
115
116
56.7M
#define kMatchMinLen 2
117
16.7M
#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols)
118
119
/* External ASM code needs same CLzmaProb array layout. So don't change it. */
120
121
/* (probs_1664) is faster and better for code size at some platforms */
122
/*
123
#ifdef MY_CPU_X86_OR_AMD64
124
*/
125
259M
#define kStartOffset 1664
126
4.30M
#define GET_PROBS p->probs_1664
127
/*
128
#define GET_PROBS p->probs + kStartOffset
129
#else
130
#define kStartOffset 0
131
#define GET_PROBS p->probs
132
#endif
133
*/
134
135
259M
#define SpecPos (-kStartOffset)
136
259M
#define IsRep0Long (SpecPos + kNumFullDistances)
137
259M
#define RepLenCoder (IsRep0Long + (kNumStates2 << kNumPosBitsMax))
138
219M
#define LenCoder (RepLenCoder + kNumLenProbs)
139
219M
#define IsMatch (LenCoder + kNumLenProbs)
140
170M
#define Align (IsMatch + (kNumStates2 << kNumPosBitsMax))
141
170M
#define IsRep (Align + kAlignTableSize)
142
129M
#define IsRepG0 (IsRep + kNumStates)
143
89.3M
#define IsRepG1 (IsRepG0 + kNumStates)
144
49.0M
#define IsRepG2 (IsRepG1 + kNumStates)
145
8.72M
#define PosSlot (IsRepG2 + kNumStates)
146
8.65M
#define Literal (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
147
24.2k
#define NUM_BASE_PROBS (Literal + kStartOffset)
148
149
#if Align != 0 && kStartOffset != 0
150
  #error Stop_Compiling_Bad_LZMA_kAlign
151
#endif
152
153
#if NUM_BASE_PROBS != 1984
154
  #error Stop_Compiling_Bad_LZMA_PROBS
155
#endif
156
157
158
106k
#define LZMA_LIT_SIZE 0x300
159
160
24.2k
#define LzmaProps_GetNumProbs(p) (NUM_BASE_PROBS + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
161
162
163
49.0M
#define CALC_POS_STATE(processedPos, pbMask) (((processedPos) & (pbMask)) << 4)
164
49.1M
#define COMBINED_PS_STATE (posState + state)
165
129k
#define GET_LEN_STATE (posState)
166
167
40.4k
#define LZMA_DIC_MIN (1 << 12)
168
169
/*
170
p->remainLen : shows status of LZMA decoder:
171
    < kMatchSpecLenStart : normal remain
172
    = kMatchSpecLenStart : finished
173
    = kMatchSpecLenStart + 1 : need init range coder
174
    = kMatchSpecLenStart + 2 : need init range coder and state
175
*/
176
177
/* ---------- LZMA_DECODE_REAL ---------- */
178
/*
179
LzmaDec_DecodeReal_3() can be implemented in external ASM file.
180
3 - is the code compatibility version of that function for check at link time.
181
*/
182
183
#define LZMA_DECODE_REAL LzmaDec_DecodeReal_3
184
185
/*
186
LZMA_DECODE_REAL()
187
In:
188
  RangeCoder is normalized
189
  if (p->dicPos == limit)
190
  {
191
    LzmaDec_TryDummy() was called before to exclude LITERAL and MATCH-REP cases.
192
    So first symbol can be only MATCH-NON-REP. And if that MATCH-NON-REP symbol
193
    is not END_OF_PAYALOAD_MARKER, then function returns error code.
194
  }
195
196
Processing:
197
  first LZMA symbol will be decoded in any case
198
  All checks for limits are at the end of main loop,
199
  It will decode new LZMA-symbols while (p->buf < bufLimit && dicPos < limit),
200
  RangeCoder is still without last normalization when (p->buf < bufLimit) is being checked.
201
202
Out:
203
  RangeCoder is normalized
204
  Result:
205
    SZ_OK - OK
206
    SZ_ERROR_DATA - Error
207
  p->remainLen:
208
    < kMatchSpecLenStart : normal remain
209
    = kMatchSpecLenStart : finished
210
*/
211
212
213
#ifdef _LZMA_DEC_OPT
214
215
int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit);
216
217
#else
218
219
static
220
int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
221
3.70M
{
222
3.70M
  CLzmaProb *probs = GET_PROBS;
223
3.70M
  unsigned state = (unsigned)p->state;
224
3.70M
  UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
225
3.70M
  unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
226
3.70M
  unsigned lc = p->prop.lc;
227
3.70M
  unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc);
228
229
3.70M
  Byte *dic = p->dic;
230
3.70M
  SizeT dicBufSize = p->dicBufSize;
231
3.70M
  SizeT dicPos = p->dicPos;
232
  
233
3.70M
  UInt32 processedPos = p->processedPos;
234
3.70M
  UInt32 checkDicSize = p->checkDicSize;
235
3.70M
  unsigned len = 0;
236
237
3.70M
  const Byte *buf = p->buf;
238
3.70M
  UInt32 range = p->range;
239
3.70M
  UInt32 code = p->code;
240
241
3.70M
  do
242
48.4M
  {
243
48.4M
    CLzmaProb *prob;
244
48.4M
    UInt32 bound;
245
48.4M
    unsigned ttt;
246
48.4M
    unsigned posState = CALC_POS_STATE(processedPos, pbMask);
247
248
48.4M
    prob = probs + IsMatch + COMBINED_PS_STATE;
249
48.4M
    IF_BIT_0(prob)
250
8.54M
    {
251
8.54M
      unsigned symbol;
252
8.54M
      UPDATE_0(prob);
253
8.54M
      prob = probs + Literal;
254
8.54M
      if (processedPos != 0 || checkDicSize != 0)
255
8.53M
        prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc);
256
8.54M
      processedPos++;
257
258
8.54M
      if (state < kNumLitStates)
259
8.50M
      {
260
8.50M
        state -= (state < 4) ? state : 3;
261
8.50M
        symbol = 1;
262
        #ifdef _LZMA_SIZE_OPT
263
        do { NORMAL_LITER_DEC } while (symbol < 0x100);
264
        #else
265
8.50M
        NORMAL_LITER_DEC
266
8.50M
        NORMAL_LITER_DEC
267
8.50M
        NORMAL_LITER_DEC
268
8.50M
        NORMAL_LITER_DEC
269
8.50M
        NORMAL_LITER_DEC
270
8.50M
        NORMAL_LITER_DEC
271
8.50M
        NORMAL_LITER_DEC
272
8.50M
        NORMAL_LITER_DEC
273
8.50M
        #endif
274
8.50M
      }
275
47.2k
      else
276
47.2k
      {
277
47.2k
        unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
278
47.2k
        unsigned offs = 0x100;
279
47.2k
        state -= (state < 10) ? 3 : 6;
280
47.2k
        symbol = 1;
281
        #ifdef _LZMA_SIZE_OPT
282
        do
283
        {
284
          unsigned bit;
285
          CLzmaProb *probLit;
286
          MATCHED_LITER_DEC
287
        }
288
        while (symbol < 0x100);
289
        #else
290
47.2k
        {
291
47.2k
          unsigned bit;
292
47.2k
          CLzmaProb *probLit;
293
47.2k
          MATCHED_LITER_DEC
294
47.2k
          MATCHED_LITER_DEC
295
47.2k
          MATCHED_LITER_DEC
296
47.2k
          MATCHED_LITER_DEC
297
47.2k
          MATCHED_LITER_DEC
298
47.2k
          MATCHED_LITER_DEC
299
47.2k
          MATCHED_LITER_DEC
300
47.2k
          MATCHED_LITER_DEC
301
47.2k
        }
302
47.2k
        #endif
303
47.2k
      }
304
305
8.54M
      dic[dicPos++] = (Byte)symbol;
306
8.54M
      continue;
307
8.54M
    }
308
    
309
39.9M
    {
310
39.9M
      UPDATE_1(prob);
311
39.9M
      prob = probs + IsRep + state;
312
39.9M
      IF_BIT_0(prob)
313
41.2k
      {
314
41.2k
        UPDATE_0(prob);
315
41.2k
        state += kNumStates;
316
41.2k
        prob = probs + LenCoder;
317
41.2k
      }
318
39.9M
      else
319
39.9M
      {
320
39.9M
        UPDATE_1(prob);
321
        /*
322
        // that case was checked before with kBadRepCode
323
        if (checkDicSize == 0 && processedPos == 0)
324
          return SZ_ERROR_DATA;
325
        */
326
39.9M
        prob = probs + IsRepG0 + state;
327
39.9M
        IF_BIT_0(prob)
328
35.7k
        {
329
35.7k
          UPDATE_0(prob);
330
35.7k
          prob = probs + IsRep0Long + COMBINED_PS_STATE;
331
35.7k
          IF_BIT_0(prob)
332
17.5k
          {
333
17.5k
            UPDATE_0(prob);
334
17.5k
            dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
335
17.5k
            dicPos++;
336
17.5k
            processedPos++;
337
17.5k
            state = state < kNumLitStates ? 9 : 11;
338
17.5k
            continue;
339
17.5k
          }
340
18.1k
          UPDATE_1(prob);
341
18.1k
        }
342
39.8M
        else
343
39.8M
        {
344
39.8M
          UInt32 distance;
345
39.8M
          UPDATE_1(prob);
346
39.8M
          prob = probs + IsRepG1 + state;
347
39.8M
          IF_BIT_0(prob)
348
23.6k
          {
349
23.6k
            UPDATE_0(prob);
350
23.6k
            distance = rep1;
351
23.6k
          }
352
39.8M
          else
353
39.8M
          {
354
39.8M
            UPDATE_1(prob);
355
39.8M
            prob = probs + IsRepG2 + state;
356
39.8M
            IF_BIT_0(prob)
357
13.0k
            {
358
13.0k
              UPDATE_0(prob);
359
13.0k
              distance = rep2;
360
13.0k
            }
361
39.8M
            else
362
39.8M
            {
363
39.8M
              UPDATE_1(prob);
364
39.8M
              distance = rep3;
365
39.8M
              rep3 = rep2;
366
39.8M
            }
367
39.8M
            rep2 = rep1;
368
39.8M
          }
369
39.8M
          rep1 = rep0;
370
39.8M
          rep0 = distance;
371
39.8M
        }
372
39.8M
        state = state < kNumLitStates ? 8 : 11;
373
39.8M
        prob = probs + RepLenCoder;
374
39.8M
      }
375
      
376
      #ifdef _LZMA_SIZE_OPT
377
      {
378
        unsigned lim, offset;
379
        CLzmaProb *probLen = prob + LenChoice;
380
        IF_BIT_0(probLen)
381
        {
382
          UPDATE_0(probLen);
383
          probLen = prob + LenLow + GET_LEN_STATE;
384
          offset = 0;
385
          lim = (1 << kLenNumLowBits);
386
        }
387
        else
388
        {
389
          UPDATE_1(probLen);
390
          probLen = prob + LenChoice2;
391
          IF_BIT_0(probLen)
392
          {
393
            UPDATE_0(probLen);
394
            probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);
395
            offset = kLenNumLowSymbols;
396
            lim = (1 << kLenNumLowBits);
397
          }
398
          else
399
          {
400
            UPDATE_1(probLen);
401
            probLen = prob + LenHigh;
402
            offset = kLenNumLowSymbols * 2;
403
            lim = (1 << kLenNumHighBits);
404
          }
405
        }
406
        TREE_DECODE(probLen, lim, len);
407
        len += offset;
408
      }
409
      #else
410
39.9M
      {
411
39.9M
        CLzmaProb *probLen = prob + LenChoice;
412
39.9M
        IF_BIT_0(probLen)
413
44.3k
        {
414
44.3k
          UPDATE_0(probLen);
415
44.3k
          probLen = prob + LenLow + GET_LEN_STATE;
416
44.3k
          len = 1;
417
44.3k
          TREE_GET_BIT(probLen, len);
418
44.3k
          TREE_GET_BIT(probLen, len);
419
44.3k
          TREE_GET_BIT(probLen, len);
420
44.3k
          len -= 8;
421
44.3k
        }
422
39.8M
        else
423
39.8M
        {
424
39.8M
          UPDATE_1(probLen);
425
39.8M
          probLen = prob + LenChoice2;
426
39.8M
          IF_BIT_0(probLen)
427
34.8k
          {
428
34.8k
            UPDATE_0(probLen);
429
34.8k
            probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);
430
34.8k
            len = 1;
431
34.8k
            TREE_GET_BIT(probLen, len);
432
34.8k
            TREE_GET_BIT(probLen, len);
433
34.8k
            TREE_GET_BIT(probLen, len);
434
34.8k
          }
435
39.8M
          else
436
39.8M
          {
437
39.8M
            UPDATE_1(probLen);
438
39.8M
            probLen = prob + LenHigh;
439
39.8M
            TREE_DECODE(probLen, (1 << kLenNumHighBits), len);
440
39.8M
            len += kLenNumLowSymbols * 2;
441
39.8M
          }
442
39.8M
        }
443
39.9M
      }
444
39.9M
      #endif
445
446
39.9M
      if (state >= kNumStates)
447
41.2k
      {
448
41.2k
        UInt32 distance;
449
41.2k
        prob = probs + PosSlot +
450
41.2k
            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
451
41.2k
        TREE_6_DECODE(prob, distance);
452
41.2k
        if (distance >= kStartPosModelIndex)
453
37.4k
        {
454
37.4k
          unsigned posSlot = (unsigned)distance;
455
37.4k
          unsigned numDirectBits = (unsigned)(((distance >> 1) - 1));
456
37.4k
          distance = (2 | (distance & 1));
457
37.4k
          if (posSlot < kEndPosModelIndex)
458
14.6k
          {
459
14.6k
            distance <<= numDirectBits;
460
14.6k
            prob = probs + SpecPos;
461
14.6k
            {
462
14.6k
              UInt32 m = 1;
463
14.6k
              distance++;
464
14.6k
              do
465
51.8k
              {
466
51.8k
                REV_BIT_VAR(prob, distance, m);
467
51.8k
              }
468
51.8k
              while (--numDirectBits);
469
14.6k
              distance -= m;
470
14.6k
            }
471
14.6k
          }
472
22.7k
          else
473
22.7k
          {
474
22.7k
            numDirectBits -= kNumAlignBits;
475
22.7k
            do
476
134k
            {
477
134k
              NORMALIZE
478
134k
              range >>= 1;
479
              
480
134k
              {
481
134k
                UInt32 t;
482
134k
                code -= range;
483
134k
                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
484
134k
                distance = (distance << 1) + (t + 1);
485
134k
                code += range & t;
486
134k
              }
487
              /*
488
              distance <<= 1;
489
              if (code >= range)
490
              {
491
                code -= range;
492
                distance |= 1;
493
              }
494
              */
495
134k
            }
496
134k
            while (--numDirectBits);
497
22.7k
            prob = probs + Align;
498
22.7k
            distance <<= kNumAlignBits;
499
22.7k
            {
500
22.7k
              unsigned i = 1;
501
22.7k
              REV_BIT_CONST(prob, i, 1);
502
22.7k
              REV_BIT_CONST(prob, i, 2);
503
22.7k
              REV_BIT_CONST(prob, i, 4);
504
22.7k
              REV_BIT_LAST (prob, i, 8);
505
22.7k
              distance |= i;
506
22.7k
            }
507
22.7k
            if (distance == (UInt32)0xFFFFFFFF)
508
446
            {
509
446
              len = kMatchSpecLenStart;
510
446
              state -= kNumStates;
511
446
              break;
512
446
            }
513
22.7k
          }
514
37.4k
        }
515
        
516
40.7k
        rep3 = rep2;
517
40.7k
        rep2 = rep1;
518
40.7k
        rep1 = rep0;
519
40.7k
        rep0 = distance + 1;
520
40.7k
        state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
521
40.7k
        if (distance >= (checkDicSize == 0 ? processedPos: checkDicSize))
522
3.04k
        {
523
3.04k
          p->dicPos = dicPos;
524
3.04k
          return SZ_ERROR_DATA;
525
3.04k
        }
526
40.7k
      }
527
528
39.9M
      len += kMatchMinLen;
529
530
39.9M
      {
531
39.9M
        SizeT rem;
532
39.9M
        unsigned curLen;
533
39.9M
        SizeT pos;
534
        
535
39.9M
        if ((rem = limit - dicPos) == 0)
536
0
        {
537
0
          p->dicPos = dicPos;
538
0
          return SZ_ERROR_DATA;
539
0
        }
540
        
541
39.9M
        curLen = ((rem < len) ? (unsigned)rem : len);
542
39.9M
        pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0);
543
544
39.9M
        processedPos += (UInt32)curLen;
545
546
39.9M
        len -= curLen;
547
39.9M
        if (curLen <= dicBufSize - pos)
548
39.8M
        {
549
39.8M
          Byte *dest = dic + dicPos;
550
39.8M
          ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
551
39.8M
          const Byte *lim = dest + curLen;
552
39.8M
          dicPos += (SizeT)curLen;
553
39.8M
          do
554
10.4G
            *(dest) = (Byte)*(dest + src);
555
10.4G
          while (++dest != lim);
556
39.8M
        }
557
56.8k
        else
558
56.8k
        {
559
56.8k
          do
560
15.3M
          {
561
15.3M
            dic[dicPos++] = dic[pos];
562
15.3M
            if (++pos == dicBufSize)
563
56.8k
              pos = 0;
564
15.3M
          }
565
15.3M
          while (--curLen != 0);
566
56.8k
        }
567
39.9M
      }
568
39.9M
    }
569
39.9M
  }
570
48.4M
  while (dicPos < limit && buf < bufLimit);
571
572
3.70M
  NORMALIZE;
573
  
574
3.70M
  p->buf = buf;
575
3.70M
  p->range = range;
576
3.70M
  p->code = code;
577
3.70M
  p->remainLen = (UInt32)len;
578
3.70M
  p->dicPos = dicPos;
579
3.70M
  p->processedPos = processedPos;
580
3.70M
  p->reps[0] = rep0;
581
3.70M
  p->reps[1] = rep1;
582
3.70M
  p->reps[2] = rep2;
583
3.70M
  p->reps[3] = rep3;
584
3.70M
  p->state = (UInt32)state;
585
586
3.70M
  return SZ_OK;
587
3.70M
}
588
#endif
589
590
static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
591
7.02M
{
592
7.02M
  if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)
593
6.38M
  {
594
6.38M
    Byte *dic = p->dic;
595
6.38M
    SizeT dicPos = p->dicPos;
596
6.38M
    SizeT dicBufSize = p->dicBufSize;
597
6.38M
    unsigned len = (unsigned)p->remainLen;
598
6.38M
    SizeT rep0 = p->reps[0]; /* we use SizeT to avoid the BUG of VC14 for AMD64 */
599
6.38M
    SizeT rem = limit - dicPos;
600
6.38M
    if (rem < len)
601
3.22M
      len = (unsigned)(rem);
602
603
6.38M
    if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)
604
354
      p->checkDicSize = p->prop.dicSize;
605
606
6.38M
    p->processedPos += (UInt32)len;
607
6.38M
    p->remainLen -= (UInt32)len;
608
443M
    while (len != 0)
609
436M
    {
610
436M
      len--;
611
436M
      dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
612
436M
      dicPos++;
613
436M
    }
614
6.38M
    p->dicPos = dicPos;
615
6.38M
  }
616
7.02M
}
617
618
619
32.2k
#define kRange0 0xFFFFFFFF
620
21.5k
#define kBound0 ((kRange0 >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1))
621
10.7k
#define kBadRepCode (kBound0 + (((kRange0 - kBound0) >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1)))
622
#if kBadRepCode != (0xC0000000 - 0x400)
623
  #error Stop_Compiling_Bad_LZMA_Check
624
#endif
625
626
static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit, SizeT memlimit)
627
3.70M
{
628
3.70M
  do
629
3.70M
  {
630
3.70M
    SizeT limit2 = limit;
631
3.70M
    if (p->checkDicSize == 0)
632
491k
    {
633
491k
      UInt32 rem = p->prop.dicSize - p->processedPos;
634
491k
      if (limit - p->dicPos > rem) {
635
0
          if (p->dicBufSize < p->prop.dicSize) {
636
0
              p->dicBufSize = p->prop.dicSize;
637
0
              if (p->dicBufSize > memlimit) {
638
0
                  return SZ_ERROR_MEM;
639
0
              }
640
0
              Byte *tmp = realloc(p->dic, p->dicBufSize);
641
0
              if (!tmp) {
642
0
                  return SZ_ERROR_MEM;
643
0
              }
644
0
              p->dic = tmp;
645
0
          }
646
0
        limit2 = p->dicPos + rem;
647
0
        }
648
649
491k
      if (p->processedPos == 0)
650
10.7k
        if (p->code >= kBadRepCode)
651
245
          return SZ_ERROR_DATA;
652
491k
    }
653
654
3.70M
    RINOK(LZMA_DECODE_REAL(p, limit2, bufLimit));
655
    
656
3.70M
    if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize)
657
1.99k
      p->checkDicSize = p->prop.dicSize;
658
    
659
3.70M
    LzmaDec_WriteRem(p, limit);
660
3.70M
  }
661
3.70M
  while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
662
663
3.70M
  return 0;
664
3.70M
}
665
666
typedef enum
667
{
668
  DUMMY_ERROR, /* unexpected end of input stream */
669
  DUMMY_LIT,
670
  DUMMY_MATCH,
671
  DUMMY_REP
672
} ELzmaDummy;
673
674
static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
675
597k
{
676
597k
  UInt32 range = p->range;
677
597k
  UInt32 code = p->code;
678
597k
  const Byte *bufLimit = buf + inSize;
679
597k
  const CLzmaProb *probs = GET_PROBS;
680
597k
  unsigned state = (unsigned)p->state;
681
597k
  ELzmaDummy res;
682
683
597k
  {
684
597k
    const CLzmaProb *prob;
685
597k
    UInt32 bound;
686
597k
    unsigned ttt;
687
597k
    unsigned posState = CALC_POS_STATE(p->processedPos, (1 << p->prop.pb) - 1);
688
689
597k
    prob = probs + IsMatch + COMBINED_PS_STATE;
690
597k
    IF_BIT_0_CHECK(prob)
691
87.9k
    {
692
87.9k
      UPDATE_0_CHECK
693
694
      /* if (bufLimit - buf >= 7) return DUMMY_LIT; */
695
696
87.9k
      prob = probs + Literal;
697
87.9k
      if (p->checkDicSize != 0 || p->processedPos != 0)
698
82.4k
        prob += ((UInt32)LZMA_LIT_SIZE *
699
82.4k
            ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
700
82.4k
            (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
701
702
87.9k
      if (state < kNumLitStates)
703
58.4k
      {
704
58.4k
        unsigned symbol = 1;
705
441k
        do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);
706
58.4k
      }
707
29.4k
      else
708
29.4k
      {
709
29.4k
        unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
710
29.4k
            (p->dicPos < p->reps[0] ? p->dicBufSize : 0)];
711
29.4k
        unsigned offs = 0x100;
712
29.4k
        unsigned symbol = 1;
713
29.4k
        do
714
199k
        {
715
199k
          unsigned bit;
716
199k
          const CLzmaProb *probLit;
717
199k
          matchByte += matchByte;
718
199k
          bit = offs;
719
199k
          offs &= matchByte;
720
199k
          probLit = prob + (offs + bit + symbol);
721
199k
          GET_BIT2_CHECK(probLit, symbol, offs ^= bit; , ; )
722
190k
        }
723
190k
        while (symbol < 0x100);
724
29.4k
      }
725
68.4k
      res = DUMMY_LIT;
726
68.4k
    }
727
509k
    else
728
509k
    {
729
509k
      unsigned len;
730
509k
      UPDATE_1_CHECK;
731
732
509k
      prob = probs + IsRep + state;
733
509k
      IF_BIT_0_CHECK(prob)
734
34.5k
      {
735
34.5k
        UPDATE_0_CHECK;
736
34.5k
        state = 0;
737
34.5k
        prob = probs + LenCoder;
738
34.5k
        res = DUMMY_MATCH;
739
34.5k
      }
740
473k
      else
741
473k
      {
742
473k
        UPDATE_1_CHECK;
743
473k
        res = DUMMY_REP;
744
473k
        prob = probs + IsRepG0 + state;
745
473k
        IF_BIT_0_CHECK(prob)
746
24.5k
        {
747
24.5k
          UPDATE_0_CHECK;
748
24.5k
          prob = probs + IsRep0Long + COMBINED_PS_STATE;
749
24.5k
          IF_BIT_0_CHECK(prob)
750
11.4k
          {
751
11.4k
            UPDATE_0_CHECK;
752
11.4k
            NORMALIZE_CHECK;
753
10.7k
            return DUMMY_REP;
754
11.4k
          }
755
11.5k
          else
756
11.5k
          {
757
11.5k
            UPDATE_1_CHECK;
758
11.5k
          }
759
22.9k
        }
760
445k
        else
761
445k
        {
762
445k
          UPDATE_1_CHECK;
763
445k
          prob = probs + IsRepG1 + state;
764
445k
          IF_BIT_0_CHECK(prob)
765
15.8k
          {
766
15.8k
            UPDATE_0_CHECK;
767
15.8k
          }
768
427k
          else
769
427k
          {
770
427k
            UPDATE_1_CHECK;
771
427k
            prob = probs + IsRepG2 + state;
772
427k
            IF_BIT_0_CHECK(prob)
773
11.2k
            {
774
11.2k
              UPDATE_0_CHECK;
775
11.2k
            }
776
415k
            else
777
415k
            {
778
415k
              UPDATE_1_CHECK;
779
415k
            }
780
427k
          }
781
443k
        }
782
454k
        state = kNumStates;
783
454k
        prob = probs + RepLenCoder;
784
454k
      }
785
488k
      {
786
488k
        unsigned limit, offset;
787
488k
        const CLzmaProb *probLen = prob + LenChoice;
788
488k
        IF_BIT_0_CHECK(probLen)
789
29.9k
        {
790
29.9k
          UPDATE_0_CHECK;
791
29.9k
          probLen = prob + LenLow + GET_LEN_STATE;
792
29.9k
          offset = 0;
793
29.9k
          limit = 1 << kLenNumLowBits;
794
29.9k
        }
795
453k
        else
796
453k
        {
797
453k
          UPDATE_1_CHECK;
798
453k
          probLen = prob + LenChoice2;
799
453k
          IF_BIT_0_CHECK(probLen)
800
20.3k
          {
801
20.3k
            UPDATE_0_CHECK;
802
20.3k
            probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits);
803
20.3k
            offset = kLenNumLowSymbols;
804
20.3k
            limit = 1 << kLenNumLowBits;
805
20.3k
          }
806
430k
          else
807
430k
          {
808
430k
            UPDATE_1_CHECK;
809
430k
            probLen = prob + LenHigh;
810
430k
            offset = kLenNumLowSymbols * 2;
811
430k
            limit = 1 << kLenNumHighBits;
812
430k
          }
813
450k
        }
814
941k
        TREE_DECODE_CHECK(probLen, limit, len);
815
941k
        len += offset;
816
941k
      }
817
818
460k
      if (state < 4)
819
28.3k
      {
820
28.3k
        unsigned posSlot;
821
28.3k
        prob = probs + PosSlot +
822
28.3k
            ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) <<
823
28.3k
            kNumPosSlotBits);
824
28.3k
        TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);
825
23.6k
        if (posSlot >= kStartPosModelIndex)
826
21.3k
        {
827
21.3k
          unsigned numDirectBits = ((posSlot >> 1) - 1);
828
829
          /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
830
831
21.3k
          if (posSlot < kEndPosModelIndex)
832
8.38k
          {
833
8.38k
            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits);
834
8.38k
          }
835
12.9k
          else
836
12.9k
          {
837
12.9k
            numDirectBits -= kNumAlignBits;
838
12.9k
            do
839
88.9k
            {
840
88.9k
              NORMALIZE_CHECK
841
86.5k
              range >>= 1;
842
86.5k
              code -= range & (((code - range) >> 31) - 1);
843
              /* if (code >= range) code -= range; */
844
86.5k
            }
845
86.5k
            while (--numDirectBits);
846
10.5k
            prob = probs + Align;
847
10.5k
            numDirectBits = kNumAlignBits;
848
10.5k
          }
849
18.9k
          {
850
18.9k
            unsigned i = 1;
851
18.9k
            unsigned m = 1;
852
18.9k
            do
853
68.0k
            {
854
68.0k
              REV_BIT_CHECK(prob, i, m);
855
65.6k
            }
856
65.6k
            while (--numDirectBits);
857
18.9k
          }
858
18.9k
        }
859
23.6k
      }
860
941k
    }
861
597k
  }
862
519k
  NORMALIZE_CHECK;
863
514k
  return res;
864
519k
}
865
866
867
static void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState)
868
13.2k
{
869
13.2k
  p->remainLen = kMatchSpecLenStart + 1;
870
13.2k
  p->tempBufSize = 0;
871
872
13.2k
  if (initDic)
873
13.2k
  {
874
13.2k
    p->processedPos = 0;
875
13.2k
    p->checkDicSize = 0;
876
13.2k
    p->remainLen = kMatchSpecLenStart + 2;
877
13.2k
  }
878
13.2k
  if (initState)
879
13.2k
    p->remainLen = kMatchSpecLenStart + 2;
880
13.2k
}
881
882
void LzmaDec_Init(CLzmaDec *p)
883
13.2k
{
884
13.2k
  p->dicPos = 0;
885
13.2k
  LzmaDec_InitDicAndState(p, True, True);
886
13.2k
}
887
888
889
SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
890
    ELzmaFinishMode finishMode, ELzmaStatus *status, SizeT memlimit)
891
3.32M
{
892
3.32M
  SizeT inSize = *srcLen;
893
3.32M
  (*srcLen) = 0;
894
  
895
3.32M
  *status = LZMA_STATUS_NOT_SPECIFIED;
896
897
3.32M
  if (p->remainLen > kMatchSpecLenStart)
898
14.8k
  {
899
75.0k
    for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
900
60.1k
      p->tempBuf[p->tempBufSize++] = *src++;
901
14.8k
    if (p->tempBufSize != 0 && p->tempBuf[0] != 0)
902
1.51k
      return SZ_ERROR_DATA;
903
13.3k
    if (p->tempBufSize < RC_INIT_SIZE)
904
2.35k
    {
905
2.35k
      *status = LZMA_STATUS_NEEDS_MORE_INPUT;
906
2.35k
      return SZ_OK;
907
2.35k
    }
908
10.9k
    p->code =
909
10.9k
        ((UInt32)p->tempBuf[1] << 24)
910
10.9k
      | ((UInt32)p->tempBuf[2] << 16)
911
10.9k
      | ((UInt32)p->tempBuf[3] << 8)
912
10.9k
      | ((UInt32)p->tempBuf[4]);
913
10.9k
    p->range = 0xFFFFFFFF;
914
10.9k
    p->tempBufSize = 0;
915
916
10.9k
    if (p->remainLen > kMatchSpecLenStart + 1)
917
10.9k
    {
918
10.9k
      SizeT numProbs = LzmaProps_GetNumProbs(&p->prop);
919
10.9k
      SizeT i;
920
10.9k
      CLzmaProb *probs = p->probs;
921
2.97G
      for (i = 0; i < numProbs; i++)
922
2.97G
        probs[i] = kBitModelTotal >> 1;
923
10.9k
      p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
924
10.9k
      p->state = 0;
925
10.9k
    }
926
927
10.9k
    p->remainLen = 0;
928
10.9k
  }
929
930
3.31M
  LzmaDec_WriteRem(p, dicLimit);
931
932
7.02M
  while (p->remainLen != kMatchSpecLenStart)
933
7.02M
  {
934
7.02M
      int checkEndMarkNow = 0;
935
936
7.02M
      if (p->dicPos >= dicLimit)
937
3.24M
      {
938
3.24M
        if (p->remainLen == 0 && p->code == 0)
939
2.07k
        {
940
2.07k
          *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
941
2.07k
          return SZ_OK;
942
2.07k
        }
943
3.24M
        if (finishMode == LZMA_FINISH_ANY)
944
3.24M
        {
945
3.24M
          *status = LZMA_STATUS_NOT_FINISHED;
946
3.24M
          return SZ_OK;
947
3.24M
        }
948
0
        if (p->remainLen != 0)
949
0
        {
950
0
          *status = LZMA_STATUS_NOT_FINISHED;
951
0
          return SZ_ERROR_DATA;
952
0
        }
953
0
        checkEndMarkNow = 1;
954
0
      }
955
956
3.78M
      if (p->tempBufSize == 0)
957
3.76M
      {
958
3.76M
        SizeT processed;
959
3.76M
        const Byte *bufLimit;
960
3.76M
        if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
961
584k
        {
962
584k
          int dummyRes = LzmaDec_TryDummy(p, src, inSize);
963
584k
          if (dummyRes == DUMMY_ERROR)
964
66.6k
          {
965
66.6k
            memcpy(p->tempBuf, src, inSize);
966
66.6k
            p->tempBufSize = (unsigned)inSize;
967
66.6k
            (*srcLen) += inSize;
968
66.6k
            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
969
66.6k
            return SZ_OK;
970
66.6k
          }
971
517k
          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
972
0
          {
973
0
            *status = LZMA_STATUS_NOT_FINISHED;
974
0
            return SZ_ERROR_DATA;
975
0
          }
976
517k
          bufLimit = src;
977
517k
        }
978
3.18M
        else
979
3.18M
          bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
980
3.70M
        p->buf = src;
981
3.70M
        if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit, memlimit) != 0)
982
2.41k
          return SZ_ERROR_DATA;
983
3.69M
        processed = (SizeT)(p->buf - src);
984
3.69M
        (*srcLen) += processed;
985
3.69M
        src += processed;
986
3.69M
        inSize -= processed;
987
3.69M
      }
988
14.2k
      else
989
14.2k
      {
990
14.2k
        unsigned rem = p->tempBufSize, lookAhead = 0;
991
54.8k
        while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
992
40.5k
          p->tempBuf[rem++] = src[lookAhead++];
993
14.2k
        p->tempBufSize = rem;
994
14.2k
        if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
995
13.3k
        {
996
13.3k
          int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, (SizeT)rem);
997
13.3k
          if (dummyRes == DUMMY_ERROR)
998
6.33k
          {
999
6.33k
            (*srcLen) += (SizeT)lookAhead;
1000
6.33k
            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
1001
6.33k
            return SZ_OK;
1002
6.33k
          }
1003
6.96k
          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
1004
0
          {
1005
0
            *status = LZMA_STATUS_NOT_FINISHED;
1006
0
            return SZ_ERROR_DATA;
1007
0
          }
1008
6.96k
        }
1009
7.91k
        p->buf = p->tempBuf;
1010
7.91k
        if (LzmaDec_DecodeReal2(p, dicLimit, p->buf, memlimit) != 0)
1011
875
          return SZ_ERROR_DATA;
1012
        
1013
7.04k
        {
1014
7.04k
          unsigned kkk = (unsigned)(p->buf - p->tempBuf);
1015
7.04k
          if (rem < kkk)
1016
0
            return SZ_ERROR_FAIL; /* some internal error */
1017
7.04k
          rem -= kkk;
1018
7.04k
          if (lookAhead < rem)
1019
0
            return SZ_ERROR_FAIL; /* some internal error */
1020
7.04k
          lookAhead -= rem;
1021
7.04k
        }
1022
0
        (*srcLen) += (SizeT)lookAhead;
1023
7.04k
        src += lookAhead;
1024
7.04k
        inSize -= (SizeT)lookAhead;
1025
7.04k
        p->tempBufSize = 0;
1026
7.04k
      }
1027
3.78M
  }
1028
  
1029
823
  if (p->code != 0)
1030
431
    return SZ_ERROR_DATA;
1031
392
  *status = LZMA_STATUS_FINISHED_WITH_MARK;
1032
392
  return SZ_OK;
1033
823
}
1034
1035
1036
SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status, SizeT memlimit)
1037
1.37M
{
1038
1.37M
  SizeT outSize = *destLen;
1039
1.37M
  SizeT inSize = *srcLen;
1040
1.37M
  *srcLen = *destLen = 0;
1041
1.37M
  for (;;)
1042
3.32M
  {
1043
3.32M
    SizeT inSizeCur = inSize, outSizeCur, dicPos;
1044
3.32M
    ELzmaFinishMode curFinishMode;
1045
3.32M
    SRes res;
1046
3.32M
    if (p->dicPos == p->dicBufSize) {
1047
1.95M
      if (p->dicBufSize < p->prop.dicSize) {
1048
5.65k
        if (p->dicBufSize < memlimit) {
1049
5.24k
          p->dicBufSize = p->dicBufSize << 2;
1050
5.24k
          if (p->dicBufSize > memlimit) {
1051
0
            p->dicBufSize = memlimit;
1052
0
          }
1053
5.24k
          if (p->dicBufSize > p->prop.dicSize) {
1054
1.18k
            p->dicBufSize = p->prop.dicSize;
1055
1.18k
          }
1056
5.24k
          Byte *tmp = realloc(p->dic, p->dicBufSize);
1057
5.24k
          if (!tmp) {
1058
0
            return SZ_ERROR_MEM;
1059
0
          }
1060
5.24k
          p->dic = tmp;
1061
5.24k
        } else {
1062
411
          return SZ_ERROR_MEM;
1063
411
        }
1064
1.94M
      } else {
1065
1.94M
        p->dicPos = 0;
1066
1.94M
      }
1067
1.95M
    }
1068
3.32M
    dicPos = p->dicPos;
1069
3.32M
    if (outSize > p->dicBufSize - dicPos)
1070
1.95M
    {
1071
1.95M
      outSizeCur = p->dicBufSize;
1072
1.95M
      curFinishMode = LZMA_FINISH_ANY;
1073
1.95M
    }
1074
1.36M
    else
1075
1.36M
    {
1076
1.36M
      outSizeCur = dicPos + outSize;
1077
1.36M
      curFinishMode = finishMode;
1078
1.36M
    }
1079
1080
3.32M
    res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status, memlimit);
1081
3.32M
    src += inSizeCur;
1082
3.32M
    inSize -= inSizeCur;
1083
3.32M
    *srcLen += inSizeCur;
1084
3.32M
    outSizeCur = p->dicPos - dicPos;
1085
3.32M
    memcpy(dest, p->dic + dicPos, outSizeCur);
1086
3.32M
    dest += outSizeCur;
1087
3.32M
    outSize -= outSizeCur;
1088
3.32M
    *destLen += outSizeCur;
1089
3.32M
    if (res != 0)
1090
5.23k
      return res;
1091
3.31M
    if (outSizeCur == 0 || outSize == 0)
1092
1.36M
      return SZ_OK;
1093
3.31M
  }
1094
1.37M
}
1095
1096
void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc)
1097
27.5k
{
1098
27.5k
  ISzAlloc_Free(alloc, p->probs);
1099
27.5k
  p->probs = NULL;
1100
27.5k
}
1101
1102
static void LzmaDec_FreeDict(CLzmaDec *p, ISzAllocPtr alloc)
1103
27.5k
{
1104
27.5k
  ISzAlloc_Free(alloc, p->dic);
1105
27.5k
  p->dic = NULL;
1106
27.5k
}
1107
1108
void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc)
1109
14.3k
{
1110
14.3k
  LzmaDec_FreeProbs(p, alloc);
1111
14.3k
  LzmaDec_FreeDict(p, alloc);
1112
14.3k
}
1113
1114
SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
1115
13.8k
{
1116
13.8k
  UInt32 dicSize;
1117
13.8k
  Byte d;
1118
  
1119
13.8k
  if (size < LZMA_PROPS_SIZE)
1120
0
    return SZ_ERROR_UNSUPPORTED;
1121
13.8k
  else
1122
13.8k
    dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
1123
 
1124
13.8k
  if (dicSize < LZMA_DIC_MIN)
1125
3.37k
    dicSize = LZMA_DIC_MIN;
1126
13.8k
  p->dicSize = dicSize;
1127
1128
13.8k
  d = data[0];
1129
13.8k
  if (d >= (9 * 5 * 5))
1130
614
    return SZ_ERROR_UNSUPPORTED;
1131
1132
13.2k
  p->lc = (Byte)(d % 9);
1133
13.2k
  d /= 9;
1134
13.2k
  p->pb = (Byte)(d / 5);
1135
13.2k
  p->lp = (Byte)(d % 5);
1136
13.2k
  p->_pad_ = 0;
1137
1138
13.2k
  return SZ_OK;
1139
13.8k
}
1140
1141
static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAllocPtr alloc)
1142
13.2k
{
1143
13.2k
  UInt32 numProbs = LzmaProps_GetNumProbs(propNew);
1144
13.2k
  if (!p->probs || numProbs != p->numProbs)
1145
13.2k
  {
1146
13.2k
    LzmaDec_FreeProbs(p, alloc);
1147
13.2k
    p->probs = (CLzmaProb *)ISzAlloc_Alloc(alloc, numProbs * sizeof(CLzmaProb));
1148
13.2k
    if (!p->probs)
1149
0
      return SZ_ERROR_MEM;
1150
13.2k
    p->probs_1664 = p->probs + 1664;
1151
13.2k
    p->numProbs = numProbs;
1152
13.2k
  }
1153
13.2k
  return SZ_OK;
1154
13.2k
}
1155
1156
SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc)
1157
0
{
1158
0
  CLzmaProps propNew;
1159
0
  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
1160
0
  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
1161
0
  p->prop = propNew;
1162
0
  return SZ_OK;
1163
0
}
1164
1165
SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc)
1166
13.8k
{
1167
13.8k
  CLzmaProps propNew;
1168
13.8k
  SizeT dicBufSize;
1169
13.8k
  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
1170
13.2k
  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
1171
1172
13.2k
  {
1173
13.2k
    UInt32 dictSize = propNew.dicSize;
1174
13.2k
    SizeT mask = ((UInt32)1 << 12) - 1;
1175
13.2k
         if (dictSize >= ((UInt32)1 << 30)) mask = ((UInt32)1 << 22) - 1;
1176
8.73k
    else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1;;
1177
13.2k
    dicBufSize = ((SizeT)dictSize + mask) & ~mask;
1178
13.2k
    if (dicBufSize < dictSize)
1179
0
      dicBufSize = dictSize;
1180
13.2k
  }
1181
13.2k
    if (dicBufSize > LZMA_DIC_MIN) {
1182
10.0k
        dicBufSize = LZMA_DIC_MIN;
1183
10.0k
    }
1184
1185
13.2k
  if (!p->dic || dicBufSize != p->dicBufSize)
1186
13.2k
  {
1187
13.2k
    LzmaDec_FreeDict(p, alloc);
1188
13.2k
    p->dic = (Byte *)ISzAlloc_Alloc(alloc, dicBufSize);
1189
13.2k
    if (!p->dic)
1190
0
    {
1191
0
      LzmaDec_FreeProbs(p, alloc);
1192
0
      return SZ_ERROR_MEM;
1193
0
    }
1194
13.2k
  }
1195
13.2k
  p->dicBufSize = dicBufSize;
1196
13.2k
  p->prop = propNew;
1197
13.2k
  return SZ_OK;
1198
13.2k
}
1199
1200
SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
1201
    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
1202
    ELzmaStatus *status, ISzAllocPtr alloc)
1203
0
{
1204
0
  CLzmaDec p;
1205
0
  SRes res;
1206
0
  SizeT outSize = *destLen, inSize = *srcLen;
1207
0
  *destLen = *srcLen = 0;
1208
0
  *status = LZMA_STATUS_NOT_SPECIFIED;
1209
0
  if (inSize < RC_INIT_SIZE)
1210
0
    return SZ_ERROR_INPUT_EOF;
1211
0
  LzmaDec_Construct(&p);
1212
0
  RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc));
1213
0
  p.dic = dest;
1214
0
  p.dicBufSize = outSize;
1215
0
  LzmaDec_Init(&p);
1216
0
  *srcLen = inSize;
1217
0
  res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status, SIZE_MAX);
1218
0
  *destLen = p.dicPos;
1219
0
  if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
1220
0
    res = SZ_ERROR_INPUT_EOF;
1221
0
  LzmaDec_FreeProbs(&p, alloc);
1222
0
  return res;
1223
0
}