Coverage Report

Created: 2025-07-23 07:47

/src/libjxl/third_party/brotli/c/dec/decode.c
Line
Count
Source (jump to first uncovered line)
1
/* Copyright 2013 Google Inc. All Rights Reserved.
2
3
   Distributed under MIT license.
4
   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5
*/
6
7
#include <brotli/decode.h>
8
9
#include <stdlib.h>  /* free, malloc */
10
#include <string.h>  /* memcpy, memset */
11
12
#include "../common/constants.h"
13
#include "../common/context.h"
14
#include "../common/dictionary.h"
15
#include "../common/platform.h"
16
#include "../common/shared_dictionary_internal.h"
17
#include "../common/transform.h"
18
#include "../common/version.h"
19
#include "bit_reader.h"
20
#include "huffman.h"
21
#include "prefix.h"
22
#include "state.h"
23
24
#if defined(BROTLI_TARGET_NEON)
25
#include <arm_neon.h>
26
#endif
27
28
#if defined(__cplusplus) || defined(c_plusplus)
29
extern "C" {
30
#endif
31
32
1.31k
#define BROTLI_FAILURE(CODE) (BROTLI_DUMP(), CODE)
33
34
#define BROTLI_LOG_UINT(name)                                       \
35
  BROTLI_LOG(("[%s] %s = %lu\n", __func__, #name, (unsigned long)(name)))
36
#define BROTLI_LOG_ARRAY_INDEX(array_name, idx)                     \
37
  BROTLI_LOG(("[%s] %s[%lu] = %lu\n", __func__, #array_name,        \
38
         (unsigned long)(idx), (unsigned long)array_name[idx]))
39
40
805M
#define HUFFMAN_TABLE_BITS 8U
41
11.9k
#define HUFFMAN_TABLE_MASK 0xFF
42
43
/* We need the slack region for the following reasons:
44
    - doing up to two 16-byte copies for fast backward copying
45
    - inserting transformed dictionary word:
46
        255 prefix + 32 base + 255 suffix */
47
static const uint32_t kRingBufferWriteAheadSlack = 542;
48
49
static const uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = {
50
  1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
51
};
52
53
/* Static prefix code for the complex code length code lengths. */
54
static const uint8_t kCodeLengthPrefixLength[16] = {
55
  2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 4,
56
};
57
58
static const uint8_t kCodeLengthPrefixValue[16] = {
59
  0, 4, 3, 2, 0, 4, 3, 1, 0, 4, 3, 2, 0, 4, 3, 5,
60
};
61
62
BROTLI_BOOL BrotliDecoderSetParameter(
63
0
    BrotliDecoderState* state, BrotliDecoderParameter p, uint32_t value) {
64
0
  if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE;
65
0
  switch (p) {
66
0
    case BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:
67
0
      state->canny_ringbuffer_allocation = !!value ? 0 : 1;
68
0
      return BROTLI_TRUE;
69
70
0
    case BROTLI_DECODER_PARAM_LARGE_WINDOW:
71
0
      state->large_window = TO_BROTLI_BOOL(!!value);
72
0
      return BROTLI_TRUE;
73
74
0
    default: return BROTLI_FALSE;
75
0
  }
76
0
}
77
78
BrotliDecoderState* BrotliDecoderCreateInstance(
79
11.3k
    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
80
11.3k
  BrotliDecoderState* state = 0;
81
11.3k
  if (!alloc_func && !free_func) {
82
11.3k
    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
83
11.3k
  } else if (alloc_func && free_func) {
84
0
    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
85
0
  }
86
11.3k
  if (state == 0) {
87
0
    BROTLI_DUMP();
88
0
    return 0;
89
0
  }
90
11.3k
  if (!BrotliDecoderStateInit(state, alloc_func, free_func, opaque)) {
91
0
    BROTLI_DUMP();
92
0
    if (!alloc_func && !free_func) {
93
0
      free(state);
94
0
    } else if (alloc_func && free_func) {
95
0
      free_func(opaque, state);
96
0
    }
97
0
    return 0;
98
0
  }
99
11.3k
  return state;
100
11.3k
}
101
102
/* Deinitializes and frees BrotliDecoderState instance. */
103
11.3k
void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
104
11.3k
  if (!state) {
105
0
    return;
106
11.3k
  } else {
107
11.3k
    brotli_free_func free_func = state->free_func;
108
11.3k
    void* opaque = state->memory_manager_opaque;
109
11.3k
    BrotliDecoderStateCleanup(state);
110
11.3k
    free_func(opaque, state);
111
11.3k
  }
112
11.3k
}
113
114
/* Saves error code and converts it to BrotliDecoderResult. */
115
static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
116
137k
    BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
117
137k
  s->error_code = (int)e;
118
137k
  s->used_input += consumed_input;
119
137k
  switch (e) {
120
1.50k
    case BROTLI_DECODER_SUCCESS:
121
1.50k
      return BROTLI_DECODER_RESULT_SUCCESS;
122
123
106k
    case BROTLI_DECODER_NEEDS_MORE_INPUT:
124
106k
      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
125
126
28.1k
    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
127
28.1k
      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
128
129
1.31k
    default:
130
1.31k
      return BROTLI_DECODER_RESULT_ERROR;
131
137k
  }
132
137k
}
133
134
/* Decodes WBITS by reading 1 - 7 bits, or 0x11 for "Large Window Brotli".
135
   Precondition: bit-reader accumulator has at least 8 bits. */
136
static BrotliDecoderErrorCode DecodeWindowBits(BrotliDecoderState* s,
137
11.2k
                                               BrotliBitReader* br) {
138
11.2k
  uint32_t n;
139
11.2k
  BROTLI_BOOL large_window = s->large_window;
140
11.2k
  s->large_window = BROTLI_FALSE;
141
11.2k
  BrotliTakeBits(br, 1, &n);
142
11.2k
  if (n == 0) {
143
4.66k
    s->window_bits = 16;
144
4.66k
    return BROTLI_DECODER_SUCCESS;
145
4.66k
  }
146
6.60k
  BrotliTakeBits(br, 3, &n);
147
6.60k
  if (n != 0) {
148
2.89k
    s->window_bits = 17 + n;
149
2.89k
    return BROTLI_DECODER_SUCCESS;
150
2.89k
  }
151
3.71k
  BrotliTakeBits(br, 3, &n);
152
3.71k
  if (n == 1) {
153
3
    if (large_window) {
154
0
      BrotliTakeBits(br, 1, &n);
155
0
      if (n == 1) {
156
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
157
0
      }
158
0
      s->large_window = BROTLI_TRUE;
159
0
      return BROTLI_DECODER_SUCCESS;
160
3
    } else {
161
3
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
162
3
    }
163
3
  }
164
3.70k
  if (n != 0) {
165
3.37k
    s->window_bits = 8 + n;
166
3.37k
    return BROTLI_DECODER_SUCCESS;
167
3.37k
  }
168
338
  s->window_bits = 17;
169
338
  return BROTLI_DECODER_SUCCESS;
170
3.70k
}
171
172
111M
static BROTLI_INLINE void memmove16(uint8_t* dst, uint8_t* src) {
173
#if defined(BROTLI_TARGET_NEON)
174
  vst1q_u8(dst, vld1q_u8(src));
175
#else
176
111M
  uint32_t buffer[4];
177
111M
  memcpy(buffer, src, 16);
178
111M
  memcpy(dst, buffer, 16);
179
111M
#endif
180
111M
}
181
182
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
183
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
184
43.7k
    BrotliDecoderState* s, BrotliBitReader* br, uint32_t* value) {
185
43.7k
  uint32_t bits;
186
43.7k
  switch (s->substate_decode_uint8) {
187
42.7k
    case BROTLI_STATE_DECODE_UINT8_NONE:
188
42.7k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
189
944
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
190
944
      }
191
41.7k
      if (bits == 0) {
192
30.9k
        *value = 0;
193
30.9k
        return BROTLI_DECODER_SUCCESS;
194
30.9k
      }
195
    /* Fall through. */
196
197
11.3k
    case BROTLI_STATE_DECODE_UINT8_SHORT:
198
11.3k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
199
569
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
200
569
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
201
569
      }
202
10.7k
      if (bits == 0) {
203
2.65k
        *value = 1;
204
2.65k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
205
2.65k
        return BROTLI_DECODER_SUCCESS;
206
2.65k
      }
207
      /* Use output value as a temporary storage. It MUST be persisted. */
208
8.13k
      *value = bits;
209
    /* Fall through. */
210
211
8.60k
    case BROTLI_STATE_DECODE_UINT8_LONG:
212
8.60k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
213
512
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
214
512
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
215
512
      }
216
8.09k
      *value = (1U << *value) + bits;
217
8.09k
      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
218
8.09k
      return BROTLI_DECODER_SUCCESS;
219
220
0
    default:
221
0
      return
222
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
223
43.7k
  }
224
43.7k
}
225
226
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
227
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
228
21.5k
    BrotliDecoderState* s, BrotliBitReader* br) {
229
21.5k
  uint32_t bits;
230
21.5k
  int i;
231
38.3k
  for (;;) {
232
38.3k
    switch (s->substate_metablock_header) {
233
17.3k
      case BROTLI_STATE_METABLOCK_HEADER_NONE:
234
17.3k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
235
506
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
236
506
        }
237
16.8k
        s->is_last_metablock = bits ? 1 : 0;
238
16.8k
        s->meta_block_remaining_len = 0;
239
16.8k
        s->is_uncompressed = 0;
240
16.8k
        s->is_metadata = 0;
241
16.8k
        if (!s->is_last_metablock) {
242
14.6k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
243
14.6k
          break;
244
14.6k
        }
245
2.21k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
246
      /* Fall through. */
247
248
2.26k
      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
249
2.26k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
250
56
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
251
56
        }
252
2.21k
        if (bits) {
253
546
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
254
546
          return BROTLI_DECODER_SUCCESS;
255
546
        }
256
1.66k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
257
      /* Fall through. */
258
259
16.4k
      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
260
16.4k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
261
155
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
262
155
        }
263
16.3k
        s->size_nibbles = (uint8_t)(bits + 4);
264
16.3k
        s->loop_counter = 0;
265
16.3k
        if (bits == 3) {
266
2.16k
          s->is_metadata = 1;
267
2.16k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
268
2.16k
          break;
269
2.16k
        }
270
14.1k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
271
      /* Fall through. */
272
273
17.6k
      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
274
17.6k
        i = s->loop_counter;
275
85.5k
        for (; i < (int)s->size_nibbles; ++i) {
276
71.4k
          if (!BrotliSafeReadBits(br, 4, &bits)) {
277
3.61k
            s->loop_counter = i;
278
3.61k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
279
3.61k
          }
280
67.8k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
281
67.8k
              bits == 0) {
282
7
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
283
7
          }
284
67.8k
          s->meta_block_remaining_len |= (int)(bits << (i * 4));
285
67.8k
        }
286
14.0k
        s->substate_metablock_header =
287
14.0k
            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
288
      /* Fall through. */
289
290
14.3k
      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
291
14.3k
        if (!s->is_last_metablock) {
292
12.7k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
293
286
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
294
286
          }
295
12.5k
          s->is_uncompressed = bits ? 1 : 0;
296
12.5k
        }
297
14.0k
        ++s->meta_block_remaining_len;
298
14.0k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
299
14.0k
        return BROTLI_DECODER_SUCCESS;
300
301
2.17k
      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
302
2.17k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
303
13
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
304
13
        }
305
2.16k
        if (bits != 0) {
306
14
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
307
14
        }
308
2.15k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
309
      /* Fall through. */
310
311
2.17k
      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
312
2.17k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
313
24
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
314
24
        }
315
2.14k
        if (bits == 0) {
316
1.28k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
317
1.28k
          return BROTLI_DECODER_SUCCESS;
318
1.28k
        }
319
860
        s->size_nibbles = (uint8_t)bits;
320
860
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
321
      /* Fall through. */
322
323
982
      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
324
982
        i = s->loop_counter;
325
2.49k
        for (; i < (int)s->size_nibbles; ++i) {
326
1.65k
          if (!BrotliSafeReadBits(br, 8, &bits)) {
327
140
            s->loop_counter = i;
328
140
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
329
140
          }
330
1.51k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
331
1.51k
              bits == 0) {
332
6
            return BROTLI_FAILURE(
333
6
                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
334
6
          }
335
1.50k
          s->meta_block_remaining_len |= (int)(bits << (i * 8));
336
1.50k
        }
337
836
        ++s->meta_block_remaining_len;
338
836
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
339
836
        return BROTLI_DECODER_SUCCESS;
340
341
0
      default:
342
0
        return
343
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
344
38.3k
    }
345
38.3k
  }
346
21.5k
}
347
348
/* Decodes the Huffman code.
349
   This method doesn't read data from the bit reader, BUT drops the amount of
350
   bits that correspond to the decoded symbol.
351
   bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */
352
static BROTLI_INLINE uint32_t DecodeSymbol(uint32_t bits,
353
                                           const HuffmanCode* table,
354
701M
                                           BrotliBitReader* br) {
355
701M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
356
701M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
357
701M
  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
358
9.78k
    uint32_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
359
9.78k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
360
9.78k
    BROTLI_HC_ADJUST_TABLE_INDEX(table,
361
9.78k
        BROTLI_HC_FAST_LOAD_VALUE(table) +
362
9.78k
        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
363
9.78k
  }
364
701M
  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
365
701M
  return BROTLI_HC_FAST_LOAD_VALUE(table);
366
701M
}
367
368
/* Reads and decodes the next Huffman code from bit-stream.
369
   This method peeks 16 bits of input and drops 0 - 15 of them. */
370
static BROTLI_INLINE uint32_t ReadSymbol(const HuffmanCode* table,
371
158M
                                         BrotliBitReader* br) {
372
158M
  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
373
158M
}
374
375
/* Same as DecodeSymbol, but it is known that there is less than 15 bits of
376
   input are currently available. */
377
static BROTLI_NOINLINE BROTLI_BOOL SafeDecodeSymbol(
378
112M
    const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
379
112M
  uint32_t val;
380
112M
  uint32_t available_bits = BrotliGetAvailableBits(br);
381
112M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
382
112M
  if (available_bits == 0) {
383
8.88M
    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
384
8.86M
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
385
8.86M
      return BROTLI_TRUE;
386
8.86M
    }
387
21.8k
    return BROTLI_FALSE;  /* No valid bits at all. */
388
8.88M
  }
389
103M
  val = (uint32_t)BrotliGetBitsUnmasked(br);
390
103M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
391
103M
  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
392
103M
    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
393
103M
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
394
103M
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
395
103M
      return BROTLI_TRUE;
396
103M
    } else {
397
9.35k
      return BROTLI_FALSE;  /* Not enough bits for the first level. */
398
9.35k
    }
399
103M
  }
400
2.14k
  if (available_bits <= HUFFMAN_TABLE_BITS) {
401
1.02k
    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
402
1.02k
  }
403
404
  /* Speculatively drop HUFFMAN_TABLE_BITS. */
405
1.11k
  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
406
1.11k
  available_bits -= HUFFMAN_TABLE_BITS;
407
1.11k
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
408
1.11k
  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
409
205
    return BROTLI_FALSE;  /* Not enough bits for the second level. */
410
205
  }
411
412
914
  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
413
914
  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
414
914
  return BROTLI_TRUE;
415
1.11k
}
416
417
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
418
656M
    const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
419
656M
  uint32_t val;
420
656M
  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
421
543M
    *result = DecodeSymbol(val, table, br);
422
543M
    return BROTLI_TRUE;
423
543M
  }
424
112M
  return SafeDecodeSymbol(table, br, result);
425
656M
}
426
427
/* Makes a look-up in first level Huffman table. Peeks 8 bits. */
428
static BROTLI_INLINE void PreloadSymbol(int safe,
429
                                        const HuffmanCode* table,
430
                                        BrotliBitReader* br,
431
                                        uint32_t* bits,
432
353M
                                        uint32_t* value) {
433
353M
  if (safe) {
434
42.3M
    return;
435
42.3M
  }
436
311M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
437
311M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
438
311M
  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
439
311M
  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
440
311M
}
441
442
/* Decodes the next Huffman code using data prepared by PreloadSymbol.
443
   Reads 0 - 15 bits. Also peeks 8 following bits. */
444
static BROTLI_INLINE uint32_t ReadPreloadedSymbol(const HuffmanCode* table,
445
                                                  BrotliBitReader* br,
446
                                                  uint32_t* bits,
447
276M
                                                  uint32_t* value) {
448
276M
  uint32_t result = *value;
449
276M
  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
450
11.9k
    uint32_t val = BrotliGet16BitsUnmasked(br);
451
11.9k
    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
452
11.9k
    uint32_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
453
11.9k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
454
11.9k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
455
11.9k
    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
456
11.9k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
457
11.9k
    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
458
276M
  } else {
459
276M
    BrotliDropBits(br, *bits);
460
276M
  }
461
276M
  PreloadSymbol(0, table, br, bits, value);
462
276M
  return result;
463
276M
}
464
465
51.4k
static BROTLI_INLINE uint32_t Log2Floor(uint32_t x) {
466
51.4k
  uint32_t result = 0;
467
411k
  while (x) {
468
360k
    x >>= 1;
469
360k
    ++result;
470
360k
  }
471
51.4k
  return result;
472
51.4k
}
473
474
/* Reads (s->symbol + 1) symbols.
475
   Totally 1..4 symbols are read, 1..11 bits each.
476
   The list of symbols MUST NOT contain duplicates. */
477
static BrotliDecoderErrorCode ReadSimpleHuffmanSymbols(
478
    uint32_t alphabet_size_max, uint32_t alphabet_size_limit,
479
51.4k
    BrotliDecoderState* s) {
480
  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
481
51.4k
  BrotliBitReader* br = &s->br;
482
51.4k
  BrotliMetablockHeaderArena* h = &s->arena.header;
483
51.4k
  uint32_t max_bits = Log2Floor(alphabet_size_max - 1);
484
51.4k
  uint32_t i = h->sub_loop_counter;
485
51.4k
  uint32_t num_symbols = h->symbol;
486
133k
  while (i <= num_symbols) {
487
89.4k
    uint32_t v;
488
89.4k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
489
7.01k
      h->sub_loop_counter = i;
490
7.01k
      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
491
7.01k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
492
7.01k
    }
493
82.4k
    if (v >= alphabet_size_limit) {
494
34
      return
495
34
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
496
34
    }
497
82.4k
    h->symbols_lists_array[i] = (uint16_t)v;
498
82.4k
    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
499
82.4k
    ++i;
500
82.4k
  }
501
502
82.2k
  for (i = 0; i < num_symbols; ++i) {
503
37.8k
    uint32_t k = i + 1;
504
89.9k
    for (; k <= num_symbols; ++k) {
505
52.1k
      if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) {
506
31
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
507
31
      }
508
52.1k
    }
509
37.8k
  }
510
511
44.3k
  return BROTLI_DECODER_SUCCESS;
512
44.4k
}
513
514
/* Process single decoded symbol code length:
515
    A) reset the repeat variable
516
    B) remember code length (if it is not 0)
517
    C) extend corresponding index-chain
518
    D) reduce the Huffman space
519
    E) update the histogram */
520
static BROTLI_INLINE void ProcessSingleCodeLength(uint32_t code_len,
521
    uint32_t* symbol, uint32_t* repeat, uint32_t* space,
522
    uint32_t* prev_code_len, uint16_t* symbol_lists,
523
290k
    uint16_t* code_length_histo, int* next_symbol) {
524
290k
  *repeat = 0;
525
290k
  if (code_len != 0) {  /* code_len == 1..15 */
526
269k
    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
527
269k
    next_symbol[code_len] = (int)(*symbol);
528
269k
    *prev_code_len = code_len;
529
269k
    *space -= 32768U >> code_len;
530
269k
    code_length_histo[code_len]++;
531
269k
    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
532
269k
        (int)*symbol, (int)code_len));
533
269k
  }
534
290k
  (*symbol)++;
535
290k
}
536
537
/* Process repeated symbol code length.
538
    A) Check if it is the extension of previous repeat sequence; if the decoded
539
       value is not BROTLI_REPEAT_PREVIOUS_CODE_LENGTH, then it is a new
540
       symbol-skip
541
    B) Update repeat variable
542
    C) Check if operation is feasible (fits alphabet)
543
    D) For each symbol do the same operations as in ProcessSingleCodeLength
544
545
   PRECONDITION: code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH or
546
                 code_len == BROTLI_REPEAT_ZERO_CODE_LENGTH */
547
static BROTLI_INLINE void ProcessRepeatedCodeLength(uint32_t code_len,
548
    uint32_t repeat_delta, uint32_t alphabet_size, uint32_t* symbol,
549
    uint32_t* repeat, uint32_t* space, uint32_t* prev_code_len,
550
    uint32_t* repeat_code_len, uint16_t* symbol_lists,
551
21.6k
    uint16_t* code_length_histo, int* next_symbol) {
552
21.6k
  uint32_t old_repeat;
553
21.6k
  uint32_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
554
21.6k
  uint32_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
555
21.6k
  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
556
6.61k
    new_len = *prev_code_len;
557
6.61k
    extra_bits = 2;
558
6.61k
  }
559
21.6k
  if (*repeat_code_len != new_len) {
560
2.86k
    *repeat = 0;
561
2.86k
    *repeat_code_len = new_len;
562
2.86k
  }
563
21.6k
  old_repeat = *repeat;
564
21.6k
  if (*repeat > 0) {
565
2.37k
    *repeat -= 2;
566
2.37k
    *repeat <<= extra_bits;
567
2.37k
  }
568
21.6k
  *repeat += repeat_delta + 3U;
569
21.6k
  repeat_delta = *repeat - old_repeat;
570
21.6k
  if (*symbol + repeat_delta > alphabet_size) {
571
82
    BROTLI_DUMP();
572
82
    *symbol = alphabet_size;
573
82
    *space = 0xFFFFF;
574
82
    return;
575
82
  }
576
21.5k
  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
577
21.5k
      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
578
21.5k
  if (*repeat_code_len != 0) {
579
6.57k
    unsigned last = *symbol + repeat_delta;
580
6.57k
    int next = next_symbol[*repeat_code_len];
581
47.7k
    do {
582
47.7k
      symbol_lists[next] = (uint16_t)*symbol;
583
47.7k
      next = (int)*symbol;
584
47.7k
    } while (++(*symbol) != last);
585
6.57k
    next_symbol[*repeat_code_len] = next;
586
6.57k
    *space -= repeat_delta << (15 - *repeat_code_len);
587
6.57k
    code_length_histo[*repeat_code_len] =
588
6.57k
        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
589
14.9k
  } else {
590
14.9k
    *symbol += repeat_delta;
591
14.9k
  }
592
21.5k
}
593
594
/* Reads and decodes symbol codelengths. */
595
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
596
19.4k
    uint32_t alphabet_size, BrotliDecoderState* s) {
597
19.4k
  BrotliBitReader* br = &s->br;
598
19.4k
  BrotliMetablockHeaderArena* h = &s->arena.header;
599
19.4k
  uint32_t symbol = h->symbol;
600
19.4k
  uint32_t repeat = h->repeat;
601
19.4k
  uint32_t space = h->space;
602
19.4k
  uint32_t prev_code_len = h->prev_code_len;
603
19.4k
  uint32_t repeat_code_len = h->repeat_code_len;
604
19.4k
  uint16_t* symbol_lists = h->symbol_lists;
605
19.4k
  uint16_t* code_length_histo = h->code_length_histo;
606
19.4k
  int* next_symbol = h->next_symbol;
607
19.4k
  if (!BrotliWarmupBitReader(br)) {
608
268
    return BROTLI_DECODER_NEEDS_MORE_INPUT;
609
268
  }
610
228k
  while (symbol < alphabet_size && space > 0) {
611
222k
    const HuffmanCode* p = h->table;
612
222k
    uint32_t code_len;
613
222k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
614
222k
    if (!BrotliCheckInputAmount(br, BROTLI_SHORT_FILL_BIT_WINDOW_READ)) {
615
13.5k
      h->symbol = symbol;
616
13.5k
      h->repeat = repeat;
617
13.5k
      h->prev_code_len = prev_code_len;
618
13.5k
      h->repeat_code_len = repeat_code_len;
619
13.5k
      h->space = space;
620
13.5k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
621
13.5k
    }
622
208k
    BrotliFillBitWindow16(br);
623
208k
    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
624
208k
        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
625
208k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
626
208k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
627
208k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
628
193k
      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
629
193k
          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
630
193k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
631
15.2k
      uint32_t extra_bits =
632
15.2k
          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
633
15.2k
      uint32_t repeat_delta =
634
15.2k
          (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
635
15.2k
      BrotliDropBits(br, extra_bits);
636
15.2k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
637
15.2k
          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
638
15.2k
          symbol_lists, code_length_histo, next_symbol);
639
15.2k
    }
640
208k
  }
641
5.60k
  h->space = space;
642
5.60k
  return BROTLI_DECODER_SUCCESS;
643
19.1k
}
644
645
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
646
13.8k
    uint32_t alphabet_size, BrotliDecoderState* s) {
647
13.8k
  BrotliBitReader* br = &s->br;
648
13.8k
  BrotliMetablockHeaderArena* h = &s->arena.header;
649
13.8k
  BROTLI_BOOL get_byte = BROTLI_FALSE;
650
140k
  while (h->symbol < alphabet_size && h->space > 0) {
651
137k
    const HuffmanCode* p = h->table;
652
137k
    uint32_t code_len;
653
137k
    uint32_t available_bits;
654
137k
    uint32_t bits = 0;
655
137k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
656
137k
    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
657
126k
    get_byte = BROTLI_FALSE;
658
126k
    available_bits = BrotliGetAvailableBits(br);
659
126k
    if (available_bits != 0) {
660
111k
      bits = (uint32_t)BrotliGetBitsUnmasked(br);
661
111k
    }
662
126k
    BROTLI_HC_ADJUST_TABLE_INDEX(p,
663
126k
        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
664
126k
    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
665
21.1k
      get_byte = BROTLI_TRUE;
666
21.1k
      continue;
667
21.1k
    }
668
105k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
669
105k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
670
97.2k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
671
97.2k
      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
672
97.2k
          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
673
97.2k
          h->next_symbol);
674
97.2k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
675
7.94k
      uint32_t extra_bits = code_len - 14U;
676
7.94k
      uint32_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
677
7.94k
          BitMask(extra_bits);
678
7.94k
      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
679
1.56k
        get_byte = BROTLI_TRUE;
680
1.56k
        continue;
681
1.56k
      }
682
6.38k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
683
6.38k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
684
6.38k
          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
685
6.38k
          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
686
6.38k
          h->next_symbol);
687
6.38k
    }
688
105k
  }
689
2.35k
  return BROTLI_DECODER_SUCCESS;
690
13.8k
}
691
692
/* Reads and decodes 15..18 codes using static prefix code.
693
   Each code is 2..4 bits long. In total 30..72 bits are used. */
694
12.8k
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
695
12.8k
  BrotliBitReader* br = &s->br;
696
12.8k
  BrotliMetablockHeaderArena* h = &s->arena.header;
697
12.8k
  uint32_t num_codes = h->repeat;
698
12.8k
  unsigned space = h->space;
699
12.8k
  uint32_t i = h->sub_loop_counter;
700
93.4k
  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
701
92.9k
    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
702
92.9k
    uint32_t ix;
703
92.9k
    uint32_t v;
704
92.9k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
705
7.11k
      uint32_t available_bits = BrotliGetAvailableBits(br);
706
7.11k
      if (available_bits != 0) {
707
4.59k
        ix = BrotliGetBitsUnmasked(br) & 0xF;
708
4.59k
      } else {
709
2.51k
        ix = 0;
710
2.51k
      }
711
7.11k
      if (kCodeLengthPrefixLength[ix] > available_bits) {
712
4.20k
        h->sub_loop_counter = i;
713
4.20k
        h->repeat = num_codes;
714
4.20k
        h->space = space;
715
4.20k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
716
4.20k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
717
4.20k
      }
718
7.11k
    }
719
88.7k
    v = kCodeLengthPrefixValue[ix];
720
88.7k
    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
721
88.7k
    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
722
88.7k
    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
723
88.7k
    if (v != 0) {
724
54.8k
      space = space - (32U >> v);
725
54.8k
      ++num_codes;
726
54.8k
      ++h->code_length_histo[v];
727
54.8k
      if (space - 1U >= 32U) {
728
        /* space is 0 or wrapped around. */
729
8.18k
        break;
730
8.18k
      }
731
54.8k
    }
732
88.7k
  }
733
8.64k
  if (!(num_codes == 1 || space == 0)) {
734
265
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
735
265
  }
736
8.38k
  return BROTLI_DECODER_SUCCESS;
737
8.64k
}
738
739
/* Decodes the Huffman tables.
740
   There are 2 scenarios:
741
    A) Huffman code contains only few symbols (1..4). Those symbols are read
742
       directly; their code lengths are defined by the number of symbols.
743
       For this scenario 4 - 49 bits will be read.
744
745
    B) 2-phase decoding:
746
    B.1) Small Huffman table is decoded; it is specified with code lengths
747
         encoded with predefined entropy code. 32 - 74 bits are used.
748
    B.2) Decoded table is used to decode code lengths of symbols in resulting
749
         Huffman table. In worst case 3520 bits are read. */
750
static BrotliDecoderErrorCode ReadHuffmanCode(uint32_t alphabet_size_max,
751
                                              uint32_t alphabet_size_limit,
752
                                              HuffmanCode* table,
753
                                              uint32_t* opt_table_size,
754
78.6k
                                              BrotliDecoderState* s) {
755
78.6k
  BrotliBitReader* br = &s->br;
756
78.6k
  BrotliMetablockHeaderArena* h = &s->arena.header;
757
  /* State machine. */
758
87.6k
  for (;;) {
759
87.6k
    switch (h->substate_huffman) {
760
54.8k
      case BROTLI_STATE_HUFFMAN_NONE:
761
54.8k
        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
762
1.18k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
763
1.18k
        }
764
53.6k
        BROTLI_LOG_UINT(h->sub_loop_counter);
765
        /* The value is used as follows:
766
           1 for simple code;
767
           0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */
768
53.6k
        if (h->sub_loop_counter != 1) {
769
9.04k
          h->space = 32;
770
9.04k
          h->repeat = 0;  /* num_codes */
771
9.04k
          memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) *
772
9.04k
              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
773
9.04k
          memset(&h->code_length_code_lengths[0], 0,
774
9.04k
              sizeof(h->code_length_code_lengths));
775
9.04k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
776
9.04k
          continue;
777
9.04k
        }
778
      /* Fall through. */
779
780
46.6k
      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
781
        /* Read symbols, codes & code lengths directly. */
782
46.6k
        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
783
2.06k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
784
2.06k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
785
2.06k
        }
786
44.5k
        h->sub_loop_counter = 0;
787
      /* Fall through. */
788
789
51.4k
      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
790
51.4k
        BrotliDecoderErrorCode result =
791
51.4k
            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
792
51.4k
        if (result != BROTLI_DECODER_SUCCESS) {
793
7.07k
          return result;
794
7.07k
        }
795
51.4k
      }
796
      /* Fall through. */
797
798
44.4k
      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
799
44.4k
        uint32_t table_size;
800
44.4k
        if (h->symbol == 3) {
801
4.20k
          uint32_t bits;
802
4.20k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
803
20
            h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
804
20
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
805
20
          }
806
4.18k
          h->symbol += bits;
807
4.18k
        }
808
44.3k
        BROTLI_LOG_UINT(h->symbol);
809
44.3k
        table_size = BrotliBuildSimpleHuffmanTable(
810
44.3k
            table, HUFFMAN_TABLE_BITS, h->symbols_lists_array, h->symbol);
811
44.3k
        if (opt_table_size) {
812
27.6k
          *opt_table_size = table_size;
813
27.6k
        }
814
44.3k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
815
44.3k
        return BROTLI_DECODER_SUCCESS;
816
44.4k
      }
817
818
      /* Decode Huffman-coded code lengths. */
819
12.8k
      case BROTLI_STATE_HUFFMAN_COMPLEX: {
820
12.8k
        uint32_t i;
821
12.8k
        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
822
12.8k
        if (result != BROTLI_DECODER_SUCCESS) {
823
4.47k
          return result;
824
4.47k
        }
825
8.38k
        BrotliBuildCodeLengthsHuffmanTable(h->table,
826
8.38k
                                           h->code_length_code_lengths,
827
8.38k
                                           h->code_length_histo);
828
8.38k
        memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo));
829
142k
        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
830
134k
          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
831
134k
          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
832
134k
        }
833
834
8.38k
        h->symbol = 0;
835
8.38k
        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
836
8.38k
        h->repeat = 0;
837
8.38k
        h->repeat_code_len = 0;
838
8.38k
        h->space = 32768;
839
8.38k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
840
8.38k
      }
841
      /* Fall through. */
842
843
19.4k
      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
844
19.4k
        uint32_t table_size;
845
19.4k
        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
846
19.4k
            alphabet_size_limit, s);
847
19.4k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
848
13.8k
          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
849
13.8k
        }
850
19.4k
        if (result != BROTLI_DECODER_SUCCESS) {
851
11.4k
          return result;
852
11.4k
        }
853
854
7.96k
        if (h->space != 0) {
855
194
          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
856
194
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
857
194
        }
858
7.77k
        table_size = BrotliBuildHuffmanTable(
859
7.77k
            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
860
7.77k
        if (opt_table_size) {
861
6.48k
          *opt_table_size = table_size;
862
6.48k
        }
863
7.77k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
864
7.77k
        return BROTLI_DECODER_SUCCESS;
865
7.96k
      }
866
867
0
      default:
868
0
        return
869
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
870
87.6k
    }
871
87.6k
  }
872
78.6k
}
873
874
/* Decodes a block length by reading 3..39 bits. */
875
static BROTLI_INLINE uint32_t ReadBlockLength(const HuffmanCode* table,
876
10.9M
                                              BrotliBitReader* br) {
877
10.9M
  uint32_t code;
878
10.9M
  uint32_t nbits;
879
10.9M
  code = ReadSymbol(table, br);
880
10.9M
  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
881
10.9M
  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
882
10.9M
}
883
884
/* WARNING: if state is not BROTLI_STATE_READ_BLOCK_LENGTH_NONE, then
885
   reading can't be continued with ReadBlockLength. */
886
static BROTLI_INLINE BROTLI_BOOL SafeReadBlockLength(
887
    BrotliDecoderState* s, uint32_t* result, const HuffmanCode* table,
888
323k
    BrotliBitReader* br) {
889
323k
  uint32_t index;
890
323k
  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
891
322k
    if (!SafeReadSymbol(table, br, &index)) {
892
3.60k
      return BROTLI_FALSE;
893
3.60k
    }
894
322k
  } else {
895
615
    index = s->block_length_index;
896
615
  }
897
319k
  {
898
319k
    uint32_t bits;
899
319k
    uint32_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
900
319k
    uint32_t offset = _kBrotliPrefixCodeRanges[index].offset;
901
319k
    if (!BrotliSafeReadBits(br, nbits, &bits)) {
902
11.8k
      s->block_length_index = index;
903
11.8k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
904
11.8k
      return BROTLI_FALSE;
905
11.8k
    }
906
307k
    *result = offset + bits;
907
307k
    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
908
307k
    return BROTLI_TRUE;
909
319k
  }
910
319k
}
911
912
/* Transform:
913
    1) initialize list L with values 0, 1,... 255
914
    2) For each input element X:
915
    2.1) let Y = L[X]
916
    2.2) remove X-th element from L
917
    2.3) prepend Y to L
918
    2.4) append Y to output
919
920
   In most cases max(Y) <= 7, so most of L remains intact.
921
   To reduce the cost of initialization, we reuse L, remember the upper bound
922
   of Y values, and reinitialize only first elements in L.
923
924
   Most of input values are 0 and 1. To reduce number of branches, we replace
925
   inner for loop with do-while. */
926
static BROTLI_NOINLINE void InverseMoveToFrontTransform(
927
863
    uint8_t* v, uint32_t v_len, BrotliDecoderState* state) {
928
  /* Reinitialize elements that could have been changed. */
929
863
  uint32_t i = 1;
930
863
  uint32_t upper_bound = state->mtf_upper_bound;
931
863
  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
932
863
  uint8_t* mtf_u8 = (uint8_t*)mtf;
933
  /* Load endian-aware constant. */
934
863
  const uint8_t b0123[4] = {0, 1, 2, 3};
935
863
  uint32_t pattern;
936
863
  memcpy(&pattern, &b0123, 4);
937
938
  /* Initialize list using 4 consequent values pattern. */
939
863
  mtf[0] = pattern;
940
53.2k
  do {
941
53.2k
    pattern += 0x04040404;  /* Advance all 4 values by 4. */
942
53.2k
    mtf[i] = pattern;
943
53.2k
    i++;
944
53.2k
  } while (i <= upper_bound);
945
946
  /* Transform the input. */
947
863
  upper_bound = 0;
948
333k
  for (i = 0; i < v_len; ++i) {
949
332k
    int index = v[i];
950
332k
    uint8_t value = mtf_u8[index];
951
332k
    upper_bound |= v[i];
952
332k
    v[i] = value;
953
332k
    mtf_u8[-1] = value;
954
5.05M
    do {
955
5.05M
      index--;
956
5.05M
      mtf_u8[index + 1] = mtf_u8[index];
957
5.05M
    } while (index >= 0);
958
332k
  }
959
  /* Remember amount of elements to be reinitialized. */
960
863
  state->mtf_upper_bound = upper_bound >> 2;
961
863
}
962
963
/* Decodes a series of Huffman table using ReadHuffmanCode function. */
964
static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
965
41.0k
    HuffmanTreeGroup* group, BrotliDecoderState* s) {
966
41.0k
  BrotliMetablockHeaderArena* h = &s->arena.header;
967
41.0k
  if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
968
21.8k
    h->next = group->codes;
969
21.8k
    h->htree_index = 0;
970
21.8k
    h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
971
21.8k
  }
972
75.2k
  while (h->htree_index < group->num_htrees) {
973
54.2k
    uint32_t table_size;
974
54.2k
    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
975
54.2k
        group->alphabet_size_limit, h->next, &table_size, s);
976
54.2k
    if (result != BROTLI_DECODER_SUCCESS) return result;
977
34.1k
    group->htrees[h->htree_index] = h->next;
978
34.1k
    h->next += table_size;
979
34.1k
    ++h->htree_index;
980
34.1k
  }
981
20.9k
  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
982
20.9k
  return BROTLI_DECODER_SUCCESS;
983
41.0k
}
984
985
/* Decodes a context map.
986
   Decoding is done in 4 phases:
987
    1) Read auxiliary information (6..16 bits) and allocate memory.
988
       In case of trivial context map, decoding is finished at this phase.
989
    2) Decode Huffman table using ReadHuffmanCode function.
990
       This table will be used for reading context map items.
991
    3) Read context map items; "0" values could be run-length encoded.
992
    4) Optionally, apply InverseMoveToFront transform to the resulting map. */
993
static BrotliDecoderErrorCode DecodeContextMap(uint32_t context_map_size,
994
                                               uint32_t* num_htrees,
995
                                               uint8_t** context_map_arg,
996
27.7k
                                               BrotliDecoderState* s) {
997
27.7k
  BrotliBitReader* br = &s->br;
998
27.7k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
999
27.7k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1000
1001
27.7k
  switch ((int)h->substate_context_map) {
1002
16.9k
    case BROTLI_STATE_CONTEXT_MAP_NONE:
1003
16.9k
      result = DecodeVarLenUint8(s, br, num_htrees);
1004
16.9k
      if (result != BROTLI_DECODER_SUCCESS) {
1005
860
        return result;
1006
860
      }
1007
16.1k
      (*num_htrees)++;
1008
16.1k
      h->context_index = 0;
1009
16.1k
      BROTLI_LOG_UINT(context_map_size);
1010
16.1k
      BROTLI_LOG_UINT(*num_htrees);
1011
16.1k
      *context_map_arg =
1012
16.1k
          (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
1013
16.1k
      if (*context_map_arg == 0) {
1014
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
1015
0
      }
1016
16.1k
      if (*num_htrees <= 1) {
1017
13.4k
        memset(*context_map_arg, 0, (size_t)context_map_size);
1018
13.4k
        return BROTLI_DECODER_SUCCESS;
1019
13.4k
      }
1020
2.63k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
1021
    /* Fall through. */
1022
1023
2.86k
    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
1024
2.86k
      uint32_t bits;
1025
      /* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe
1026
         to peek 4 bits ahead. */
1027
2.86k
      if (!BrotliSafeGetBits(br, 5, &bits)) {
1028
257
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1029
257
      }
1030
2.61k
      if ((bits & 1) != 0) { /* Use RLE for zeros. */
1031
647
        h->max_run_length_prefix = (bits >> 1) + 1;
1032
647
        BrotliDropBits(br, 5);
1033
1.96k
      } else {
1034
1.96k
        h->max_run_length_prefix = 0;
1035
1.96k
        BrotliDropBits(br, 1);
1036
1.96k
      }
1037
2.61k
      BROTLI_LOG_UINT(h->max_run_length_prefix);
1038
2.61k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
1039
2.61k
    }
1040
    /* Fall through. */
1041
1042
4.38k
    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
1043
4.38k
      uint32_t alphabet_size = *num_htrees + h->max_run_length_prefix;
1044
4.38k
      result = ReadHuffmanCode(alphabet_size, alphabet_size,
1045
4.38k
                               h->context_map_table, NULL, s);
1046
4.38k
      if (result != BROTLI_DECODER_SUCCESS) return result;
1047
2.39k
      h->code = 0xFFFF;
1048
2.39k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
1049
2.39k
    }
1050
    /* Fall through. */
1051
1052
11.1k
    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
1053
11.1k
      uint32_t context_index = h->context_index;
1054
11.1k
      uint32_t max_run_length_prefix = h->max_run_length_prefix;
1055
11.1k
      uint8_t* context_map = *context_map_arg;
1056
11.1k
      uint32_t code = h->code;
1057
11.1k
      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
1058
759k
      while (context_index < context_map_size || skip_preamble) {
1059
756k
        if (!skip_preamble) {
1060
755k
          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
1061
7.93k
            h->code = 0xFFFF;
1062
7.93k
            h->context_index = context_index;
1063
7.93k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1064
7.93k
          }
1065
748k
          BROTLI_LOG_UINT(code);
1066
1067
748k
          if (code == 0) {
1068
289k
            context_map[context_index++] = 0;
1069
289k
            continue;
1070
289k
          }
1071
459k
          if (code > max_run_length_prefix) {
1072
428k
            context_map[context_index++] =
1073
428k
                (uint8_t)(code - max_run_length_prefix);
1074
428k
            continue;
1075
428k
          }
1076
459k
        } else {
1077
986
          skip_preamble = BROTLI_FALSE;
1078
986
        }
1079
        /* RLE sub-stage. */
1080
31.6k
        {
1081
31.6k
          uint32_t reps;
1082
31.6k
          if (!BrotliSafeReadBits(br, code, &reps)) {
1083
1.04k
            h->code = code;
1084
1.04k
            h->context_index = context_index;
1085
1.04k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1086
1.04k
          }
1087
30.6k
          reps += 1U << code;
1088
30.6k
          BROTLI_LOG_UINT(reps);
1089
30.6k
          if (context_index + reps > context_map_size) {
1090
41
            return
1091
41
                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
1092
41
          }
1093
252k
          do {
1094
252k
            context_map[context_index++] = 0;
1095
252k
          } while (--reps);
1096
30.6k
        }
1097
30.6k
      }
1098
11.1k
    }
1099
    /* Fall through. */
1100
1101
2.16k
    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1102
2.16k
      uint32_t bits;
1103
2.16k
      if (!BrotliSafeReadBits(br, 1, &bits)) {
1104
40
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
1105
40
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1106
40
      }
1107
2.12k
      if (bits != 0) {
1108
863
        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
1109
863
      }
1110
2.12k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
1111
2.12k
      return BROTLI_DECODER_SUCCESS;
1112
2.16k
    }
1113
1114
0
    default:
1115
0
      return
1116
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1117
27.7k
  }
1118
27.7k
}
1119
1120
/* Decodes a command or literal and updates block type ring-buffer.
1121
   Reads 3..54 bits. */
1122
static BROTLI_INLINE BROTLI_BOOL DecodeBlockTypeAndLength(
1123
11.3M
    int safe, BrotliDecoderState* s, int tree_type) {
1124
11.3M
  uint32_t max_block_type = s->num_block_types[tree_type];
1125
11.3M
  const HuffmanCode* type_tree = &s->block_type_trees[
1126
11.3M
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
1127
11.3M
  const HuffmanCode* len_tree = &s->block_len_trees[
1128
11.3M
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1129
11.3M
  BrotliBitReader* br = &s->br;
1130
11.3M
  uint32_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1131
11.3M
  uint32_t block_type;
1132
11.3M
  if (max_block_type <= 1) {
1133
0
    return BROTLI_FALSE;
1134
0
  }
1135
1136
  /* Read 0..15 + 3..39 bits. */
1137
11.3M
  if (!safe) {
1138
10.9M
    block_type = ReadSymbol(type_tree, br);
1139
10.9M
    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1140
10.9M
  } else {
1141
318k
    BrotliBitReaderState memento;
1142
318k
    BrotliBitReaderSaveState(br, &memento);
1143
318k
    if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE;
1144
314k
    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1145
14.7k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1146
14.7k
      BrotliBitReaderRestoreState(br, &memento);
1147
14.7k
      return BROTLI_FALSE;
1148
14.7k
    }
1149
314k
  }
1150
1151
11.2M
  if (block_type == 1) {
1152
8.50M
    block_type = ringbuffer[1] + 1;
1153
8.50M
  } else if (block_type == 0) {
1154
1.65M
    block_type = ringbuffer[0];
1155
1.65M
  } else {
1156
1.13M
    block_type -= 2;
1157
1.13M
  }
1158
11.2M
  if (block_type >= max_block_type) {
1159
1.53M
    block_type -= max_block_type;
1160
1.53M
  }
1161
11.2M
  ringbuffer[0] = ringbuffer[1];
1162
11.2M
  ringbuffer[1] = block_type;
1163
11.2M
  return BROTLI_TRUE;
1164
11.3M
}
1165
1166
static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
1167
7.89k
    BrotliDecoderState* s) {
1168
7.89k
  size_t i;
1169
71.0k
  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1170
55.6k
  for (i = 0; i < s->num_block_types[0]; i++) {
1171
47.7k
    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1172
47.7k
    size_t error = 0;
1173
47.7k
    size_t sample = s->context_map[offset];
1174
47.7k
    size_t j;
1175
811k
    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1176
763k
      BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
1177
763k
    }
1178
47.7k
    if (error == 0) {
1179
37.4k
      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1180
37.4k
    }
1181
47.7k
  }
1182
7.89k
}
1183
1184
9.08M
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1185
9.08M
  uint8_t context_mode;
1186
9.08M
  size_t trivial;
1187
9.08M
  uint32_t block_type = s->block_type_rb[1];
1188
9.08M
  uint32_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1189
9.08M
  s->context_map_slice = s->context_map + context_offset;
1190
9.08M
  trivial = s->trivial_literal_contexts[block_type >> 5];
1191
9.08M
  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1192
9.08M
  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1193
9.08M
  context_mode = s->context_modes[block_type] & 3;
1194
9.08M
  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
1195
9.08M
}
1196
1197
/* Decodes the block type and updates the state for literal context.
1198
   Reads 3..54 bits. */
1199
static BROTLI_INLINE BROTLI_BOOL DecodeLiteralBlockSwitchInternal(
1200
9.08M
    int safe, BrotliDecoderState* s) {
1201
9.08M
  if (!DecodeBlockTypeAndLength(safe, s, 0)) {
1202
7.99k
    return BROTLI_FALSE;
1203
7.99k
  }
1204
9.07M
  PrepareLiteralDecoding(s);
1205
9.07M
  return BROTLI_TRUE;
1206
9.08M
}
1207
1208
8.94M
static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1209
8.94M
  DecodeLiteralBlockSwitchInternal(0, s);
1210
8.94M
}
1211
1212
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch(
1213
141k
    BrotliDecoderState* s) {
1214
141k
  return DecodeLiteralBlockSwitchInternal(1, s);
1215
141k
}
1216
1217
/* Block switch for insert/copy length.
1218
   Reads 3..54 bits. */
1219
static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal(
1220
1.70M
    int safe, BrotliDecoderState* s) {
1221
1.70M
  if (!DecodeBlockTypeAndLength(safe, s, 1)) {
1222
5.22k
    return BROTLI_FALSE;
1223
5.22k
  }
1224
1.70M
  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
1225
1.70M
  return BROTLI_TRUE;
1226
1.70M
}
1227
1228
1.62M
static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1229
1.62M
  DecodeCommandBlockSwitchInternal(0, s);
1230
1.62M
}
1231
1232
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch(
1233
85.5k
    BrotliDecoderState* s) {
1234
85.5k
  return DecodeCommandBlockSwitchInternal(1, s);
1235
85.5k
}
1236
1237
/* Block switch for distance codes.
1238
   Reads 3..54 bits. */
1239
static BROTLI_INLINE BROTLI_BOOL DecodeDistanceBlockSwitchInternal(
1240
522k
    int safe, BrotliDecoderState* s) {
1241
522k
  if (!DecodeBlockTypeAndLength(safe, s, 2)) {
1242
5.53k
    return BROTLI_FALSE;
1243
5.53k
  }
1244
516k
  s->dist_context_map_slice = s->dist_context_map +
1245
516k
      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
1246
516k
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1247
516k
  return BROTLI_TRUE;
1248
522k
}
1249
1250
430k
static void BROTLI_NOINLINE DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
1251
430k
  DecodeDistanceBlockSwitchInternal(0, s);
1252
430k
}
1253
1254
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
1255
91.5k
    BrotliDecoderState* s) {
1256
91.5k
  return DecodeDistanceBlockSwitchInternal(1, s);
1257
91.5k
}
1258
1259
237k
static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
1260
237k
  size_t pos = wrap && s->pos > s->ringbuffer_size ?
1261
229k
      (size_t)s->ringbuffer_size : (size_t)(s->pos);
1262
237k
  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
1263
237k
  return partial_pos_rb - s->partial_pos_out;
1264
237k
}
1265
1266
/* Dumps output.
1267
   Returns BROTLI_DECODER_NEEDS_MORE_OUTPUT only if there is more output to push
1268
   and either ring-buffer is as big as window size, or |force| is true. */
1269
static BrotliDecoderErrorCode BROTLI_NOINLINE WriteRingBuffer(
1270
    BrotliDecoderState* s, size_t* available_out, uint8_t** next_out,
1271
237k
    size_t* total_out, BROTLI_BOOL force) {
1272
237k
  uint8_t* start =
1273
237k
      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
1274
237k
  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1275
237k
  size_t num_written = *available_out;
1276
237k
  if (num_written > to_write) {
1277
140k
    num_written = to_write;
1278
140k
  }
1279
237k
  if (s->meta_block_remaining_len < 0) {
1280
165
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
1281
165
  }
1282
237k
  if (next_out && !*next_out) {
1283
0
    *next_out = start;
1284
237k
  } else {
1285
237k
    if (next_out) {
1286
193k
      memcpy(*next_out, start, num_written);
1287
193k
      *next_out += num_written;
1288
193k
    }
1289
237k
  }
1290
237k
  *available_out -= num_written;
1291
237k
  BROTLI_LOG_UINT(to_write);
1292
237k
  BROTLI_LOG_UINT(num_written);
1293
237k
  s->partial_pos_out += num_written;
1294
237k
  if (total_out) {
1295
0
    *total_out = s->partial_pos_out;
1296
0
  }
1297
237k
  if (num_written < to_write) {
1298
73.8k
    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
1299
73.8k
      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
1300
73.8k
    } else {
1301
0
      return BROTLI_DECODER_SUCCESS;
1302
0
    }
1303
73.8k
  }
1304
  /* Wrap ring buffer only if it has reached its maximal size. */
1305
163k
  if (s->ringbuffer_size == (1 << s->window_bits) &&
1306
163k
      s->pos >= s->ringbuffer_size) {
1307
136k
    s->pos -= s->ringbuffer_size;
1308
136k
    s->rb_roundtrips++;
1309
136k
    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1310
136k
  }
1311
163k
  return BROTLI_DECODER_SUCCESS;
1312
237k
}
1313
1314
135k
static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1315
135k
  if (s->should_wrap_ringbuffer) {
1316
6.12k
    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1317
6.12k
    s->should_wrap_ringbuffer = 0;
1318
6.12k
  }
1319
135k
}
1320
1321
/* Allocates ring-buffer.
1322
1323
   s->ringbuffer_size MUST be updated by BrotliCalculateRingBufferSize before
1324
   this function is called.
1325
1326
   Last two bytes of ring-buffer are initialized to 0, so context calculation
1327
   could be done uniformly for the first two and all other positions. */
1328
static BROTLI_BOOL BROTLI_NOINLINE BrotliEnsureRingBuffer(
1329
18.7k
    BrotliDecoderState* s) {
1330
18.7k
  uint8_t* old_ringbuffer = s->ringbuffer;
1331
18.7k
  if (s->ringbuffer_size == s->new_ringbuffer_size) {
1332
9.53k
    return BROTLI_TRUE;
1333
9.53k
  }
1334
1335
9.17k
  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
1336
9.17k
      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
1337
9.17k
  if (s->ringbuffer == 0) {
1338
    /* Restore previous value. */
1339
0
    s->ringbuffer = old_ringbuffer;
1340
0
    return BROTLI_FALSE;
1341
0
  }
1342
9.17k
  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1343
9.17k
  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
1344
1345
9.17k
  if (!!old_ringbuffer) {
1346
248
    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1347
248
    BROTLI_DECODER_FREE(s, old_ringbuffer);
1348
248
  }
1349
1350
9.17k
  s->ringbuffer_size = s->new_ringbuffer_size;
1351
9.17k
  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1352
9.17k
  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1353
1354
9.17k
  return BROTLI_TRUE;
1355
9.17k
}
1356
1357
static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1358
    size_t* available_out, uint8_t** next_out, size_t* total_out,
1359
11.9k
    BrotliDecoderState* s) {
1360
  /* TODO(eustas): avoid allocation for single uncompressed block. */
1361
11.9k
  if (!BrotliEnsureRingBuffer(s)) {
1362
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
1363
0
  }
1364
1365
  /* State machine */
1366
13.4k
  for (;;) {
1367
13.4k
    switch (s->substate_uncompressed) {
1368
13.1k
      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1369
13.1k
        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1370
13.1k
        if (nbytes > s->meta_block_remaining_len) {
1371
4.12k
          nbytes = s->meta_block_remaining_len;
1372
4.12k
        }
1373
13.1k
        if (s->pos + nbytes > s->ringbuffer_size) {
1374
1.47k
          nbytes = s->ringbuffer_size - s->pos;
1375
1.47k
        }
1376
        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1377
13.1k
        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1378
13.1k
        s->pos += nbytes;
1379
13.1k
        s->meta_block_remaining_len -= nbytes;
1380
13.1k
        if (s->pos < 1 << s->window_bits) {
1381
11.6k
          if (s->meta_block_remaining_len == 0) {
1382
3.50k
            return BROTLI_DECODER_SUCCESS;
1383
3.50k
          }
1384
8.17k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
1385
11.6k
        }
1386
1.48k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1387
1.48k
      }
1388
      /* Fall through. */
1389
1390
1.74k
      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1391
1.74k
        BrotliDecoderErrorCode result;
1392
1.74k
        result = WriteRingBuffer(
1393
1.74k
            s, available_out, next_out, total_out, BROTLI_FALSE);
1394
1.74k
        if (result != BROTLI_DECODER_SUCCESS) {
1395
262
          return result;
1396
262
        }
1397
1.48k
        if (s->ringbuffer_size == 1 << s->window_bits) {
1398
1.48k
          s->max_distance = s->max_backward_distance;
1399
1.48k
        }
1400
1.48k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1401
1.48k
        break;
1402
1.74k
      }
1403
13.4k
    }
1404
13.4k
  }
1405
0
  BROTLI_DCHECK(0);  /* Unreachable */
1406
0
}
1407
1408
static BROTLI_BOOL AttachCompoundDictionary(
1409
0
    BrotliDecoderState* state, const uint8_t* data, size_t size) {
1410
0
  BrotliDecoderCompoundDictionary* addon = state->compound_dictionary;
1411
0
  if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE;
1412
0
  if (!addon) {
1413
0
    addon = (BrotliDecoderCompoundDictionary*)BROTLI_DECODER_ALLOC(
1414
0
        state, sizeof(BrotliDecoderCompoundDictionary));
1415
0
    if (!addon) return BROTLI_FALSE;
1416
0
    addon->num_chunks = 0;
1417
0
    addon->total_size = 0;
1418
0
    addon->br_length = 0;
1419
0
    addon->br_copied = 0;
1420
0
    addon->block_bits = -1;
1421
0
    addon->chunk_offsets[0] = 0;
1422
0
    state->compound_dictionary = addon;
1423
0
  }
1424
0
  if (addon->num_chunks == 15) return BROTLI_FALSE;
1425
0
  addon->chunks[addon->num_chunks] = data;
1426
0
  addon->num_chunks++;
1427
0
  addon->total_size += (int)size;
1428
0
  addon->chunk_offsets[addon->num_chunks] = addon->total_size;
1429
0
  return BROTLI_TRUE;
1430
0
}
1431
1432
0
static void EnsureCoumpoundDictionaryInitialized(BrotliDecoderState* state) {
1433
0
  BrotliDecoderCompoundDictionary* addon = state->compound_dictionary;
1434
  /* 256 = (1 << 8) slots in block map. */
1435
0
  int block_bits = 8;
1436
0
  int cursor = 0;
1437
0
  int index = 0;
1438
0
  if (addon->block_bits != -1) return;
1439
0
  while (((addon->total_size - 1) >> block_bits) != 0) block_bits++;
1440
0
  block_bits -= 8;
1441
0
  addon->block_bits = block_bits;
1442
0
  while (cursor < addon->total_size) {
1443
0
    while (addon->chunk_offsets[index + 1] < cursor) index++;
1444
0
    addon->block_map[cursor >> block_bits] = (uint8_t)index;
1445
0
    cursor += 1 << block_bits;
1446
0
  }
1447
0
}
1448
1449
static BROTLI_BOOL InitializeCompoundDictionaryCopy(BrotliDecoderState* s,
1450
0
    int address, int length) {
1451
0
  BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
1452
0
  int index;
1453
0
  EnsureCoumpoundDictionaryInitialized(s);
1454
0
  index = addon->block_map[address >> addon->block_bits];
1455
0
  while (address >= addon->chunk_offsets[index + 1]) index++;
1456
0
  if (addon->total_size < address + length) return BROTLI_FALSE;
1457
  /* Update the recent distances cache. */
1458
0
  s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
1459
0
  ++s->dist_rb_idx;
1460
0
  s->meta_block_remaining_len -= length;
1461
0
  addon->br_index = index;
1462
0
  addon->br_offset = address - addon->chunk_offsets[index];
1463
0
  addon->br_length = length;
1464
0
  addon->br_copied = 0;
1465
0
  return BROTLI_TRUE;
1466
0
}
1467
1468
281k
static int GetCompoundDictionarySize(BrotliDecoderState* s) {
1469
281k
  return s->compound_dictionary ? s->compound_dictionary->total_size : 0;
1470
281k
}
1471
1472
0
static int CopyFromCompoundDictionary(BrotliDecoderState* s, int pos) {
1473
0
  BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
1474
0
  int orig_pos = pos;
1475
0
  while (addon->br_length != addon->br_copied) {
1476
0
    uint8_t* copy_dst = &s->ringbuffer[pos];
1477
0
    const uint8_t* copy_src =
1478
0
        addon->chunks[addon->br_index] + addon->br_offset;
1479
0
    int space = s->ringbuffer_size - pos;
1480
0
    int rem_chunk_length = (addon->chunk_offsets[addon->br_index + 1] -
1481
0
        addon->chunk_offsets[addon->br_index]) - addon->br_offset;
1482
0
    int length = addon->br_length - addon->br_copied;
1483
0
    if (length > rem_chunk_length) length = rem_chunk_length;
1484
0
    if (length > space) length = space;
1485
0
    memcpy(copy_dst, copy_src, (size_t)length);
1486
0
    pos += length;
1487
0
    addon->br_offset += length;
1488
0
    addon->br_copied += length;
1489
0
    if (length == rem_chunk_length) {
1490
0
      addon->br_index++;
1491
0
      addon->br_offset = 0;
1492
0
    }
1493
0
    if (pos == s->ringbuffer_size) break;
1494
0
  }
1495
0
  return pos - orig_pos;
1496
0
}
1497
1498
BROTLI_BOOL BrotliDecoderAttachDictionary(
1499
    BrotliDecoderState* state, BrotliSharedDictionaryType type,
1500
0
    size_t data_size, const uint8_t data[BROTLI_ARRAY_PARAM(data_size)]) {
1501
0
  uint32_t i;
1502
0
  uint32_t num_prefix_before = state->dictionary->num_prefix;
1503
0
  if (state->state != BROTLI_STATE_UNINITED) return BROTLI_FALSE;
1504
0
  if (!BrotliSharedDictionaryAttach(state->dictionary, type, data_size, data)) {
1505
0
    return BROTLI_FALSE;
1506
0
  }
1507
0
  for (i = num_prefix_before; i < state->dictionary->num_prefix; i++) {
1508
0
    if (!AttachCompoundDictionary(
1509
0
        state, state->dictionary->prefix[i],
1510
0
        state->dictionary->prefix_size[i])) {
1511
0
      return BROTLI_FALSE;
1512
0
    }
1513
0
  }
1514
0
  return BROTLI_TRUE;
1515
0
}
1516
1517
/* Calculates the smallest feasible ring buffer.
1518
1519
   If we know the data size is small, do not allocate more ring buffer
1520
   size than needed to reduce memory usage.
1521
1522
   When this method is called, metablock size and flags MUST be decoded. */
1523
static void BROTLI_NOINLINE BrotliCalculateRingBufferSize(
1524
14.0k
    BrotliDecoderState* s) {
1525
14.0k
  int window_size = 1 << s->window_bits;
1526
14.0k
  int new_ringbuffer_size = window_size;
1527
  /* We need at least 2 bytes of ring buffer size to get the last two
1528
     bytes for context from there */
1529
14.0k
  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
1530
14.0k
  int output_size;
1531
1532
  /* If maximum is already reached, no further extension is retired. */
1533
14.0k
  if (s->ringbuffer_size == window_size) {
1534
990
    return;
1535
990
  }
1536
1537
  /* Metadata blocks does not touch ring buffer. */
1538
13.0k
  if (s->is_metadata) {
1539
0
    return;
1540
0
  }
1541
1542
13.0k
  if (!s->ringbuffer) {
1543
10.7k
    output_size = 0;
1544
10.7k
  } else {
1545
2.24k
    output_size = s->pos;
1546
2.24k
  }
1547
13.0k
  output_size += s->meta_block_remaining_len;
1548
13.0k
  min_size = min_size < output_size ? output_size : min_size;
1549
1550
13.0k
  if (!!s->canny_ringbuffer_allocation) {
1551
    /* Reduce ring buffer size to save memory when server is unscrupulous.
1552
       In worst case memory usage might be 1.5x bigger for a short period of
1553
       ring buffer reallocation. */
1554
34.9k
    while ((new_ringbuffer_size >> 1) >= min_size) {
1555
21.9k
      new_ringbuffer_size >>= 1;
1556
21.9k
    }
1557
13.0k
  }
1558
1559
13.0k
  s->new_ringbuffer_size = new_ringbuffer_size;
1560
13.0k
}
1561
1562
/* Reads 1..256 2-bit context modes. */
1563
10.2k
static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1564
10.2k
  BrotliBitReader* br = &s->br;
1565
10.2k
  int i = s->loop_counter;
1566
1567
68.3k
  while (i < (int)s->num_block_types[0]) {
1568
60.1k
    uint32_t bits;
1569
60.1k
    if (!BrotliSafeReadBits(br, 2, &bits)) {
1570
1.96k
      s->loop_counter = i;
1571
1.96k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1572
1.96k
    }
1573
58.1k
    s->context_modes[i] = (uint8_t)bits;
1574
58.1k
    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1575
58.1k
    i++;
1576
58.1k
  }
1577
8.25k
  return BROTLI_DECODER_SUCCESS;
1578
10.2k
}
1579
1580
49.9M
static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1581
49.9M
  int offset = s->distance_code - 3;
1582
49.9M
  if (s->distance_code <= 3) {
1583
    /* Compensate double distance-ring-buffer roll for dictionary items. */
1584
5.62M
    s->distance_context = 1 >> s->distance_code;
1585
5.62M
    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
1586
5.62M
    s->dist_rb_idx -= s->distance_context;
1587
44.3M
  } else {
1588
44.3M
    int index_delta = 3;
1589
44.3M
    int delta;
1590
44.3M
    int base = s->distance_code - 10;
1591
44.3M
    if (s->distance_code < 10) {
1592
29.9M
      base = s->distance_code - 4;
1593
29.9M
    } else {
1594
14.4M
      index_delta = 2;
1595
14.4M
    }
1596
    /* Unpack one of six 4-bit values. */
1597
44.3M
    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
1598
44.3M
    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
1599
44.3M
    if (s->distance_code <= 0) {
1600
      /* A huge distance will cause a BROTLI_FAILURE() soon.
1601
         This is a little faster than failing here. */
1602
37
      s->distance_code = 0x7FFFFFFF;
1603
37
    }
1604
44.3M
  }
1605
49.9M
}
1606
1607
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1608
179M
    BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
1609
179M
  if (n_bits != 0) {
1610
196k
    return BrotliSafeReadBits(br, n_bits, val);
1611
179M
  } else {
1612
179M
    *val = 0;
1613
179M
    return BROTLI_TRUE;
1614
179M
  }
1615
179M
}
1616
1617
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
1618
11.0M
    BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
1619
11.0M
  if (n_bits != 0) {
1620
77.9k
    return BrotliSafeReadBits32(br, n_bits, val);
1621
10.9M
  } else {
1622
10.9M
    *val = 0;
1623
10.9M
    return BROTLI_TRUE;
1624
10.9M
  }
1625
11.0M
}
1626
1627
/*
1628
   RFC 7932 Section 4 with "..." shortenings and "[]" emendations.
1629
1630
   Each distance ... is represented with a pair <distance code, extra bits>...
1631
   The distance code is encoded using a prefix code... The number of extra bits
1632
   can be 0..24... Two additional parameters: NPOSTFIX (0..3), and ...
1633
   NDIRECT (0..120) ... are encoded in the meta-block header...
1634
1635
   The first 16 distance symbols ... reference past distances... ring buffer ...
1636
   Next NDIRECT distance symbols ... represent distances from 1 to NDIRECT...
1637
   [For] distance symbols 16 + NDIRECT and greater ... the number of extra bits
1638
   ... is given by the following formula:
1639
1640
   [ xcode = dcode - NDIRECT - 16 ]
1641
   ndistbits = 1 + [ xcode ] >> (NPOSTFIX + 1)
1642
1643
   ...
1644
*/
1645
1646
/*
1647
   RFC 7932 Section 9.2 with "..." shortenings and "[]" emendations.
1648
1649
   ... to get the actual value of the parameter NDIRECT, left-shift this
1650
   four-bit number by NPOSTFIX bits ...
1651
*/
1652
1653
/* Remaining formulas from RFC 7932 Section 4 could be rewritten as following:
1654
1655
     alphabet_size = 16 + NDIRECT + (max_distbits << (NPOSTFIX + 1))
1656
1657
     half = ((xcode >> NPOSTFIX) & 1) << ndistbits
1658
     postfix = xcode & ((1 << NPOSTFIX) - 1)
1659
     range_start = 2 * (1 << ndistbits - 1 - 1)
1660
1661
     distance = (range_start + half + extra) << NPOSTFIX + postfix + NDIRECT + 1
1662
1663
   NB: ndistbits >= 1 -> range_start >= 0
1664
   NB: range_start has factor 2, as the range is covered by 2 "halves"
1665
   NB: extra -1 offset in range_start formula covers the absence of
1666
       ndistbits = 0 case
1667
   NB: when NPOSTFIX = 0, NDIRECT is not greater than 15
1668
1669
   In other words, xcode has the following binary structure - XXXHPPP:
1670
    - XXX represent the number of extra distance bits
1671
    - H selects upper / lower range of distances
1672
    - PPP represent "postfix"
1673
1674
  "Regular" distance encoding has NPOSTFIX = 0; omitting the postfix part
1675
  simplifies distance calculation.
1676
1677
  Using NPOSTFIX > 0 allows cheaper encoding of regular structures, e.g. where
1678
  most of distances have the same reminder of division by 2/4/8. For example,
1679
  the table of int32_t values that come from different sources; if it is likely
1680
  that 3 highest bytes of values from the same source are the same, then
1681
  copy distance often looks like 4x + y.
1682
1683
  Distance calculation could be rewritten to:
1684
1685
    ndistbits = NDISTBITS(NDIRECT, NPOSTFIX)[dcode]
1686
    distance = OFFSET(NDIRECT, NPOSTFIX)[dcode] + extra << NPOSTFIX
1687
1688
  NDISTBITS and OFFSET could be pre-calculated, as NDIRECT and NPOSTFIX could
1689
  change only once per meta-block.
1690
*/
1691
1692
/* Calculates distance lookup table.
1693
   NB: it is possible to have all 64 tables precalculated. */
1694
6.77k
static void CalculateDistanceLut(BrotliDecoderState* s) {
1695
6.77k
  BrotliMetablockBodyArena* b = &s->arena.body;
1696
6.77k
  uint32_t npostfix = s->distance_postfix_bits;
1697
6.77k
  uint32_t ndirect = s->num_direct_distance_codes;
1698
6.77k
  uint32_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
1699
6.77k
  uint32_t postfix = 1u << npostfix;
1700
6.77k
  uint32_t j;
1701
6.77k
  uint32_t bits = 1;
1702
6.77k
  uint32_t half = 0;
1703
1704
  /* Skip short codes. */
1705
6.77k
  uint32_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
1706
1707
  /* Fill direct codes. */
1708
80.0k
  for (j = 0; j < ndirect; ++j) {
1709
73.3k
    b->dist_extra_bits[i] = 0;
1710
73.3k
    b->dist_offset[i] = j + 1;
1711
73.3k
    ++i;
1712
73.3k
  }
1713
1714
  /* Fill regular distance codes. */
1715
331k
  while (i < alphabet_size_limit) {
1716
325k
    uint32_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
1717
    /* Always fill the complete group. */
1718
1.01M
    for (j = 0; j < postfix; ++j) {
1719
689k
      b->dist_extra_bits[i] = (uint8_t)bits;
1720
689k
      b->dist_offset[i] = base + j;
1721
689k
      ++i;
1722
689k
    }
1723
325k
    bits = bits + half;
1724
325k
    half = half ^ 1;
1725
325k
  }
1726
6.77k
}
1727
1728
/* Precondition: s->distance_code < 0. */
1729
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
1730
63.8M
    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1731
63.8M
  BrotliMetablockBodyArena* b = &s->arena.body;
1732
63.8M
  uint32_t code;
1733
63.8M
  uint32_t bits;
1734
63.8M
  BrotliBitReaderState memento;
1735
63.8M
  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1736
63.8M
  if (!safe) {
1737
25.4M
    code = ReadSymbol(distance_tree, br);
1738
38.4M
  } else {
1739
38.4M
    BrotliBitReaderSaveState(br, &memento);
1740
38.4M
    if (!SafeReadSymbol(distance_tree, br, &code)) {
1741
4.12k
      return BROTLI_FALSE;
1742
4.12k
    }
1743
38.4M
  }
1744
63.8M
  --s->block_length[2];
1745
  /* Convert the distance code to the actual distance by possibly
1746
     looking up past distances from the s->dist_rb. */
1747
63.8M
  s->distance_context = 0;
1748
63.8M
  if ((code & ~0xFu) == 0) {
1749
49.9M
    s->distance_code = (int)code;
1750
49.9M
    TakeDistanceFromRingBuffer(s);
1751
49.9M
    return BROTLI_TRUE;
1752
49.9M
  }
1753
13.8M
  if (!safe) {
1754
2.82M
    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
1755
11.0M
  } else {
1756
11.0M
    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
1757
9.52k
      ++s->block_length[2];
1758
9.52k
      BrotliBitReaderRestoreState(br, &memento);
1759
9.52k
      return BROTLI_FALSE;
1760
9.52k
    }
1761
11.0M
  }
1762
13.8M
  s->distance_code =
1763
13.8M
      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
1764
13.8M
  return BROTLI_TRUE;
1765
13.8M
}
1766
1767
static BROTLI_INLINE void ReadDistance(
1768
25.4M
    BrotliDecoderState* s, BrotliBitReader* br) {
1769
25.4M
  ReadDistanceInternal(0, s, br);
1770
25.4M
}
1771
1772
static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
1773
38.4M
    BrotliDecoderState* s, BrotliBitReader* br) {
1774
38.4M
  return ReadDistanceInternal(1, s, br);
1775
38.4M
}
1776
1777
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
1778
148M
    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1779
148M
  uint32_t cmd_code;
1780
148M
  uint32_t insert_len_extra = 0;
1781
148M
  uint32_t copy_length;
1782
148M
  CmdLutElement v;
1783
148M
  BrotliBitReaderState memento;
1784
148M
  if (!safe) {
1785
58.4M
    cmd_code = ReadSymbol(s->htree_command, br);
1786
89.7M
  } else {
1787
89.7M
    BrotliBitReaderSaveState(br, &memento);
1788
89.7M
    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
1789
5.05k
      return BROTLI_FALSE;
1790
5.05k
    }
1791
89.7M
  }
1792
148M
  v = kCmdLut[cmd_code];
1793
148M
  s->distance_code = v.distance_code;
1794
148M
  s->distance_context = v.context;
1795
148M
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1796
148M
  *insert_length = v.insert_len_offset;
1797
148M
  if (!safe) {
1798
58.4M
    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1799
3.27M
      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
1800
3.27M
    }
1801
58.4M
    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
1802
89.7M
  } else {
1803
89.7M
    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1804
89.7M
        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1805
9.26k
      BrotliBitReaderRestoreState(br, &memento);
1806
9.26k
      return BROTLI_FALSE;
1807
9.26k
    }
1808
89.7M
  }
1809
148M
  s->copy_length = (int)copy_length + v.copy_len_offset;
1810
148M
  --s->block_length[1];
1811
148M
  *insert_length += (int)insert_len_extra;
1812
148M
  return BROTLI_TRUE;
1813
148M
}
1814
1815
static BROTLI_INLINE void ReadCommand(
1816
58.4M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1817
58.4M
  ReadCommandInternal(0, s, br, insert_length);
1818
58.4M
}
1819
1820
static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
1821
89.7M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1822
89.7M
  return ReadCommandInternal(1, s, br, insert_length);
1823
89.7M
}
1824
1825
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
1826
1.00G
    int safe, BrotliBitReader* const br, size_t num) {
1827
1.00G
  if (safe) {
1828
616M
    return BROTLI_TRUE;
1829
616M
  }
1830
389M
  return BrotliCheckInputAmount(br, num);
1831
1.00G
}
1832
1833
#define BROTLI_SAFE(METHOD)                       \
1834
223M
  {                                               \
1835
223M
    if (safe) {                                   \
1836
128M
      if (!Safe##METHOD) {                        \
1837
46.7k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
1838
46.7k
        goto saveStateAndReturn;                  \
1839
46.7k
      }                                           \
1840
128M
    } else {                                      \
1841
94.8M
      METHOD;                                     \
1842
94.8M
    }                                             \
1843
223M
  }
1844
1845
static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
1846
281k
    int safe, BrotliDecoderState* s) {
1847
281k
  int pos = s->pos;
1848
281k
  int i = s->loop_counter;
1849
281k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1850
281k
  BrotliBitReader* br = &s->br;
1851
281k
  int compound_dictionary_size = GetCompoundDictionarySize(s);
1852
1853
281k
  if (!CheckInputAmount(safe, br, 28)) {
1854
75.9k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1855
75.9k
    goto saveStateAndReturn;
1856
75.9k
  }
1857
205k
  if (!safe) {
1858
114k
    BROTLI_UNUSED(BrotliWarmupBitReader(br));
1859
114k
  }
1860
1861
  /* Jump into state machine. */
1862
205k
  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
1863
38.6k
    goto CommandBegin;
1864
167k
  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
1865
94.1k
    goto CommandInner;
1866
94.1k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
1867
21.7k
    goto CommandPostDecodeLiterals;
1868
51.2k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
1869
51.2k
    goto CommandPostWrapCopy;
1870
51.2k
  } else {
1871
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1872
0
  }
1873
1874
149M
CommandBegin:
1875
149M
  if (safe) {
1876
89.8M
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1877
89.8M
  }
1878
149M
  if (!CheckInputAmount(safe, br, 28)) {  /* 156 bits + 7 bytes */
1879
5.52k
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1880
5.52k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1881
5.52k
    goto saveStateAndReturn;
1882
5.52k
  }
1883
149M
  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
1884
1.70M
    BROTLI_SAFE(DecodeCommandBlockSwitch(s));
1885
1.70M
    goto CommandBegin;
1886
1.70M
  }
1887
  /* Read the insert/copy length in the command. */
1888
148M
  BROTLI_SAFE(ReadCommand(s, br, &i));
1889
148M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
1890
148M
              pos, i, s->copy_length));
1891
148M
  if (i == 0) {
1892
70.5M
    goto CommandPostDecodeLiterals;
1893
70.5M
  }
1894
77.6M
  s->meta_block_remaining_len -= i;
1895
1896
77.7M
CommandInner:
1897
77.7M
  if (safe) {
1898
50.1M
    s->state = BROTLI_STATE_COMMAND_INNER;
1899
50.1M
  }
1900
  /* Read the literals in the command. */
1901
77.7M
  if (s->trivial_literal_context) {
1902
68.4M
    uint32_t bits;
1903
68.4M
    uint32_t value;
1904
68.4M
    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
1905
679M
    do {
1906
679M
      if (!CheckInputAmount(safe, br, 28)) {  /* 162 bits + 7 bytes */
1907
8.22k
        s->state = BROTLI_STATE_COMMAND_INNER;
1908
8.22k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1909
8.22k
        goto saveStateAndReturn;
1910
8.22k
      }
1911
679M
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
1912
8.96M
        BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
1913
8.95M
        PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
1914
8.95M
        if (!s->trivial_literal_context) goto CommandInner;
1915
8.95M
      }
1916
679M
      if (!safe) {
1917
276M
        s->ringbuffer[pos] =
1918
276M
            (uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value);
1919
402M
      } else {
1920
402M
        uint32_t literal;
1921
402M
        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
1922
6.39k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1923
6.39k
          goto saveStateAndReturn;
1924
6.39k
        }
1925
402M
        s->ringbuffer[pos] = (uint8_t)literal;
1926
402M
      }
1927
679M
      --s->block_length[0];
1928
679M
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
1929
679M
      ++pos;
1930
679M
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
1931
62.8k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
1932
62.8k
        --i;
1933
62.8k
        goto saveStateAndReturn;
1934
62.8k
      }
1935
679M
    } while (--i != 0);
1936
68.4M
  } else {
1937
9.24M
    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
1938
9.24M
    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
1939
176M
    do {
1940
176M
      const HuffmanCode* hc;
1941
176M
      uint8_t context;
1942
176M
      if (!CheckInputAmount(safe, br, 28)) {  /* 162 bits + 7 bytes */
1943
1.45k
        s->state = BROTLI_STATE_COMMAND_INNER;
1944
1.45k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1945
1.45k
        goto saveStateAndReturn;
1946
1.45k
      }
1947
176M
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
1948
125k
        BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
1949
123k
        if (s->trivial_literal_context) goto CommandInner;
1950
123k
      }
1951
176M
      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
1952
176M
      BROTLI_LOG_UINT(context);
1953
176M
      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
1954
176M
      p2 = p1;
1955
176M
      if (!safe) {
1956
52.5M
        p1 = (uint8_t)ReadSymbol(hc, br);
1957
123M
      } else {
1958
123M
        uint32_t literal;
1959
123M
        if (!SafeReadSymbol(hc, br, &literal)) {
1960
1.33k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1961
1.33k
          goto saveStateAndReturn;
1962
1.33k
        }
1963
123M
        p1 = (uint8_t)literal;
1964
123M
      }
1965
176M
      s->ringbuffer[pos] = p1;
1966
176M
      --s->block_length[0];
1967
176M
      BROTLI_LOG_UINT(s->context_map_slice[context]);
1968
176M
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
1969
176M
      ++pos;
1970
176M
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
1971
12.4k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
1972
12.4k
        --i;
1973
12.4k
        goto saveStateAndReturn;
1974
12.4k
      }
1975
176M
    } while (--i != 0);
1976
9.24M
  }
1977
77.5M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
1978
77.5M
  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
1979
264
    s->state = BROTLI_STATE_METABLOCK_DONE;
1980
264
    goto saveStateAndReturn;
1981
264
  }
1982
1983
148M
CommandPostDecodeLiterals:
1984
148M
  if (safe) {
1985
89.7M
    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
1986
89.7M
  }
1987
148M
  if (s->distance_code >= 0) {
1988
    /* Implicit distance case. */
1989
84.3M
    s->distance_context = s->distance_code ? 0 : 1;
1990
84.3M
    --s->dist_rb_idx;
1991
84.3M
    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
1992
84.3M
  } else {
1993
    /* Read distance code in the command, unless it was implicitly zero. */
1994
63.8M
    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
1995
522k
      BROTLI_SAFE(DecodeDistanceBlockSwitch(s));
1996
516k
    }
1997
63.8M
    BROTLI_SAFE(ReadDistance(s, br));
1998
63.8M
  }
1999
148M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
2000
148M
              pos, s->distance_code));
2001
148M
  if (s->max_distance != s->max_backward_distance) {
2002
10.4M
    s->max_distance =
2003
10.4M
        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
2004
10.4M
  }
2005
148M
  i = s->copy_length;
2006
  /* Apply copy of LZ77 back-reference, or static dictionary reference if
2007
     the distance is larger than the max LZ77 distance */
2008
148M
  if (s->distance_code > s->max_distance) {
2009
    /* The maximum allowed distance is BROTLI_MAX_ALLOWED_DISTANCE = 0x7FFFFFFC.
2010
       With this choice, no signed overflow can occur after decoding
2011
       a special distance code (e.g., after adding 3 to the last distance). */
2012
37.0M
    if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
2013
37
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2014
37
          "len: %d bytes left: %d\n",
2015
37
          pos, s->distance_code, i, s->meta_block_remaining_len));
2016
37
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
2017
37
    }
2018
37.0M
    if (s->distance_code - s->max_distance - 1 < compound_dictionary_size) {
2019
0
      int address = compound_dictionary_size -
2020
0
          (s->distance_code - s->max_distance);
2021
0
      if (!InitializeCompoundDictionaryCopy(s, address, i)) {
2022
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_COMPOUND_DICTIONARY);
2023
0
      }
2024
0
      pos += CopyFromCompoundDictionary(s, pos);
2025
0
      if (pos >= s->ringbuffer_size) {
2026
0
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
2027
0
        goto saveStateAndReturn;
2028
0
      }
2029
37.0M
    } else if (i >= SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
2030
37.0M
               i <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
2031
37.0M
      uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2032
37.0M
      uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2033
37.0M
      uint8_t dict_id = s->dictionary->context_based ?
2034
0
          s->dictionary->context_map[BROTLI_CONTEXT(p1, p2, s->context_lookup)]
2035
37.0M
          : 0;
2036
37.0M
      const BrotliDictionary* words = s->dictionary->words[dict_id];
2037
37.0M
      const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
2038
37.0M
      int offset = (int)words->offsets_by_length[i];
2039
37.0M
      uint32_t shift = words->size_bits_by_length[i];
2040
37.0M
      int address =
2041
37.0M
          s->distance_code - s->max_distance - 1 - compound_dictionary_size;
2042
37.0M
      int mask = (int)BitMask(shift);
2043
37.0M
      int word_idx = address & mask;
2044
37.0M
      int transform_idx = address >> shift;
2045
      /* Compensate double distance-ring-buffer roll. */
2046
37.0M
      s->dist_rb_idx += s->distance_context;
2047
37.0M
      offset += word_idx * i;
2048
      /* If the distance is out of bound, select a next static dictionary if
2049
         there exist multiple. */
2050
37.0M
      if ((transform_idx >= (int)transforms->num_transforms ||
2051
37.0M
          words->size_bits_by_length[i] == 0) &&
2052
37.0M
          s->dictionary->num_dictionaries > 1) {
2053
0
        uint8_t dict_id2;
2054
0
        int dist_remaining = address -
2055
0
            (int)(((1u << shift) & ~1u)) * (int)transforms->num_transforms;
2056
0
        for (dict_id2 = 0; dict_id2 < s->dictionary->num_dictionaries;
2057
0
            dict_id2++) {
2058
0
          const BrotliDictionary* words2 = s->dictionary->words[dict_id2];
2059
0
          if (dict_id2 != dict_id && words2->size_bits_by_length[i] != 0) {
2060
0
            const BrotliTransforms* transforms2 =
2061
0
                s->dictionary->transforms[dict_id2];
2062
0
            uint32_t shift2 = words2->size_bits_by_length[i];
2063
0
            int num = (int)((1u << shift2) & ~1u) *
2064
0
                (int)transforms2->num_transforms;
2065
0
            if (dist_remaining < num) {
2066
0
              dict_id = dict_id2;
2067
0
              words = words2;
2068
0
              transforms = transforms2;
2069
0
              address = dist_remaining;
2070
0
              shift = shift2;
2071
0
              mask = (int)BitMask(shift);
2072
0
              word_idx = address & mask;
2073
0
              transform_idx = address >> shift;
2074
0
              offset = (int)words->offsets_by_length[i] + word_idx * i;
2075
0
              break;
2076
0
            }
2077
0
            dist_remaining -= num;
2078
0
          }
2079
0
        }
2080
0
      }
2081
37.0M
      if (BROTLI_PREDICT_FALSE(words->size_bits_by_length[i] == 0)) {
2082
22
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2083
22
            "len: %d bytes left: %d\n",
2084
22
            pos, s->distance_code, i, s->meta_block_remaining_len));
2085
22
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2086
22
      }
2087
37.0M
      if (BROTLI_PREDICT_FALSE(!words->data)) {
2088
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
2089
0
      }
2090
37.0M
      if (transform_idx < (int)transforms->num_transforms) {
2091
37.0M
        const uint8_t* word = &words->data[offset];
2092
37.0M
        int len = i;
2093
37.0M
        if (transform_idx == transforms->cutOffTransforms[0]) {
2094
36.2M
          memcpy(&s->ringbuffer[pos], word, (size_t)len);
2095
36.2M
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
2096
36.2M
                      len, word));
2097
36.2M
        } else {
2098
788k
          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
2099
788k
              transforms, transform_idx);
2100
788k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
2101
788k
                      " transform_idx = %d, transformed: [%.*s]\n",
2102
788k
                      i, word, transform_idx, len, &s->ringbuffer[pos]));
2103
788k
          if (len == 0 && s->distance_code <= 120) {
2104
0
            BROTLI_LOG(("Invalid length-0 dictionary word after transform\n"));
2105
0
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
2106
0
          }
2107
788k
        }
2108
37.0M
        pos += len;
2109
37.0M
        s->meta_block_remaining_len -= len;
2110
37.0M
        if (pos >= s->ringbuffer_size) {
2111
8.78k
          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
2112
8.78k
          goto saveStateAndReturn;
2113
8.78k
        }
2114
37.0M
      } else {
2115
119
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2116
119
            "len: %d bytes left: %d\n",
2117
119
            pos, s->distance_code, i, s->meta_block_remaining_len));
2118
119
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
2119
119
      }
2120
37.0M
    } else {
2121
83
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2122
83
          "len: %d bytes left: %d\n",
2123
83
          pos, s->distance_code, i, s->meta_block_remaining_len));
2124
83
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2125
83
    }
2126
111M
  } else {
2127
111M
    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
2128
111M
    uint8_t* copy_dst = &s->ringbuffer[pos];
2129
111M
    uint8_t* copy_src = &s->ringbuffer[src_start];
2130
111M
    int dst_end = pos + i;
2131
111M
    int src_end = src_start + i;
2132
    /* Update the recent distances cache. */
2133
111M
    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
2134
111M
    ++s->dist_rb_idx;
2135
111M
    s->meta_block_remaining_len -= i;
2136
    /* There are 32+ bytes of slack in the ring-buffer allocation.
2137
       Also, we have 16 short codes, that make these 16 bytes irrelevant
2138
       in the ring-buffer. Let's copy over them as a first guess. */
2139
111M
    memmove16(copy_dst, copy_src);
2140
111M
    if (src_end > pos && dst_end > src_start) {
2141
      /* Regions intersect. */
2142
56.1M
      goto CommandPostWrapCopy;
2143
56.1M
    }
2144
54.9M
    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
2145
      /* At least one region wraps. */
2146
53.9k
      goto CommandPostWrapCopy;
2147
53.9k
    }
2148
54.9M
    pos += i;
2149
54.9M
    if (i > 16) {
2150
623k
      if (i > 32) {
2151
83.2k
        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
2152
540k
      } else {
2153
        /* This branch covers about 45% cases.
2154
           Fixed size short copy allows more compiler optimizations. */
2155
540k
        memmove16(copy_dst + 16, copy_src + 16);
2156
540k
      }
2157
623k
    }
2158
54.9M
  }
2159
91.9M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2160
91.9M
  if (s->meta_block_remaining_len <= 0) {
2161
    /* Next metablock, if any. */
2162
138
    s->state = BROTLI_STATE_METABLOCK_DONE;
2163
138
    goto saveStateAndReturn;
2164
91.9M
  } else {
2165
91.9M
    goto CommandBegin;
2166
91.9M
  }
2167
56.2M
CommandPostWrapCopy:
2168
56.2M
  {
2169
56.2M
    int wrap_guard = s->ringbuffer_size - pos;
2170
964M
    while (--i >= 0) {
2171
908M
      s->ringbuffer[pos] =
2172
908M
          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
2173
908M
      ++pos;
2174
908M
      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
2175
51.3k
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
2176
51.3k
        goto saveStateAndReturn;
2177
51.3k
      }
2178
908M
    }
2179
56.2M
  }
2180
56.2M
  if (s->meta_block_remaining_len <= 0) {
2181
    /* Next metablock, if any. */
2182
155
    s->state = BROTLI_STATE_METABLOCK_DONE;
2183
155
    goto saveStateAndReturn;
2184
56.2M
  } else {
2185
56.2M
    goto CommandBegin;
2186
56.2M
  }
2187
2188
281k
saveStateAndReturn:
2189
281k
  s->pos = pos;
2190
281k
  s->loop_counter = i;
2191
281k
  return result;
2192
56.2M
}
2193
2194
#undef BROTLI_SAFE
2195
2196
static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
2197
190k
    BrotliDecoderState* s) {
2198
190k
  return ProcessCommandsInternal(0, s);
2199
190k
}
2200
2201
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
2202
91.1k
    BrotliDecoderState* s) {
2203
91.1k
  return ProcessCommandsInternal(1, s);
2204
91.1k
}
2205
2206
BrotliDecoderResult BrotliDecoderDecompress(
2207
    size_t encoded_size,
2208
    const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)],
2209
    size_t* decoded_size,
2210
0
    uint8_t decoded_buffer[BROTLI_ARRAY_PARAM(*decoded_size)]) {
2211
0
  BrotliDecoderState s;
2212
0
  BrotliDecoderResult result;
2213
0
  size_t total_out = 0;
2214
0
  size_t available_in = encoded_size;
2215
0
  const uint8_t* next_in = encoded_buffer;
2216
0
  size_t available_out = *decoded_size;
2217
0
  uint8_t* next_out = decoded_buffer;
2218
0
  if (!BrotliDecoderStateInit(&s, 0, 0, 0)) {
2219
0
    return BROTLI_DECODER_RESULT_ERROR;
2220
0
  }
2221
0
  result = BrotliDecoderDecompressStream(
2222
0
      &s, &available_in, &next_in, &available_out, &next_out, &total_out);
2223
0
  *decoded_size = total_out;
2224
0
  BrotliDecoderStateCleanup(&s);
2225
0
  if (result != BROTLI_DECODER_RESULT_SUCCESS) {
2226
0
    result = BROTLI_DECODER_RESULT_ERROR;
2227
0
  }
2228
0
  return result;
2229
0
}
2230
2231
/* Invariant: input stream is never overconsumed:
2232
    - invalid input implies that the whole stream is invalid -> any amount of
2233
      input could be read and discarded
2234
    - when result is "needs more input", then at least one more byte is REQUIRED
2235
      to complete decoding; all input data MUST be consumed by decoder, so
2236
      client could swap the input buffer
2237
    - when result is "needs more output" decoder MUST ensure that it doesn't
2238
      hold more than 7 bits in bit reader; this saves client from swapping input
2239
      buffer ahead of time
2240
    - when result is "success" decoder MUST return all unused data back to input
2241
      buffer; this is possible because the invariant is held on enter */
2242
BrotliDecoderResult BrotliDecoderDecompressStream(
2243
    BrotliDecoderState* s, size_t* available_in, const uint8_t** next_in,
2244
137k
    size_t* available_out, uint8_t** next_out, size_t* total_out) {
2245
137k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2246
137k
  BrotliBitReader* br = &s->br;
2247
137k
  size_t input_size = *available_in;
2248
137k
#define BROTLI_SAVE_ERROR_CODE(code) \
2249
137k
    SaveErrorCode(s, (code), input_size - *available_in)
2250
  /* Ensure that |total_out| is set, even if no data will ever be pushed out. */
2251
137k
  if (total_out) {
2252
0
    *total_out = s->partial_pos_out;
2253
0
  }
2254
  /* Do not try to process further in a case of unrecoverable error. */
2255
137k
  if ((int)s->error_code < 0) {
2256
0
    return BROTLI_DECODER_RESULT_ERROR;
2257
0
  }
2258
137k
  if (*available_out && (!next_out || !*next_out)) {
2259
0
    return BROTLI_SAVE_ERROR_CODE(
2260
0
        BROTLI_FAILURE(BROTLI_DECODER_ERROR_INVALID_ARGUMENTS));
2261
0
  }
2262
137k
  if (!*available_out) next_out = 0;
2263
137k
  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
2264
131k
    br->avail_in = *available_in;
2265
131k
    br->next_in = *next_in;
2266
131k
  } else {
2267
    /* At least one byte of input is required. More than one byte of input may
2268
       be required to complete the transaction -> reading more data must be
2269
       done in a loop -> do it in a main loop. */
2270
5.89k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2271
5.89k
    br->next_in = &s->buffer.u8[0];
2272
5.89k
  }
2273
  /* State machine */
2274
638k
  for (;;) {
2275
638k
    if (result != BROTLI_DECODER_SUCCESS) {
2276
      /* Error, needs more input/output. */
2277
146k
      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2278
117k
        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
2279
71.2k
          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
2280
71.2k
              available_out, next_out, total_out, BROTLI_TRUE);
2281
          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
2282
71.2k
          if ((int)intermediate_result < 0) {
2283
38
            result = intermediate_result;
2284
38
            break;
2285
38
          }
2286
71.2k
        }
2287
117k
        if (s->buffer_length != 0) {  /* Used with internal buffer. */
2288
11.5k
          if (br->avail_in == 0) {
2289
            /* Successfully finished read transaction.
2290
               Accumulator contains less than 8 bits, because internal buffer
2291
               is expanded byte-by-byte until it is enough to complete read. */
2292
4.61k
            s->buffer_length = 0;
2293
            /* Switch to input stream and restart. */
2294
4.61k
            result = BROTLI_DECODER_SUCCESS;
2295
4.61k
            br->avail_in = *available_in;
2296
4.61k
            br->next_in = *next_in;
2297
4.61k
            continue;
2298
6.93k
          } else if (*available_in != 0) {
2299
            /* Not enough data in buffer, but can take one more byte from
2300
               input stream. */
2301
6.11k
            result = BROTLI_DECODER_SUCCESS;
2302
6.11k
            s->buffer.u8[s->buffer_length] = **next_in;
2303
6.11k
            s->buffer_length++;
2304
6.11k
            br->avail_in = s->buffer_length;
2305
6.11k
            (*next_in)++;
2306
6.11k
            (*available_in)--;
2307
            /* Retry with more data in buffer. */
2308
6.11k
            continue;
2309
6.11k
          }
2310
          /* Can't finish reading and no more input. */
2311
817
          break;
2312
105k
        } else {  /* Input stream doesn't contain enough input. */
2313
          /* Copy tail to internal buffer and return. */
2314
105k
          *next_in = br->next_in;
2315
105k
          *available_in = br->avail_in;
2316
111k
          while (*available_in) {
2317
5.50k
            s->buffer.u8[s->buffer_length] = **next_in;
2318
5.50k
            s->buffer_length++;
2319
5.50k
            (*next_in)++;
2320
5.50k
            (*available_in)--;
2321
5.50k
          }
2322
105k
          break;
2323
105k
        }
2324
        /* Unreachable. */
2325
117k
      }
2326
2327
      /* Fail or needs more output. */
2328
2329
29.4k
      if (s->buffer_length != 0) {
2330
        /* Just consumed the buffered input and produced some output. Otherwise
2331
           it would result in "needs more input". Reset internal buffer. */
2332
447
        s->buffer_length = 0;
2333
29.0k
      } else {
2334
        /* Using input stream in last iteration. When decoder switches to input
2335
           stream it has less than 8 bits in accumulator, so it is safe to
2336
           return unused accumulator bits there. */
2337
29.0k
        BrotliBitReaderUnload(br);
2338
29.0k
        *available_in = br->avail_in;
2339
29.0k
        *next_in = br->next_in;
2340
29.0k
      }
2341
29.4k
      break;
2342
146k
    }
2343
491k
    switch (s->state) {
2344
12.8k
      case BROTLI_STATE_UNINITED:
2345
        /* Prepare to the first read. */
2346
12.8k
        if (!BrotliWarmupBitReader(br)) {
2347
1.58k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2348
1.58k
          break;
2349
1.58k
        }
2350
        /* Decode window size. */
2351
11.2k
        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
2352
11.2k
        if (result != BROTLI_DECODER_SUCCESS) {
2353
3
          break;
2354
3
        }
2355
11.2k
        if (s->large_window) {
2356
0
          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
2357
0
          break;
2358
0
        }
2359
11.2k
        s->state = BROTLI_STATE_INITIALIZE;
2360
11.2k
        break;
2361
2362
0
      case BROTLI_STATE_LARGE_WINDOW_BITS:
2363
0
        if (!BrotliSafeReadBits(br, 6, &s->window_bits)) {
2364
0
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2365
0
          break;
2366
0
        }
2367
0
        if (s->window_bits < BROTLI_LARGE_MIN_WBITS ||
2368
0
            s->window_bits > BROTLI_LARGE_MAX_WBITS) {
2369
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
2370
0
          break;
2371
0
        }
2372
0
        s->state = BROTLI_STATE_INITIALIZE;
2373
      /* Fall through. */
2374
2375
11.2k
      case BROTLI_STATE_INITIALIZE:
2376
11.2k
        BROTLI_LOG_UINT(s->window_bits);
2377
        /* Maximum distance, see section 9.1. of the spec. */
2378
11.2k
        s->max_backward_distance = (1 << s->window_bits) - BROTLI_WINDOW_GAP;
2379
2380
        /* Allocate memory for both block_type_trees and block_len_trees. */
2381
11.2k
        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
2382
11.2k
            sizeof(HuffmanCode) * 3 *
2383
11.2k
                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2384
11.2k
        if (s->block_type_trees == 0) {
2385
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES);
2386
0
          break;
2387
0
        }
2388
11.2k
        s->block_len_trees =
2389
11.2k
            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
2390
2391
11.2k
        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2392
      /* Fall through. */
2393
2394
16.8k
      case BROTLI_STATE_METABLOCK_BEGIN:
2395
16.8k
        BrotliDecoderStateMetablockBegin(s);
2396
16.8k
        BROTLI_LOG_UINT(s->pos);
2397
16.8k
        s->state = BROTLI_STATE_METABLOCK_HEADER;
2398
      /* Fall through. */
2399
2400
21.5k
      case BROTLI_STATE_METABLOCK_HEADER:
2401
21.5k
        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
2402
21.5k
        if (result != BROTLI_DECODER_SUCCESS) {
2403
4.82k
          break;
2404
4.82k
        }
2405
16.7k
        BROTLI_LOG_UINT(s->is_last_metablock);
2406
16.7k
        BROTLI_LOG_UINT(s->meta_block_remaining_len);
2407
16.7k
        BROTLI_LOG_UINT(s->is_metadata);
2408
16.7k
        BROTLI_LOG_UINT(s->is_uncompressed);
2409
16.7k
        if (s->is_metadata || s->is_uncompressed) {
2410
7.41k
          if (!BrotliJumpToByteBoundary(br)) {
2411
35
            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
2412
35
            break;
2413
35
          }
2414
7.41k
        }
2415
16.6k
        if (s->is_metadata) {
2416
2.11k
          s->state = BROTLI_STATE_METADATA;
2417
2.11k
          break;
2418
2.11k
        }
2419
14.5k
        if (s->meta_block_remaining_len == 0) {
2420
546
          s->state = BROTLI_STATE_METABLOCK_DONE;
2421
546
          break;
2422
546
        }
2423
14.0k
        BrotliCalculateRingBufferSize(s);
2424
14.0k
        if (s->is_uncompressed) {
2425
5.27k
          s->state = BROTLI_STATE_UNCOMPRESSED;
2426
5.27k
          break;
2427
5.27k
        }
2428
8.74k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER;
2429
      /* Fall through. */
2430
2431
8.74k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: {
2432
8.74k
        BrotliMetablockHeaderArena* h = &s->arena.header;
2433
8.74k
        s->loop_counter = 0;
2434
        /* Initialize compressed metablock header arena. */
2435
8.74k
        h->sub_loop_counter = 0;
2436
        /* Make small negative indexes addressable. */
2437
8.74k
        h->symbol_lists =
2438
8.74k
            &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
2439
8.74k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
2440
8.74k
        h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
2441
8.74k
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
2442
8.74k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2443
8.74k
      }
2444
      /* Fall through. */
2445
2446
35.0k
      case BROTLI_STATE_HUFFMAN_CODE_0:
2447
35.0k
        if (s->loop_counter >= 3) {
2448
8.31k
          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
2449
8.31k
          break;
2450
8.31k
        }
2451
        /* Reads 1..11 bits. */
2452
26.7k
        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
2453
26.7k
        if (result != BROTLI_DECODER_SUCCESS) {
2454
1.16k
          break;
2455
1.16k
        }
2456
25.5k
        s->num_block_types[s->loop_counter]++;
2457
25.5k
        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2458
25.5k
        if (s->num_block_types[s->loop_counter] < 2) {
2459
17.4k
          s->loop_counter++;
2460
17.4k
          break;
2461
17.4k
        }
2462
8.11k
        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2463
      /* Fall through. */
2464
2465
10.1k
      case BROTLI_STATE_HUFFMAN_CODE_1: {
2466
10.1k
        uint32_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
2467
10.1k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2468
10.1k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2469
10.1k
            &s->block_type_trees[tree_offset], NULL, s);
2470
10.1k
        if (result != BROTLI_DECODER_SUCCESS) break;
2471
7.86k
        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2472
7.86k
      }
2473
      /* Fall through. */
2474
2475
9.88k
      case BROTLI_STATE_HUFFMAN_CODE_2: {
2476
9.88k
        uint32_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
2477
9.88k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2478
9.88k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2479
9.88k
            &s->block_len_trees[tree_offset], NULL, s);
2480
9.88k
        if (result != BROTLI_DECODER_SUCCESS) break;
2481
7.74k
        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2482
7.74k
      }
2483
      /* Fall through. */
2484
2485
8.44k
      case BROTLI_STATE_HUFFMAN_CODE_3: {
2486
8.44k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2487
8.44k
        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2488
8.44k
            &s->block_len_trees[tree_offset], br)) {
2489
711
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2490
711
          break;
2491
711
        }
2492
7.73k
        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2493
7.73k
        s->loop_counter++;
2494
7.73k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2495
7.73k
        break;
2496
8.44k
      }
2497
2498
11.9k
      case BROTLI_STATE_UNCOMPRESSED: {
2499
11.9k
        result = CopyUncompressedBlockToOutput(
2500
11.9k
            available_out, next_out, total_out, s);
2501
11.9k
        if (result != BROTLI_DECODER_SUCCESS) {
2502
8.43k
          break;
2503
8.43k
        }
2504
3.50k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2505
3.50k
        break;
2506
11.9k
      }
2507
2508
3.64k
      case BROTLI_STATE_METADATA:
2509
16.0M
        for (; s->meta_block_remaining_len > 0; --s->meta_block_remaining_len) {
2510
16.0M
          uint32_t bits;
2511
          /* Read one byte and ignore it. */
2512
16.0M
          if (!BrotliSafeReadBits(br, 8, &bits)) {
2513
1.78k
            result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2514
1.78k
            break;
2515
1.78k
          }
2516
16.0M
        }
2517
3.64k
        if (result == BROTLI_DECODER_SUCCESS) {
2518
1.86k
          s->state = BROTLI_STATE_METABLOCK_DONE;
2519
1.86k
        }
2520
3.64k
        break;
2521
2522
9.05k
      case BROTLI_STATE_METABLOCK_HEADER_2: {
2523
9.05k
        uint32_t bits;
2524
9.05k
        if (!BrotliSafeReadBits(br, 6, &bits)) {
2525
765
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2526
765
          break;
2527
765
        }
2528
8.29k
        s->distance_postfix_bits = bits & BitMask(2);
2529
8.29k
        bits >>= 2;
2530
8.29k
        s->num_direct_distance_codes = bits << s->distance_postfix_bits;
2531
8.29k
        BROTLI_LOG_UINT(s->num_direct_distance_codes);
2532
8.29k
        BROTLI_LOG_UINT(s->distance_postfix_bits);
2533
8.29k
        s->context_modes =
2534
8.29k
            (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
2535
8.29k
        if (s->context_modes == 0) {
2536
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
2537
0
          break;
2538
0
        }
2539
8.29k
        s->loop_counter = 0;
2540
8.29k
        s->state = BROTLI_STATE_CONTEXT_MODES;
2541
8.29k
      }
2542
      /* Fall through. */
2543
2544
10.2k
      case BROTLI_STATE_CONTEXT_MODES:
2545
10.2k
        result = ReadContextModes(s);
2546
10.2k
        if (result != BROTLI_DECODER_SUCCESS) {
2547
1.96k
          break;
2548
1.96k
        }
2549
8.25k
        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2550
      /* Fall through. */
2551
2552
18.7k
      case BROTLI_STATE_CONTEXT_MAP_1:
2553
18.7k
        result = DecodeContextMap(
2554
18.7k
            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2555
18.7k
            &s->num_literal_htrees, &s->context_map, s);
2556
18.7k
        if (result != BROTLI_DECODER_SUCCESS) {
2557
10.8k
          break;
2558
10.8k
        }
2559
7.89k
        DetectTrivialLiteralBlockTypes(s);
2560
7.89k
        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2561
      /* Fall through. */
2562
2563
9.04k
      case BROTLI_STATE_CONTEXT_MAP_2: {
2564
9.04k
        uint32_t npostfix = s->distance_postfix_bits;
2565
9.04k
        uint32_t ndirect = s->num_direct_distance_codes;
2566
9.04k
        uint32_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2567
9.04k
            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
2568
9.04k
        uint32_t distance_alphabet_size_limit = distance_alphabet_size_max;
2569
9.04k
        BROTLI_BOOL allocation_success = BROTLI_TRUE;
2570
9.04k
        if (s->large_window) {
2571
0
          BrotliDistanceCodeLimit limit = BrotliCalculateDistanceCodeLimit(
2572
0
              BROTLI_MAX_ALLOWED_DISTANCE, npostfix, ndirect);
2573
0
          distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2574
0
              npostfix, ndirect, BROTLI_LARGE_MAX_DISTANCE_BITS);
2575
0
          distance_alphabet_size_limit = limit.max_alphabet_size;
2576
0
        }
2577
9.04k
        result = DecodeContextMap(
2578
9.04k
            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2579
9.04k
            &s->num_dist_htrees, &s->dist_context_map, s);
2580
9.04k
        if (result != BROTLI_DECODER_SUCCESS) {
2581
1.33k
          break;
2582
1.33k
        }
2583
7.70k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2584
7.70k
            s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
2585
7.70k
            BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
2586
7.70k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2587
7.70k
            s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
2588
7.70k
            BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
2589
7.70k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2590
7.70k
            s, &s->distance_hgroup, distance_alphabet_size_max,
2591
7.70k
            distance_alphabet_size_limit, s->num_dist_htrees);
2592
7.70k
        if (!allocation_success) {
2593
0
          return BROTLI_SAVE_ERROR_CODE(
2594
0
              BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
2595
0
        }
2596
7.70k
        s->loop_counter = 0;
2597
7.70k
        s->state = BROTLI_STATE_TREE_GROUP;
2598
7.70k
      }
2599
      /* Fall through. */
2600
2601
41.0k
      case BROTLI_STATE_TREE_GROUP: {
2602
41.0k
        HuffmanTreeGroup* hgroup = NULL;
2603
41.0k
        switch (s->loop_counter) {
2604
15.2k
          case 0: hgroup = &s->literal_hgroup; break;
2605
13.2k
          case 1: hgroup = &s->insert_copy_hgroup; break;
2606
12.6k
          case 2: hgroup = &s->distance_hgroup; break;
2607
0
          default: return BROTLI_SAVE_ERROR_CODE(BROTLI_FAILURE(
2608
41.0k
              BROTLI_DECODER_ERROR_UNREACHABLE));  /* COV_NF_LINE */
2609
41.0k
        }
2610
41.0k
        result = HuffmanTreeGroupDecode(hgroup, s);
2611
41.0k
        if (result != BROTLI_DECODER_SUCCESS) break;
2612
20.9k
        s->loop_counter++;
2613
20.9k
        if (s->loop_counter < 3) {
2614
14.1k
          break;
2615
14.1k
        }
2616
6.77k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY;
2617
6.77k
      }
2618
      /* Fall through. */
2619
2620
6.77k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY:
2621
6.77k
        PrepareLiteralDecoding(s);
2622
6.77k
        s->dist_context_map_slice = s->dist_context_map;
2623
6.77k
        s->htree_command = s->insert_copy_hgroup.htrees[0];
2624
6.77k
        if (!BrotliEnsureRingBuffer(s)) {
2625
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
2626
0
          break;
2627
0
        }
2628
6.77k
        CalculateDistanceLut(s);
2629
6.77k
        s->state = BROTLI_STATE_COMMAND_BEGIN;
2630
      /* Fall through. */
2631
2632
33.1k
      case BROTLI_STATE_COMMAND_BEGIN:
2633
      /* Fall through. */
2634
117k
      case BROTLI_STATE_COMMAND_INNER:
2635
      /* Fall through. */
2636
139k
      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2637
      /* Fall through. */
2638
190k
      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2639
190k
        result = ProcessCommands(s);
2640
190k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2641
91.1k
          result = SafeProcessCommands(s);
2642
91.1k
        }
2643
190k
        break;
2644
2645
88.0k
      case BROTLI_STATE_COMMAND_INNER_WRITE:
2646
      /* Fall through. */
2647
100k
      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2648
      /* Fall through. */
2649
163k
      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2650
163k
        result = WriteRingBuffer(
2651
163k
            s, available_out, next_out, total_out, BROTLI_FALSE);
2652
163k
        if (result != BROTLI_DECODER_SUCCESS) {
2653
27.9k
          break;
2654
27.9k
        }
2655
135k
        WrapRingBuffer(s);
2656
135k
        if (s->ringbuffer_size == 1 << s->window_bits) {
2657
135k
          s->max_distance = s->max_backward_distance;
2658
135k
        }
2659
135k
        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
2660
8.78k
          BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
2661
8.78k
          if (addon && (addon->br_length != addon->br_copied)) {
2662
0
            s->pos += CopyFromCompoundDictionary(s, s->pos);
2663
0
            if (s->pos >= s->ringbuffer_size) continue;
2664
0
          }
2665
8.78k
          if (s->meta_block_remaining_len == 0) {
2666
            /* Next metablock, if any. */
2667
3
            s->state = BROTLI_STATE_METABLOCK_DONE;
2668
8.78k
          } else {
2669
8.78k
            s->state = BROTLI_STATE_COMMAND_BEGIN;
2670
8.78k
          }
2671
8.78k
          break;
2672
126k
        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2673
51.2k
          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2674
75.2k
        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2675
75.2k
          if (s->loop_counter == 0) {
2676
4.48k
            if (s->meta_block_remaining_len == 0) {
2677
4
              s->state = BROTLI_STATE_METABLOCK_DONE;
2678
4.48k
            } else {
2679
4.48k
              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2680
4.48k
            }
2681
4.48k
            break;
2682
4.48k
          }
2683
70.7k
          s->state = BROTLI_STATE_COMMAND_INNER;
2684
70.7k
        }
2685
122k
        break;
2686
2687
122k
      case BROTLI_STATE_METABLOCK_DONE:
2688
6.48k
        if (s->meta_block_remaining_len < 0) {
2689
229
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
2690
229
          break;
2691
229
        }
2692
6.25k
        BrotliDecoderStateCleanupAfterMetablock(s);
2693
6.25k
        if (!s->is_last_metablock) {
2694
5.62k
          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2695
5.62k
          break;
2696
5.62k
        }
2697
631
        if (!BrotliJumpToByteBoundary(br)) {
2698
32
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2699
32
          break;
2700
32
        }
2701
599
        if (s->buffer_length == 0) {
2702
596
          BrotliBitReaderUnload(br);
2703
596
          *available_in = br->avail_in;
2704
596
          *next_in = br->next_in;
2705
596
        }
2706
599
        s->state = BROTLI_STATE_DONE;
2707
      /* Fall through. */
2708
2709
1.63k
      case BROTLI_STATE_DONE:
2710
1.63k
        if (s->ringbuffer != 0) {
2711
1.24k
          result = WriteRingBuffer(
2712
1.24k
              s, available_out, next_out, total_out, BROTLI_TRUE);
2713
1.24k
          if (result != BROTLI_DECODER_SUCCESS) {
2714
139
            break;
2715
139
          }
2716
1.24k
        }
2717
1.50k
        return BROTLI_SAVE_ERROR_CODE(result);
2718
491k
    }
2719
491k
  }
2720
136k
  return BROTLI_SAVE_ERROR_CODE(result);
2721
137k
#undef BROTLI_SAVE_ERROR_CODE
2722
137k
}
2723
2724
424
BROTLI_BOOL BrotliDecoderHasMoreOutput(const BrotliDecoderState* s) {
2725
  /* After unrecoverable error remaining output is considered nonsensical. */
2726
424
  if ((int)s->error_code < 0) {
2727
0
    return BROTLI_FALSE;
2728
0
  }
2729
424
  return TO_BROTLI_BOOL(
2730
424
      s->ringbuffer != 0 && UnwrittenBytes(s, BROTLI_FALSE) != 0);
2731
424
}
2732
2733
0
const uint8_t* BrotliDecoderTakeOutput(BrotliDecoderState* s, size_t* size) {
2734
0
  uint8_t* result = 0;
2735
0
  size_t available_out = *size ? *size : 1u << 24;
2736
0
  size_t requested_out = available_out;
2737
0
  BrotliDecoderErrorCode status;
2738
0
  if ((s->ringbuffer == 0) || ((int)s->error_code < 0)) {
2739
0
    *size = 0;
2740
0
    return 0;
2741
0
  }
2742
0
  WrapRingBuffer(s);
2743
0
  status = WriteRingBuffer(s, &available_out, &result, 0, BROTLI_TRUE);
2744
  /* Either WriteRingBuffer returns those "success" codes... */
2745
0
  if (status == BROTLI_DECODER_SUCCESS ||
2746
0
      status == BROTLI_DECODER_NEEDS_MORE_OUTPUT) {
2747
0
    *size = requested_out - available_out;
2748
0
  } else {
2749
    /* ... or stream is broken. Normally this should be caught by
2750
       BrotliDecoderDecompressStream, this is just a safeguard. */
2751
0
    if ((int)status < 0) SaveErrorCode(s, status, 0);
2752
0
    *size = 0;
2753
0
    result = 0;
2754
0
  }
2755
0
  return result;
2756
0
}
2757
2758
0
BROTLI_BOOL BrotliDecoderIsUsed(const BrotliDecoderState* s) {
2759
0
  return TO_BROTLI_BOOL(s->state != BROTLI_STATE_UNINITED ||
2760
0
      BrotliGetAvailableBits(&s->br) != 0);
2761
0
}
2762
2763
903
BROTLI_BOOL BrotliDecoderIsFinished(const BrotliDecoderState* s) {
2764
903
  return TO_BROTLI_BOOL(s->state == BROTLI_STATE_DONE) &&
2765
903
      !BrotliDecoderHasMoreOutput(s);
2766
903
}
2767
2768
58
BrotliDecoderErrorCode BrotliDecoderGetErrorCode(const BrotliDecoderState* s) {
2769
58
  return (BrotliDecoderErrorCode)s->error_code;
2770
58
}
2771
2772
58
const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c) {
2773
58
  switch (c) {
2774
0
#define BROTLI_ERROR_CODE_CASE_(PREFIX, NAME, CODE) \
2775
58
    case BROTLI_DECODER ## PREFIX ## NAME: return #NAME;
2776
0
#define BROTLI_NOTHING_
2777
58
    BROTLI_DECODER_ERROR_CODES_LIST(BROTLI_ERROR_CODE_CASE_, BROTLI_NOTHING_)
2778
0
#undef BROTLI_ERROR_CODE_CASE_
2779
0
#undef BROTLI_NOTHING_
2780
0
    default: return "INVALID";
2781
58
  }
2782
58
}
2783
2784
0
uint32_t BrotliDecoderVersion(void) {
2785
0
  return BROTLI_VERSION;
2786
0
}
2787
2788
/* Escalate internal functions visibility; for testing purposes only. */
2789
#if defined(BROTLI_TEST)
2790
BROTLI_BOOL SafeReadSymbolForTest(
2791
    const HuffmanCode*, BrotliBitReader*, uint32_t*);
2792
BROTLI_BOOL SafeReadSymbolForTest(
2793
    const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
2794
  return SafeReadSymbol(table, br, result);
2795
}
2796
2797
void InverseMoveToFrontTransformForTest(
2798
    uint8_t*, uint32_t, BrotliDecoderState*);
2799
void InverseMoveToFrontTransformForTest(
2800
    uint8_t* v, uint32_t l, BrotliDecoderState* s) {
2801
  InverseMoveToFrontTransform(v, l, s);
2802
}
2803
#endif
2804
2805
#if defined(__cplusplus) || defined(c_plusplus)
2806
}  /* extern "C" */
2807
#endif