Coverage Report

Created: 2026-05-31 06:50

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