Coverage Report

Created: 2025-08-26 06:45

/src/bzip2/decompress.c
Line
Count
Source (jump to first uncovered line)
1
2
/*-------------------------------------------------------------*/
3
/*--- Decompression machinery                               ---*/
4
/*---                                          decompress.c ---*/
5
/*-------------------------------------------------------------*/
6
7
/* ------------------------------------------------------------------
8
   This file is part of bzip2/libbzip2, a program and library for
9
   lossless, block-sorting data compression.
10
11
   bzip2/libbzip2 version 1.0.8 of 13 July 2019
12
   Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
13
14
   Please read the WARNING, DISCLAIMER and PATENTS sections in the 
15
   README file.
16
17
   This program is released under the terms of the license contained
18
   in the file LICENSE.
19
   ------------------------------------------------------------------ */
20
21
22
#include "bzlib_private.h"
23
24
25
/*---------------------------------------------------*/
26
static
27
void makeMaps_d ( DState* s )
28
3.94k
{
29
3.94k
   Int32 i;
30
3.94k
   s->nInUse = 0;
31
1.01M
   for (i = 0; i < 256; i++)
32
1.00M
      if (s->inUse[i]) {
33
459k
         s->seqToUnseq[s->nInUse] = i;
34
459k
         s->nInUse++;
35
459k
      }
36
3.94k
}
37
38
39
/*---------------------------------------------------*/
40
#define RETURN(rrr)                               \
41
1.28G
   { retVal = rrr; goto save_state_and_return; };
42
43
#define GET_BITS(lll,vvv,nnn)                     \
44
566M
   case lll: s->state = lll;                      \
45
698M
   while (True) {                                 \
46
698M
      if (s->bsLive >= nnn) {                     \
47
566M
         UInt32 v;                                \
48
566M
         v = (s->bsBuff >>                        \
49
566M
             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
50
566M
         s->bsLive -= nnn;                        \
51
566M
         vvv = v;                                 \
52
566M
         break;                                   \
53
566M
      }                                           \
54
698M
      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
55
132M
      s->bsBuff                                   \
56
132M
         = (s->bsBuff << 8) |                     \
57
132M
           ((UInt32)                              \
58
132M
              (*((UChar*)(s->strm->next_in))));   \
59
132M
      s->bsLive += 8;                             \
60
132M
      s->strm->next_in++;                         \
61
132M
      s->strm->avail_in--;                        \
62
132M
      s->strm->total_in_lo32++;                   \
63
132M
      if (s->strm->total_in_lo32 == 0)            \
64
132M
         s->strm->total_in_hi32++;                \
65
132M
   }
66
67
#define GET_UCHAR(lll,uuu)                        \
68
98.8k
   GET_BITS(lll,uuu,8)
69
70
#define GET_BIT(lll,uuu)                          \
71
415M
   GET_BITS(lll,uuu,1)
72
73
/*---------------------------------------------------*/
74
150M
#define GET_MTF_VAL(label1,label2,lval)           \
75
150M
{                                                 \
76
150M
   if (groupPos == 0) {                           \
77
3.01M
      groupNo++;                                  \
78
3.01M
      if (groupNo >= nSelectors)                  \
79
3.01M
         RETURN(BZ_DATA_ERROR);                   \
80
3.01M
      groupPos = BZ_G_SIZE;                       \
81
3.01M
      gSel = s->selector[groupNo];                \
82
3.01M
      gMinlen = s->minLens[gSel];                 \
83
3.01M
      gLimit = &(s->limit[gSel][0]);              \
84
3.01M
      gPerm = &(s->perm[gSel][0]);                \
85
3.01M
      gBase = &(s->base[gSel][0]);                \
86
3.01M
   }                                              \
87
150M
   groupPos--;                                    \
88
150M
   zn = gMinlen;                                  \
89
150M
   GET_BITS(label1, zvec, zn);                    \
90
552M
   while (1) {                                    \
91
552M
      if (zn > 20 /* the longest code */)         \
92
552M
         RETURN(BZ_DATA_ERROR);                   \
93
552M
      if (zvec <= gLimit[zn]) break;              \
94
552M
      zn++;                                       \
95
401M
      GET_BIT(label2, zj);                        \
96
401M
      zvec = (zvec << 1) | zj;                    \
97
401M
   };                                             \
98
150M
   if (zvec - gBase[zn] < 0                       \
99
150M
       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
100
150M
      RETURN(BZ_DATA_ERROR);                      \
101
150M
   lval = gPerm[zvec - gBase[zn]];                \
102
150M
}
103
104
105
/*---------------------------------------------------*/
106
Int32 BZ2_decompress ( DState* s )
107
33.3k
{
108
33.3k
   UChar      uc;
109
33.3k
   Int32      retVal;
110
33.3k
   Int32      minLen, maxLen;
111
33.3k
   bz_stream* strm = s->strm;
112
113
   /* stuff that needs to be saved/restored */
114
33.3k
   Int32  i;
115
33.3k
   Int32  j;
116
33.3k
   Int32  t;
117
33.3k
   Int32  alphaSize;
118
33.3k
   Int32  nGroups;
119
33.3k
   Int32  nSelectors;
120
33.3k
   Int32  EOB;
121
33.3k
   Int32  groupNo;
122
33.3k
   Int32  groupPos;
123
33.3k
   Int32  nextSym;
124
33.3k
   Int32  nblockMAX;
125
33.3k
   Int32  nblock;
126
33.3k
   Int32  es;
127
33.3k
   Int32  N;
128
33.3k
   Int32  curr;
129
33.3k
   Int32  zt;
130
33.3k
   Int32  zn; 
131
33.3k
   Int32  zvec;
132
33.3k
   Int32  zj;
133
33.3k
   Int32  gSel;
134
33.3k
   Int32  gMinlen;
135
33.3k
   Int32* gLimit;
136
33.3k
   Int32* gBase;
137
33.3k
   Int32* gPerm;
138
139
33.3k
   if (s->state == BZ_X_MAGIC_1) {
140
      /*initialise the save area*/
141
3.65k
      s->save_i           = 0;
142
3.65k
      s->save_j           = 0;
143
3.65k
      s->save_t           = 0;
144
3.65k
      s->save_alphaSize   = 0;
145
3.65k
      s->save_nGroups     = 0;
146
3.65k
      s->save_nSelectors  = 0;
147
3.65k
      s->save_EOB         = 0;
148
3.65k
      s->save_groupNo     = 0;
149
3.65k
      s->save_groupPos    = 0;
150
3.65k
      s->save_nextSym     = 0;
151
3.65k
      s->save_nblockMAX   = 0;
152
3.65k
      s->save_nblock      = 0;
153
3.65k
      s->save_es          = 0;
154
3.65k
      s->save_N           = 0;
155
3.65k
      s->save_curr        = 0;
156
3.65k
      s->save_zt          = 0;
157
3.65k
      s->save_zn          = 0;
158
3.65k
      s->save_zvec        = 0;
159
3.65k
      s->save_zj          = 0;
160
3.65k
      s->save_gSel        = 0;
161
3.65k
      s->save_gMinlen     = 0;
162
3.65k
      s->save_gLimit      = NULL;
163
3.65k
      s->save_gBase       = NULL;
164
3.65k
      s->save_gPerm       = NULL;
165
3.65k
   }
166
167
   /*restore from the save area*/
168
33.3k
   i           = s->save_i;
169
33.3k
   j           = s->save_j;
170
33.3k
   t           = s->save_t;
171
33.3k
   alphaSize   = s->save_alphaSize;
172
33.3k
   nGroups     = s->save_nGroups;
173
33.3k
   nSelectors  = s->save_nSelectors;
174
33.3k
   EOB         = s->save_EOB;
175
33.3k
   groupNo     = s->save_groupNo;
176
33.3k
   groupPos    = s->save_groupPos;
177
33.3k
   nextSym     = s->save_nextSym;
178
33.3k
   nblockMAX   = s->save_nblockMAX;
179
33.3k
   nblock      = s->save_nblock;
180
33.3k
   es          = s->save_es;
181
33.3k
   N           = s->save_N;
182
33.3k
   curr        = s->save_curr;
183
33.3k
   zt          = s->save_zt;
184
33.3k
   zn          = s->save_zn; 
185
33.3k
   zvec        = s->save_zvec;
186
33.3k
   zj          = s->save_zj;
187
33.3k
   gSel        = s->save_gSel;
188
33.3k
   gMinlen     = s->save_gMinlen;
189
33.3k
   gLimit      = s->save_gLimit;
190
33.3k
   gBase       = s->save_gBase;
191
33.3k
   gPerm       = s->save_gPerm;
192
193
33.3k
   retVal = BZ_OK;
194
195
33.3k
   switch (s->state) {
196
197
3.65k
      GET_UCHAR(BZ_X_MAGIC_1, uc);
198
3.65k
      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
199
200
3.65k
      GET_UCHAR(BZ_X_MAGIC_2, uc);
201
3.65k
      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
202
203
3.65k
      GET_UCHAR(BZ_X_MAGIC_3, uc)
204
3.65k
      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
205
206
3.65k
      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
207
3.65k
      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
208
3.65k
          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
209
3.65k
      s->blockSize100k -= BZ_HDR_0;
210
211
3.65k
      if (s->smallDecompress) {
212
0
         s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
213
0
         s->ll4  = BZALLOC( 
214
0
                      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 
215
0
                   );
216
0
         if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
217
3.65k
      } else {
218
3.65k
         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
219
3.65k
         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
220
3.65k
      }
221
222
7.59k
      GET_UCHAR(BZ_X_BLKHDR_1, uc);
223
224
7.59k
      if (uc == 0x17) goto endhdr_2;
225
3.94k
      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
226
3.94k
      GET_UCHAR(BZ_X_BLKHDR_2, uc);
227
3.94k
      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
228
3.94k
      GET_UCHAR(BZ_X_BLKHDR_3, uc);
229
3.94k
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
230
3.94k
      GET_UCHAR(BZ_X_BLKHDR_4, uc);
231
3.94k
      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
232
3.94k
      GET_UCHAR(BZ_X_BLKHDR_5, uc);
233
3.94k
      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
234
3.94k
      GET_UCHAR(BZ_X_BLKHDR_6, uc);
235
3.94k
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
236
237
3.94k
      s->currBlockNo++;
238
3.94k
      if (s->verbosity >= 2)
239
0
         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
240
 
241
3.94k
      s->storedBlockCRC = 0;
242
3.94k
      GET_UCHAR(BZ_X_BCRC_1, uc);
243
3.94k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
244
3.94k
      GET_UCHAR(BZ_X_BCRC_2, uc);
245
3.94k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
246
3.94k
      GET_UCHAR(BZ_X_BCRC_3, uc);
247
3.94k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
248
3.94k
      GET_UCHAR(BZ_X_BCRC_4, uc);
249
3.94k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
250
251
3.94k
      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
252
253
3.94k
      s->origPtr = 0;
254
3.94k
      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
255
3.94k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
256
3.94k
      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
257
3.94k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
258
3.94k
      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
259
3.94k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
260
261
3.94k
      if (s->origPtr < 0)
262
3.94k
         RETURN(BZ_DATA_ERROR);
263
3.94k
      if (s->origPtr > 10 + 100000*s->blockSize100k) 
264
3.94k
         RETURN(BZ_DATA_ERROR);
265
266
      /*--- Receive the mapping table ---*/
267
66.9k
      for (i = 0; i < 16; i++) {
268
63.0k
         GET_BIT(BZ_X_MAPPING_1, uc);
269
63.0k
         if (uc == 1) 
270
43.6k
            s->inUse16[i] = True; else 
271
19.4k
            s->inUse16[i] = False;
272
63.0k
      }
273
274
1.01M
      for (i = 0; i < 256; i++) s->inUse[i] = False;
275
276
66.9k
      for (i = 0; i < 16; i++)
277
63.0k
         if (s->inUse16[i])
278
741k
            for (j = 0; j < 16; j++) {
279
697k
               GET_BIT(BZ_X_MAPPING_2, uc);
280
697k
               if (uc == 1) s->inUse[i * 16 + j] = True;
281
697k
            }
282
3.94k
      makeMaps_d ( s );
283
3.94k
      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
284
3.94k
      alphaSize = s->nInUse+2;
285
286
      /*--- Now the selectors ---*/
287
3.94k
      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
288
3.94k
      if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR);
289
3.94k
      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
290
3.94k
      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
291
3.02M
      for (i = 0; i < nSelectors; i++) {
292
3.01M
         j = 0;
293
8.16M
         while (True) {
294
8.16M
            GET_BIT(BZ_X_SELECTOR_3, uc);
295
8.16M
            if (uc == 0) break;
296
5.14M
            j++;
297
5.14M
            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
298
5.14M
         }
299
         /* Having more than BZ_MAX_SELECTORS doesn't make much sense
300
            since they will never be used, but some implementations might
301
            "round up" the number of selectors, so just ignore those. */
302
3.01M
         if (i < BZ_MAX_SELECTORS)
303
3.01M
           s->selectorMtf[i] = j;
304
3.01M
      }
305
3.94k
      if (nSelectors > BZ_MAX_SELECTORS)
306
0
        nSelectors = BZ_MAX_SELECTORS;
307
308
      /*--- Undo the MTF values for the selectors. ---*/
309
3.94k
      {
310
3.94k
         UChar pos[BZ_N_GROUPS], tmp, v;
311
19.0k
         for (v = 0; v < nGroups; v++) pos[v] = v;
312
   
313
3.02M
         for (i = 0; i < nSelectors; i++) {
314
3.01M
            v = s->selectorMtf[i];
315
3.01M
            tmp = pos[v];
316
8.16M
            while (v > 0) { pos[v] = pos[v-1]; v--; }
317
3.01M
            pos[0] = tmp;
318
3.01M
            s->selector[i] = tmp;
319
3.01M
         }
320
3.94k
      }
321
322
      /*--- Now the coding tables ---*/
323
19.0k
      for (t = 0; t < nGroups; t++) {
324
15.1k
         GET_BITS(BZ_X_CODING_1, curr, 5);
325
2.51M
         for (i = 0; i < alphaSize; i++) {
326
3.54M
            while (True) {
327
3.54M
               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
328
3.54M
               GET_BIT(BZ_X_CODING_2, uc);
329
3.54M
               if (uc == 0) break;
330
1.04M
               GET_BIT(BZ_X_CODING_3, uc);
331
1.04M
               if (uc == 0) curr++; else curr--;
332
1.04M
            }
333
2.49M
            s->len[t][i] = curr;
334
2.49M
         }
335
15.1k
      }
336
337
      /*--- Create the Huffman decoding tables ---*/
338
19.0k
      for (t = 0; t < nGroups; t++) {
339
15.1k
         minLen = 32;
340
15.1k
         maxLen = 0;
341
2.51M
         for (i = 0; i < alphaSize; i++) {
342
2.49M
            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
343
2.49M
            if (s->len[t][i] < minLen) minLen = s->len[t][i];
344
2.49M
         }
345
15.1k
         BZ2_hbCreateDecodeTables ( 
346
15.1k
            &(s->limit[t][0]), 
347
15.1k
            &(s->base[t][0]), 
348
15.1k
            &(s->perm[t][0]), 
349
15.1k
            &(s->len[t][0]),
350
15.1k
            minLen, maxLen, alphaSize
351
15.1k
         );
352
15.1k
         s->minLens[t] = minLen;
353
15.1k
      }
354
355
      /*--- Now the MTF values ---*/
356
357
3.94k
      EOB      = s->nInUse+1;
358
3.94k
      nblockMAX = 100000 * s->blockSize100k;
359
3.94k
      groupNo  = -1;
360
3.94k
      groupPos = 0;
361
362
1.01M
      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
363
364
      /*-- MTF init --*/
365
3.94k
      {
366
3.94k
         Int32 ii, jj, kk;
367
3.94k
         kk = MTFA_SIZE-1;
368
66.9k
         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
369
1.07M
            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
370
1.00M
               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
371
1.00M
               kk--;
372
1.00M
            }
373
63.0k
            s->mtfbase[ii] = kk + 1;
374
63.0k
         }
375
3.94k
      }
376
      /*-- end MTF init --*/
377
378
3.94k
      nblock = 0;
379
19.7k
      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
380
381
146M
      while (True) {
382
383
146M
         if (nextSym == EOB) break;
384
385
146M
         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
386
387
19.3M
            es = -1;
388
19.3M
            N = 1;
389
23.3M
            do {
390
               /* Check that N doesn't get too big, so that es doesn't
391
                  go negative.  The maximum value that can be
392
                  RUNA/RUNB encoded is equal to the block size (post
393
                  the initial RLE), viz, 900k, so bounding N at 2
394
                  million should guard against overflow without
395
                  rejecting any legitimate inputs. */
396
23.3M
               if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
397
23.3M
               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
398
3.02M
               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
399
23.3M
               N = N * 2;
400
116M
               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
401
116M
            }
402
23.3M
               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
403
404
19.3M
            es++;
405
19.3M
            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
406
19.3M
            s->unzftab[uc] += es;
407
408
19.3M
            if (s->smallDecompress)
409
0
               while (es > 0) {
410
0
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
411
0
                  s->ll16[nblock] = (UInt16)uc;
412
0
                  nblock++;
413
0
                  es--;
414
0
               }
415
19.3M
            else
416
307M
               while (es > 0) {
417
287M
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
418
287M
                  s->tt[nblock] = (UInt32)uc;
419
287M
                  nblock++;
420
287M
                  es--;
421
287M
               };
422
423
19.3M
            continue;
424
425
127M
         } else {
426
427
127M
            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
428
429
            /*-- uc = MTF ( nextSym-1 ) --*/
430
127M
            {
431
127M
               Int32 ii, jj, kk, pp, lno, off;
432
127M
               UInt32 nn;
433
127M
               nn = (UInt32)(nextSym - 1);
434
435
127M
               if (nn < MTFL_SIZE) {
436
                  /* avoid general-case expense */
437
15.8M
                  pp = s->mtfbase[0];
438
15.8M
                  uc = s->mtfa[pp+nn];
439
36.9M
                  while (nn > 3) {
440
21.1M
                     Int32 z = pp+nn;
441
21.1M
                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
442
21.1M
                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
443
21.1M
                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
444
21.1M
                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
445
21.1M
                     nn -= 4;
446
21.1M
                  }
447
40.1M
                  while (nn > 0) { 
448
24.2M
                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
449
24.2M
                  };
450
15.8M
                  s->mtfa[pp] = uc;
451
111M
               } else { 
452
                  /* general case */
453
111M
                  lno = nn / MTFL_SIZE;
454
111M
                  off = nn % MTFL_SIZE;
455
111M
                  pp = s->mtfbase[lno] + off;
456
111M
                  uc = s->mtfa[pp];
457
943M
                  while (pp > s->mtfbase[lno]) { 
458
832M
                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
459
832M
                  };
460
111M
                  s->mtfbase[lno]++;
461
952M
                  while (lno > 0) {
462
841M
                     s->mtfbase[lno]--;
463
841M
                     s->mtfa[s->mtfbase[lno]] 
464
841M
                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
465
841M
                     lno--;
466
841M
                  }
467
111M
                  s->mtfbase[0]--;
468
111M
                  s->mtfa[s->mtfbase[0]] = uc;
469
111M
                  if (s->mtfbase[0] == 0) {
470
28.3k
                     kk = MTFA_SIZE-1;
471
481k
                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
472
7.70M
                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
473
7.25M
                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
474
7.25M
                           kk--;
475
7.25M
                        }
476
453k
                        s->mtfbase[ii] = kk + 1;
477
453k
                     }
478
28.3k
                  }
479
111M
               }
480
127M
            }
481
            /*-- end uc = MTF ( nextSym-1 ) --*/
482
483
127M
            s->unzftab[s->seqToUnseq[uc]]++;
484
127M
            if (s->smallDecompress)
485
0
               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
486
127M
               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
487
127M
            nblock++;
488
489
127M
            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
490
127M
            continue;
491
509M
         }
492
146M
      }
493
494
      /* Now we know what nblock is, we can do a better sanity
495
         check on s->origPtr.
496
      */
497
3.94k
      if (s->origPtr < 0 || s->origPtr >= nblock)
498
3.94k
         RETURN(BZ_DATA_ERROR);
499
500
      /*-- Set up cftab to facilitate generation of T^(-1) --*/
501
      /* Check: unzftab entries in range. */
502
1.01M
      for (i = 0; i <= 255; i++) {
503
1.00M
         if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
504
1.00M
            RETURN(BZ_DATA_ERROR);
505
1.00M
      }
506
      /* Actually generate cftab. */
507
3.94k
      s->cftab[0] = 0;
508
1.01M
      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
509
1.01M
      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
510
      /* Check: cftab entries in range. */
511
1.01M
      for (i = 0; i <= 256; i++) {
512
1.01M
         if (s->cftab[i] < 0 || s->cftab[i] > nblock) {
513
            /* s->cftab[i] can legitimately be == nblock */
514
0
            RETURN(BZ_DATA_ERROR);
515
0
         }
516
1.01M
      }
517
      /* Check: cftab entries non-descending. */
518
1.01M
      for (i = 1; i <= 256; i++) {
519
1.00M
         if (s->cftab[i-1] > s->cftab[i]) {
520
0
            RETURN(BZ_DATA_ERROR);
521
0
         }
522
1.00M
      }
523
524
3.94k
      s->state_out_len = 0;
525
3.94k
      s->state_out_ch  = 0;
526
3.94k
      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
527
3.94k
      s->state = BZ_X_OUTPUT;
528
3.94k
      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
529
530
3.94k
      if (s->smallDecompress) {
531
532
         /*-- Make a copy of cftab, used in generation of T --*/
533
0
         for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
534
535
         /*-- compute the T vector --*/
536
0
         for (i = 0; i < nblock; i++) {
537
0
            uc = (UChar)(s->ll16[i]);
538
0
            SET_LL(i, s->cftabCopy[uc]);
539
0
            s->cftabCopy[uc]++;
540
0
         }
541
542
         /*-- Compute T^(-1) by pointer reversal on T --*/
543
0
         i = s->origPtr;
544
0
         j = GET_LL(i);
545
0
         do {
546
0
            Int32 tmp = GET_LL(j);
547
0
            SET_LL(j, i);
548
0
            i = j;
549
0
            j = tmp;
550
0
         }
551
0
            while (i != s->origPtr);
552
553
0
         s->tPos = s->origPtr;
554
0
         s->nblock_used = 0;
555
0
         if (s->blockRandomised) {
556
0
            BZ_RAND_INIT_MASK;
557
0
            BZ_GET_SMALL(s->k0); s->nblock_used++;
558
0
            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
559
0
         } else {
560
0
            BZ_GET_SMALL(s->k0); s->nblock_used++;
561
0
         }
562
563
3.94k
      } else {
564
565
         /*-- compute the T^(-1) vector --*/
566
415M
         for (i = 0; i < nblock; i++) {
567
415M
            uc = (UChar)(s->tt[i] & 0xff);
568
415M
            s->tt[s->cftab[uc]] |= (i << 8);
569
415M
            s->cftab[uc]++;
570
415M
         }
571
572
3.94k
         s->tPos = s->tt[s->origPtr] >> 8;
573
3.94k
         s->nblock_used = 0;
574
3.94k
         if (s->blockRandomised) {
575
0
            BZ_RAND_INIT_MASK;
576
0
            BZ_GET_FAST(s->k0); s->nblock_used++;
577
0
            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
578
3.94k
         } else {
579
3.94k
            BZ_GET_FAST(s->k0); s->nblock_used++;
580
3.94k
         }
581
582
3.94k
      }
583
584
3.94k
      RETURN(BZ_OK);
585
586
587
588
3.65k
    endhdr_2:
589
590
3.65k
      GET_UCHAR(BZ_X_ENDHDR_2, uc);
591
3.65k
      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
592
3.66k
      GET_UCHAR(BZ_X_ENDHDR_3, uc);
593
3.65k
      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
594
3.65k
      GET_UCHAR(BZ_X_ENDHDR_4, uc);
595
3.65k
      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
596
3.65k
      GET_UCHAR(BZ_X_ENDHDR_5, uc);
597
3.65k
      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
598
3.65k
      GET_UCHAR(BZ_X_ENDHDR_6, uc);
599
3.65k
      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
600
601
3.65k
      s->storedCombinedCRC = 0;
602
3.66k
      GET_UCHAR(BZ_X_CCRC_1, uc);
603
3.65k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
604
3.66k
      GET_UCHAR(BZ_X_CCRC_2, uc);
605
3.65k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
606
3.66k
      GET_UCHAR(BZ_X_CCRC_3, uc);
607
3.65k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
608
3.66k
      GET_UCHAR(BZ_X_CCRC_4, uc);
609
3.65k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
610
611
3.65k
      s->state = BZ_X_IDLE;
612
3.65k
      RETURN(BZ_STREAM_END);
613
614
0
      default: AssertH ( False, 4001 );
615
33.3k
   }
616
617
0
   AssertH ( False, 4002 );
618
619
33.3k
   save_state_and_return:
620
621
33.3k
   s->save_i           = i;
622
33.3k
   s->save_j           = j;
623
33.3k
   s->save_t           = t;
624
33.3k
   s->save_alphaSize   = alphaSize;
625
33.3k
   s->save_nGroups     = nGroups;
626
33.3k
   s->save_nSelectors  = nSelectors;
627
33.3k
   s->save_EOB         = EOB;
628
33.3k
   s->save_groupNo     = groupNo;
629
33.3k
   s->save_groupPos    = groupPos;
630
33.3k
   s->save_nextSym     = nextSym;
631
33.3k
   s->save_nblockMAX   = nblockMAX;
632
33.3k
   s->save_nblock      = nblock;
633
33.3k
   s->save_es          = es;
634
33.3k
   s->save_N           = N;
635
33.3k
   s->save_curr        = curr;
636
33.3k
   s->save_zt          = zt;
637
33.3k
   s->save_zn          = zn;
638
33.3k
   s->save_zvec        = zvec;
639
33.3k
   s->save_zj          = zj;
640
33.3k
   s->save_gSel        = gSel;
641
33.3k
   s->save_gMinlen     = gMinlen;
642
33.3k
   s->save_gLimit      = gLimit;
643
33.3k
   s->save_gBase       = gBase;
644
33.3k
   s->save_gPerm       = gPerm;
645
646
33.3k
   return retVal;   
647
0
}
648
649
650
/*-------------------------------------------------------------*/
651
/*--- end                                      decompress.c ---*/
652
/*-------------------------------------------------------------*/