Coverage Report

Created: 2025-11-11 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/bzip2/decompress.c
Line
Count
Source
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
210k
{
29
210k
   Int32 i;
30
210k
   s->nInUse = 0;
31
54.0M
   for (i = 0; i < 256; i++)
32
53.7M
      if (s->inUse[i]) {
33
1.42M
         s->seqToUnseq[s->nInUse] = i;
34
1.42M
         s->nInUse++;
35
1.42M
      }
36
210k
}
37
38
39
/*---------------------------------------------------*/
40
#define RETURN(rrr)                               \
41
2.71G
   { retVal = rrr; goto save_state_and_return; };
42
43
#define GET_BITS(lll,vvv,nnn)                     \
44
1.37G
   case lll: s->state = lll;                      \
45
1.66G
   while (True) {                                 \
46
1.66G
      if (s->bsLive >= nnn) {                     \
47
1.37G
         UInt32 v;                                \
48
1.37G
         v = (s->bsBuff >>                        \
49
1.37G
             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
50
1.37G
         s->bsLive -= nnn;                        \
51
1.37G
         vvv = v;                                 \
52
1.37G
         break;                                   \
53
1.37G
      }                                           \
54
1.66G
      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
55
290M
      s->bsBuff                                   \
56
290M
         = (s->bsBuff << 8) |                     \
57
290M
           ((UInt32)                              \
58
290M
              (*((UChar*)(s->strm->next_in))));   \
59
290M
      s->bsLive += 8;                             \
60
290M
      s->strm->next_in++;                         \
61
290M
      s->strm->avail_in--;                        \
62
290M
      s->strm->total_in_lo32++;                   \
63
290M
      if (s->strm->total_in_lo32 == 0)            \
64
290M
         s->strm->total_in_hi32++;                \
65
290M
   }
66
67
#define GET_UCHAR(lll,uuu)                        \
68
2.83M
   GET_BITS(lll,uuu,8)
69
70
#define GET_BIT(lll,uuu)                          \
71
1.08G
   GET_BITS(lll,uuu,1)
72
73
/*---------------------------------------------------*/
74
279M
#define GET_MTF_VAL(label1,label2,lval)           \
75
279M
{                                                 \
76
279M
   if (groupPos == 0) {                           \
77
5.75M
      groupNo++;                                  \
78
5.75M
      if (groupNo >= nSelectors)                  \
79
5.75M
         RETURN(BZ_DATA_ERROR);                   \
80
5.75M
      groupPos = BZ_G_SIZE;                       \
81
5.75M
      gSel = s->selector[groupNo];                \
82
5.75M
      gMinlen = s->minLens[gSel];                 \
83
5.75M
      gLimit = &(s->limit[gSel][0]);              \
84
5.75M
      gPerm = &(s->perm[gSel][0]);                \
85
5.75M
      gBase = &(s->base[gSel][0]);                \
86
5.75M
   }                                              \
87
279M
   groupPos--;                                    \
88
279M
   zn = gMinlen;                                  \
89
279M
   GET_BITS(label1, zvec, zn);                    \
90
923M
   while (1) {                                    \
91
923M
      if (zn > 20 /* the longest code */)         \
92
923M
         RETURN(BZ_DATA_ERROR);                   \
93
923M
      if (zvec <= gLimit[zn]) break;              \
94
923M
      zn++;                                       \
95
644M
      GET_BIT(label2, zj);                        \
96
644M
      zvec = (zvec << 1) | zj;                    \
97
644M
   };                                             \
98
279M
   if (zvec - gBase[zn] < 0                       \
99
279M
       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
100
279M
      RETURN(BZ_DATA_ERROR);                      \
101
279M
   lval = gPerm[zvec - gBase[zn]];                \
102
279M
}
103
104
105
/*---------------------------------------------------*/
106
Int32 BZ2_decompress ( DState* s )
107
244k
{
108
244k
   UChar      uc;
109
244k
   Int32      retVal;
110
244k
   Int32      minLen, maxLen;
111
244k
   bz_stream* strm = s->strm;
112
113
   /* stuff that needs to be saved/restored */
114
244k
   Int32  i;
115
244k
   Int32  j;
116
244k
   Int32  t;
117
244k
   Int32  alphaSize;
118
244k
   Int32  nGroups;
119
244k
   Int32  nSelectors;
120
244k
   Int32  EOB;
121
244k
   Int32  groupNo;
122
244k
   Int32  groupPos;
123
244k
   Int32  nextSym;
124
244k
   Int32  nblockMAX;
125
244k
   Int32  nblock;
126
244k
   Int32  es;
127
244k
   Int32  N;
128
244k
   Int32  curr;
129
244k
   Int32  zt;
130
244k
   Int32  zn; 
131
244k
   Int32  zvec;
132
244k
   Int32  zj;
133
244k
   Int32  gSel;
134
244k
   Int32  gMinlen;
135
244k
   Int32* gLimit;
136
244k
   Int32* gBase;
137
244k
   Int32* gPerm;
138
139
244k
   if (s->state == BZ_X_MAGIC_1) {
140
      /*initialise the save area*/
141
12.2k
      s->save_i           = 0;
142
12.2k
      s->save_j           = 0;
143
12.2k
      s->save_t           = 0;
144
12.2k
      s->save_alphaSize   = 0;
145
12.2k
      s->save_nGroups     = 0;
146
12.2k
      s->save_nSelectors  = 0;
147
12.2k
      s->save_EOB         = 0;
148
12.2k
      s->save_groupNo     = 0;
149
12.2k
      s->save_groupPos    = 0;
150
12.2k
      s->save_nextSym     = 0;
151
12.2k
      s->save_nblockMAX   = 0;
152
12.2k
      s->save_nblock      = 0;
153
12.2k
      s->save_es          = 0;
154
12.2k
      s->save_N           = 0;
155
12.2k
      s->save_curr        = 0;
156
12.2k
      s->save_zt          = 0;
157
12.2k
      s->save_zn          = 0;
158
12.2k
      s->save_zvec        = 0;
159
12.2k
      s->save_zj          = 0;
160
12.2k
      s->save_gSel        = 0;
161
12.2k
      s->save_gMinlen     = 0;
162
12.2k
      s->save_gLimit      = NULL;
163
12.2k
      s->save_gBase       = NULL;
164
12.2k
      s->save_gPerm       = NULL;
165
12.2k
   }
166
167
   /*restore from the save area*/
168
244k
   i           = s->save_i;
169
244k
   j           = s->save_j;
170
244k
   t           = s->save_t;
171
244k
   alphaSize   = s->save_alphaSize;
172
244k
   nGroups     = s->save_nGroups;
173
244k
   nSelectors  = s->save_nSelectors;
174
244k
   EOB         = s->save_EOB;
175
244k
   groupNo     = s->save_groupNo;
176
244k
   groupPos    = s->save_groupPos;
177
244k
   nextSym     = s->save_nextSym;
178
244k
   nblockMAX   = s->save_nblockMAX;
179
244k
   nblock      = s->save_nblock;
180
244k
   es          = s->save_es;
181
244k
   N           = s->save_N;
182
244k
   curr        = s->save_curr;
183
244k
   zt          = s->save_zt;
184
244k
   zn          = s->save_zn; 
185
244k
   zvec        = s->save_zvec;
186
244k
   zj          = s->save_zj;
187
244k
   gSel        = s->save_gSel;
188
244k
   gMinlen     = s->save_gMinlen;
189
244k
   gLimit      = s->save_gLimit;
190
244k
   gBase       = s->save_gBase;
191
244k
   gPerm       = s->save_gPerm;
192
193
244k
   retVal = BZ_OK;
194
195
244k
   switch (s->state) {
196
197
12.2k
      GET_UCHAR(BZ_X_MAGIC_1, uc);
198
9.62k
      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
199
200
9.61k
      GET_UCHAR(BZ_X_MAGIC_2, uc);
201
9.61k
      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
202
203
9.59k
      GET_UCHAR(BZ_X_MAGIC_3, uc)
204
9.59k
      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
205
206
9.58k
      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
207
9.58k
      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
208
9.57k
          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
209
9.57k
      s->blockSize100k -= BZ_HDR_0;
210
211
9.57k
      if (s->smallDecompress) {
212
2.92k
         s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
213
2.92k
         s->ll4  = BZALLOC( 
214
2.92k
                      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 
215
2.92k
                   );
216
2.92k
         if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
217
6.65k
      } else {
218
6.65k
         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
219
6.65k
         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
220
6.65k
      }
221
222
218k
      GET_UCHAR(BZ_X_BLKHDR_1, uc);
223
224
217k
      if (uc == 0x17) goto endhdr_2;
225
210k
      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
226
210k
      GET_UCHAR(BZ_X_BLKHDR_2, uc);
227
210k
      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
228
210k
      GET_UCHAR(BZ_X_BLKHDR_3, uc);
229
210k
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
230
210k
      GET_UCHAR(BZ_X_BLKHDR_4, uc);
231
210k
      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
232
210k
      GET_UCHAR(BZ_X_BLKHDR_5, uc);
233
210k
      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
234
210k
      GET_UCHAR(BZ_X_BLKHDR_6, uc);
235
210k
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
236
237
210k
      s->currBlockNo++;
238
210k
      if (s->verbosity >= 2)
239
0
         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
240
 
241
210k
      s->storedBlockCRC = 0;
242
210k
      GET_UCHAR(BZ_X_BCRC_1, uc);
243
210k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
244
210k
      GET_UCHAR(BZ_X_BCRC_2, uc);
245
210k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
246
210k
      GET_UCHAR(BZ_X_BCRC_3, uc);
247
210k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
248
210k
      GET_UCHAR(BZ_X_BCRC_4, uc);
249
210k
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
250
251
210k
      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
252
253
210k
      s->origPtr = 0;
254
210k
      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
255
210k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
256
210k
      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
257
210k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
258
210k
      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
259
210k
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
260
261
210k
      if (s->origPtr < 0)
262
210k
         RETURN(BZ_DATA_ERROR);
263
210k
      if (s->origPtr > 10 + 100000*s->blockSize100k) 
264
210k
         RETURN(BZ_DATA_ERROR);
265
266
      /*--- Receive the mapping table ---*/
267
3.57M
      for (i = 0; i < 16; i++) {
268
3.36M
         GET_BIT(BZ_X_MAPPING_1, uc);
269
3.36M
         if (uc == 1) 
270
301k
            s->inUse16[i] = True; else 
271
3.06M
            s->inUse16[i] = False;
272
3.36M
      }
273
274
54.0M
      for (i = 0; i < 256; i++) s->inUse[i] = False;
275
276
3.57M
      for (i = 0; i < 16; i++)
277
3.36M
         if (s->inUse16[i])
278
5.11M
            for (j = 0; j < 16; j++) {
279
4.81M
               GET_BIT(BZ_X_MAPPING_2, uc);
280
4.81M
               if (uc == 1) s->inUse[i * 16 + j] = True;
281
4.81M
            }
282
210k
      makeMaps_d ( s );
283
210k
      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
284
210k
      alphaSize = s->nInUse+2;
285
286
      /*--- Now the selectors ---*/
287
210k
      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
288
210k
      if (nGroups < 2 || nGroups > BZ_N_GROUPS) RETURN(BZ_DATA_ERROR);
289
210k
      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
290
210k
      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
291
7.51M
      for (i = 0; i < nSelectors; i++) {
292
7.30M
         j = 0;
293
16.7M
         while (True) {
294
16.7M
            GET_BIT(BZ_X_SELECTOR_3, uc);
295
16.7M
            if (uc == 0) break;
296
9.46M
            j++;
297
9.46M
            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
298
9.46M
         }
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
7.30M
         if (i < BZ_MAX_SELECTORS)
303
7.27M
           s->selectorMtf[i] = j;
304
7.30M
      }
305
209k
      if (nSelectors > BZ_MAX_SELECTORS)
306
33
        nSelectors = BZ_MAX_SELECTORS;
307
308
      /*--- Undo the MTF values for the selectors. ---*/
309
209k
      {
310
209k
         UChar pos[BZ_N_GROUPS], tmp, v;
311
649k
         for (v = 0; v < nGroups; v++) pos[v] = v;
312
   
313
6.95M
         for (i = 0; i < nSelectors; i++) {
314
6.74M
            v = s->selectorMtf[i];
315
6.74M
            tmp = pos[v];
316
16.1M
            while (v > 0) { pos[v] = pos[v-1]; v--; }
317
6.74M
            pos[0] = tmp;
318
6.74M
            s->selector[i] = tmp;
319
6.74M
         }
320
209k
      }
321
322
      /*--- Now the coding tables ---*/
323
648k
      for (t = 0; t < nGroups; t++) {
324
439k
         GET_BITS(BZ_X_CODING_1, curr, 5);
325
7.64M
         for (i = 0; i < alphaSize; i++) {
326
212M
            while (True) {
327
212M
               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
328
212M
               GET_BIT(BZ_X_CODING_2, uc);
329
212M
               if (uc == 0) break;
330
205M
               GET_BIT(BZ_X_CODING_3, uc);
331
205M
               if (uc == 0) curr++; else curr--;
332
205M
            }
333
7.20M
            s->len[t][i] = curr;
334
7.20M
         }
335
439k
      }
336
337
      /*--- Create the Huffman decoding tables ---*/
338
648k
      for (t = 0; t < nGroups; t++) {
339
438k
         minLen = 32;
340
438k
         maxLen = 0;
341
7.64M
         for (i = 0; i < alphaSize; i++) {
342
7.20M
            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
343
7.20M
            if (s->len[t][i] < minLen) minLen = s->len[t][i];
344
7.20M
         }
345
438k
         BZ2_hbCreateDecodeTables ( 
346
438k
            &(s->limit[t][0]), 
347
438k
            &(s->base[t][0]), 
348
438k
            &(s->perm[t][0]), 
349
438k
            &(s->len[t][0]),
350
438k
            minLen, maxLen, alphaSize
351
438k
         );
352
438k
         s->minLens[t] = minLen;
353
438k
      }
354
355
      /*--- Now the MTF values ---*/
356
357
209k
      EOB      = s->nInUse+1;
358
209k
      nblockMAX = 100000 * s->blockSize100k;
359
209k
      groupNo  = -1;
360
209k
      groupPos = 0;
361
362
53.9M
      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
363
364
      /*-- MTF init --*/
365
209k
      {
366
209k
         Int32 ii, jj, kk;
367
209k
         kk = MTFA_SIZE-1;
368
3.56M
         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
369
57.0M
            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
370
53.7M
               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
371
53.7M
               kk--;
372
53.7M
            }
373
3.35M
            s->mtfbase[ii] = kk + 1;
374
3.35M
         }
375
209k
      }
376
      /*-- end MTF init --*/
377
378
209k
      nblock = 0;
379
1.04M
      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
380
381
270M
      while (True) {
382
383
270M
         if (nextSym == EOB) break;
384
385
270M
         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
386
387
33.9M
            es = -1;
388
33.9M
            N = 1;
389
42.4M
            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
42.4M
               if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
397
42.4M
               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
398
7.50M
               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
399
42.4M
               N = N * 2;
400
212M
               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
401
212M
            }
402
42.4M
               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
403
404
33.9M
            es++;
405
33.9M
            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
406
33.9M
            s->unzftab[uc] += es;
407
408
33.9M
            if (s->smallDecompress)
409
185M
               while (es > 0) {
410
177M
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
411
177M
                  s->ll16[nblock] = (UInt16)uc;
412
177M
                  nblock++;
413
177M
                  es--;
414
177M
               }
415
26.1M
            else
416
502M
               while (es > 0) {
417
476M
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
418
476M
                  s->tt[nblock] = (UInt32)uc;
419
476M
                  nblock++;
420
476M
                  es--;
421
476M
               };
422
423
33.9M
            continue;
424
425
236M
         } else {
426
427
236M
            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
428
429
            /*-- uc = MTF ( nextSym-1 ) --*/
430
236M
            {
431
236M
               Int32 ii, jj, kk, pp, lno, off;
432
236M
               UInt32 nn;
433
236M
               nn = (UInt32)(nextSym - 1);
434
435
236M
               if (nn < MTFL_SIZE) {
436
                  /* avoid general-case expense */
437
36.6M
                  pp = s->mtfbase[0];
438
36.6M
                  uc = s->mtfa[pp+nn];
439
83.0M
                  while (nn > 3) {
440
46.3M
                     Int32 z = pp+nn;
441
46.3M
                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
442
46.3M
                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
443
46.3M
                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
444
46.3M
                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
445
46.3M
                     nn -= 4;
446
46.3M
                  }
447
91.1M
                  while (nn > 0) { 
448
54.4M
                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
449
54.4M
                  };
450
36.6M
                  s->mtfa[pp] = uc;
451
199M
               } else { 
452
                  /* general case */
453
199M
                  lno = nn / MTFL_SIZE;
454
199M
                  off = nn % MTFL_SIZE;
455
199M
                  pp = s->mtfbase[lno] + off;
456
199M
                  uc = s->mtfa[pp];
457
1.70G
                  while (pp > s->mtfbase[lno]) { 
458
1.50G
                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
459
1.50G
                  };
460
199M
                  s->mtfbase[lno]++;
461
1.66G
                  while (lno > 0) {
462
1.46G
                     s->mtfbase[lno]--;
463
1.46G
                     s->mtfa[s->mtfbase[lno]] 
464
1.46G
                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
465
1.46G
                     lno--;
466
1.46G
                  }
467
199M
                  s->mtfbase[0]--;
468
199M
                  s->mtfa[s->mtfbase[0]] = uc;
469
199M
                  if (s->mtfbase[0] == 0) {
470
50.4k
                     kk = MTFA_SIZE-1;
471
858k
                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
472
13.7M
                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
473
12.9M
                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
474
12.9M
                           kk--;
475
12.9M
                        }
476
807k
                        s->mtfbase[ii] = kk + 1;
477
807k
                     }
478
50.4k
                  }
479
199M
               }
480
236M
            }
481
            /*-- end uc = MTF ( nextSym-1 ) --*/
482
483
236M
            s->unzftab[s->seqToUnseq[uc]]++;
484
236M
            if (s->smallDecompress)
485
31.5M
               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
486
204M
               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
487
236M
            nblock++;
488
489
236M
            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
490
236M
            continue;
491
946M
         }
492
270M
      }
493
494
      /* Now we know what nblock is, we can do a better sanity
495
         check on s->origPtr.
496
      */
497
209k
      if (s->origPtr < 0 || s->origPtr >= nblock)
498
209k
         RETURN(BZ_DATA_ERROR);
499
500
      /*-- Set up cftab to facilitate generation of T^(-1) --*/
501
      /* Check: unzftab entries in range. */
502
53.7M
      for (i = 0; i <= 255; i++) {
503
53.5M
         if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
504
53.5M
            RETURN(BZ_DATA_ERROR);
505
53.5M
      }
506
      /* Actually generate cftab. */
507
209k
      s->cftab[0] = 0;
508
53.7M
      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
509
53.7M
      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
510
      /* Check: cftab entries in range. */
511
53.9M
      for (i = 0; i <= 256; i++) {
512
53.7M
         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
53.7M
      }
517
      /* Check: cftab entries non-descending. */
518
53.7M
      for (i = 1; i <= 256; i++) {
519
53.5M
         if (s->cftab[i-1] > s->cftab[i]) {
520
0
            RETURN(BZ_DATA_ERROR);
521
0
         }
522
53.5M
      }
523
524
209k
      s->state_out_len = 0;
525
209k
      s->state_out_ch  = 0;
526
209k
      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
527
209k
      s->state = BZ_X_OUTPUT;
528
209k
      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
529
530
209k
      if (s->smallDecompress) {
531
532
         /*-- Make a copy of cftab, used in generation of T --*/
533
24.4M
         for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
534
535
         /*-- compute the T vector --*/
536
197M
         for (i = 0; i < nblock; i++) {
537
197M
            uc = (UChar)(s->ll16[i]);
538
197M
            SET_LL(i, s->cftabCopy[uc]);
539
197M
            s->cftabCopy[uc]++;
540
197M
         }
541
542
         /*-- Compute T^(-1) by pointer reversal on T --*/
543
94.8k
         i = s->origPtr;
544
94.8k
         j = GET_LL(i);
545
135M
         do {
546
135M
            Int32 tmp = GET_LL(j);
547
135M
            SET_LL(j, i);
548
135M
            i = j;
549
135M
            j = tmp;
550
135M
         }
551
135M
            while (i != s->origPtr);
552
553
94.8k
         s->tPos = s->origPtr;
554
94.8k
         s->nblock_used = 0;
555
94.8k
         if (s->blockRandomised) {
556
9.04k
            BZ_RAND_INIT_MASK;
557
9.04k
            BZ_GET_SMALL(s->k0); s->nblock_used++;
558
9.04k
            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
559
85.7k
         } else {
560
85.7k
            BZ_GET_SMALL(s->k0); s->nblock_used++;
561
85.7k
         }
562
563
114k
      } else {
564
565
         /*-- compute the T^(-1) vector --*/
566
667M
         for (i = 0; i < nblock; i++) {
567
666M
            uc = (UChar)(s->tt[i] & 0xff);
568
666M
            s->tt[s->cftab[uc]] |= (i << 8);
569
666M
            s->cftab[uc]++;
570
666M
         }
571
572
114k
         s->tPos = s->tt[s->origPtr] >> 8;
573
114k
         s->nblock_used = 0;
574
114k
         if (s->blockRandomised) {
575
12.1k
            BZ_RAND_INIT_MASK;
576
12.1k
            BZ_GET_FAST(s->k0); s->nblock_used++;
577
12.1k
            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
578
102k
         } else {
579
102k
            BZ_GET_FAST(s->k0); s->nblock_used++;
580
102k
         }
581
582
114k
      }
583
584
209k
      RETURN(BZ_OK);
585
586
587
588
7.32k
    endhdr_2:
589
590
7.32k
      GET_UCHAR(BZ_X_ENDHDR_2, uc);
591
7.32k
      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
592
7.31k
      GET_UCHAR(BZ_X_ENDHDR_3, uc);
593
7.30k
      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
594
7.28k
      GET_UCHAR(BZ_X_ENDHDR_4, uc);
595
7.27k
      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
596
7.25k
      GET_UCHAR(BZ_X_ENDHDR_5, uc);
597
7.24k
      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
598
7.24k
      GET_UCHAR(BZ_X_ENDHDR_6, uc);
599
7.23k
      if (uc != 0x90) RETURN(BZ_DATA_ERROR);
600
601
7.22k
      s->storedCombinedCRC = 0;
602
7.23k
      GET_UCHAR(BZ_X_CCRC_1, uc);
603
7.22k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
604
7.22k
      GET_UCHAR(BZ_X_CCRC_2, uc);
605
7.19k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
606
7.20k
      GET_UCHAR(BZ_X_CCRC_3, uc);
607
7.17k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
608
7.18k
      GET_UCHAR(BZ_X_CCRC_4, uc);
609
7.14k
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
610
611
7.14k
      s->state = BZ_X_IDLE;
612
7.14k
      RETURN(BZ_STREAM_END);
613
614
0
      default: AssertH ( False, 4001 );
615
244k
   }
616
617
0
   AssertH ( False, 4002 );
618
619
244k
   save_state_and_return:
620
621
244k
   s->save_i           = i;
622
244k
   s->save_j           = j;
623
244k
   s->save_t           = t;
624
244k
   s->save_alphaSize   = alphaSize;
625
244k
   s->save_nGroups     = nGroups;
626
244k
   s->save_nSelectors  = nSelectors;
627
244k
   s->save_EOB         = EOB;
628
244k
   s->save_groupNo     = groupNo;
629
244k
   s->save_groupPos    = groupPos;
630
244k
   s->save_nextSym     = nextSym;
631
244k
   s->save_nblockMAX   = nblockMAX;
632
244k
   s->save_nblock      = nblock;
633
244k
   s->save_es          = es;
634
244k
   s->save_N           = N;
635
244k
   s->save_curr        = curr;
636
244k
   s->save_zt          = zt;
637
244k
   s->save_zn          = zn;
638
244k
   s->save_zvec        = zvec;
639
244k
   s->save_zj          = zj;
640
244k
   s->save_gSel        = gSel;
641
244k
   s->save_gMinlen     = gMinlen;
642
244k
   s->save_gLimit      = gLimit;
643
244k
   s->save_gBase       = gBase;
644
244k
   s->save_gPerm       = gPerm;
645
646
244k
   return retVal;   
647
0
}
648
649
650
/*-------------------------------------------------------------*/
651
/*--- end                                      decompress.c ---*/
652
/*-------------------------------------------------------------*/