Coverage Report

Created: 2026-09-01 07:13

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
1.53k
#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
2.58G
#define HUFFMAN_TABLE_BITS 8U
40
3.82k
#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
5.01k
    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
82
5.01k
  BrotliDecoderState* state = 0;
83
5.01k
  if (!BrotliDecoderEnsureStaticInit()) {
84
0
    BROTLI_DUMP();
85
0
    return 0;
86
0
  }
87
5.01k
  if (!alloc_func && !free_func) {
88
5.01k
    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
89
5.01k
  } else if (alloc_func && free_func) {
90
0
    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
91
0
  }
92
5.01k
  if (state == 0) {
93
0
    BROTLI_DUMP();
94
0
    return 0;
95
0
  }
96
5.01k
  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
5.01k
  return state;
106
5.01k
}
107
108
/* Deinitializes and frees BrotliDecoderState instance. */
109
5.01k
void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
110
5.01k
  if (!state) {
111
0
    return;
112
5.01k
  } else {
113
5.01k
    brotli_free_func free_func = state->free_func;
114
5.01k
    void* opaque = state->memory_manager_opaque;
115
5.01k
    BrotliDecoderStateCleanup(state);
116
5.01k
    free_func(opaque, state);
117
5.01k
  }
118
5.01k
}
119
120
/* Saves error code and converts it to BrotliDecoderResult. */
121
static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
122
4.85M
    BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
123
4.85M
  s->error_code = (int)e;
124
4.85M
  s->used_input += consumed_input;
125
4.85M
  if ((s->buffer_length != 0) && (s->br.next_in == s->br.last_in)) {
126
    /* If internal buffer is depleted at last, reset it. */
127
7
    s->buffer_length = 0;
128
7
  }
129
4.85M
  switch (e) {
130
101
    case BROTLI_DECODER_SUCCESS:
131
101
      return BROTLI_DECODER_RESULT_SUCCESS;
132
133
1.24M
    case BROTLI_DECODER_NEEDS_MORE_INPUT:
134
1.24M
      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
135
136
3.61M
    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
137
3.61M
      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
138
139
1.54k
    default:
140
1.54k
      return BROTLI_DECODER_RESULT_ERROR;
141
4.85M
  }
142
4.85M
}
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
5.01k
                                               BrotliBitReader* br) {
148
5.01k
  brotli_reg_t n;
149
5.01k
  BROTLI_BOOL large_window = s->large_window;
150
5.01k
  s->large_window = BROTLI_FALSE;
151
5.01k
  BrotliTakeBits(br, 1, &n);
152
5.01k
  if (n == 0) {
153
3.44k
    s->window_bits = 16;
154
3.44k
    return BROTLI_DECODER_SUCCESS;
155
3.44k
  }
156
1.57k
  BrotliTakeBits(br, 3, &n);
157
1.57k
  if (n != 0) {
158
890
    s->window_bits = (17u + n) & 63u;
159
890
    return BROTLI_DECODER_SUCCESS;
160
890
  }
161
680
  BrotliTakeBits(br, 3, &n);
162
680
  if (n == 1) {
163
1
    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
1
    } else {
171
1
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
172
1
    }
173
1
  }
174
679
  if (n != 0) {
175
595
    s->window_bits = (8u + n) & 63u;
176
595
    return BROTLI_DECODER_SUCCESS;
177
595
  }
178
84
  s->window_bits = 17;
179
84
  return BROTLI_DECODER_SUCCESS;
180
679
}
181
182
550M
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
550M
  uint32_t buffer[4];
187
550M
  memcpy(buffer, src, 16);
188
550M
  memcpy(dst, buffer, 16);
189
550M
#endif
190
550M
}
191
192
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
193
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
194
70.6k
    BrotliDecoderState* s, BrotliBitReader* br, brotli_reg_t* value) {
195
70.6k
  brotli_reg_t bits;
196
70.6k
  switch (s->substate_decode_uint8) {
197
69.1k
    case BROTLI_STATE_DECODE_UINT8_NONE:
198
69.1k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
199
3.66k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
200
3.66k
      }
201
65.4k
      if (bits == 0) {
202
59.3k
        *value = 0;
203
59.3k
        return BROTLI_DECODER_SUCCESS;
204
59.3k
      }
205
    /* Fall through. */
206
207
6.97k
    case BROTLI_STATE_DECODE_UINT8_SHORT:
208
6.97k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
209
882
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
210
882
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
211
882
      }
212
6.09k
      if (bits == 0) {
213
3.77k
        *value = 1;
214
3.77k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
215
3.77k
        return BROTLI_DECODER_SUCCESS;
216
3.77k
      }
217
      /* Use output value as a temporary storage. It MUST be persisted. */
218
2.31k
      *value = bits;
219
    /* Fall through. */
220
221
2.98k
    case BROTLI_STATE_DECODE_UINT8_LONG:
222
2.98k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
223
694
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
224
694
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
225
694
      }
226
2.28k
      *value = ((brotli_reg_t)1U << *value) + bits;
227
2.28k
      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
228
2.28k
      return BROTLI_DECODER_SUCCESS;
229
230
0
    default:
231
0
      return
232
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
233
70.6k
  }
234
70.6k
}
235
236
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
237
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
238
39.4k
    BrotliDecoderState* s, BrotliBitReader* br) {
239
39.4k
  brotli_reg_t bits;
240
39.4k
  int i;
241
63.4k
  for (;;) {
242
63.4k
    switch (s->substate_metablock_header) {
243
23.4k
      case BROTLI_STATE_METABLOCK_HEADER_NONE:
244
23.4k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
245
2.49k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
246
2.49k
        }
247
20.9k
        s->is_last_metablock = bits ? 1 : 0;
248
20.9k
        s->meta_block_remaining_len = 0;
249
20.9k
        s->is_uncompressed = 0;
250
20.9k
        s->is_metadata = 0;
251
20.9k
        if (!s->is_last_metablock) {
252
19.5k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
253
19.5k
          break;
254
19.5k
        }
255
1.36k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
256
      /* Fall through. */
257
258
1.38k
      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
259
1.38k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
260
27
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
261
27
        }
262
1.36k
        if (bits) {
263
71
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
264
71
          return BROTLI_DECODER_SUCCESS;
265
71
        }
266
1.28k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
267
      /* Fall through. */
268
269
22.0k
      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
270
22.0k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
271
1.18k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
272
1.18k
        }
273
20.8k
        s->size_nibbles = (uint8_t)(bits + 4);
274
20.8k
        s->loop_counter = 0;
275
20.8k
        if (bits == 3) {
276
4.41k
          s->is_metadata = 1;
277
4.41k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
278
4.41k
          break;
279
4.41k
        }
280
16.4k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
281
      /* Fall through. */
282
283
29.2k
      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
284
29.2k
        i = s->loop_counter;
285
97.1k
        for (; i < (int)s->size_nibbles; ++i) {
286
80.8k
          if (!BrotliSafeReadBits(br, 4, &bits)) {
287
12.9k
            s->loop_counter = i;
288
12.9k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
289
12.9k
          }
290
67.8k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
291
1.92k
              bits == 0) {
292
3
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
293
3
          }
294
67.8k
          s->meta_block_remaining_len |= (int)(bits << (i * 4));
295
67.8k
        }
296
16.2k
        s->substate_metablock_header =
297
16.2k
            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
298
      /* Fall through. */
299
300
17.0k
      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
301
17.0k
        if (!s->is_last_metablock) {
302
15.9k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
303
754
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
304
754
          }
305
15.1k
          s->is_uncompressed = bits ? 1 : 0;
306
15.1k
        }
307
16.2k
        ++s->meta_block_remaining_len;
308
16.2k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
309
16.2k
        return BROTLI_DECODER_SUCCESS;
310
311
4.92k
      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
312
4.92k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
313
508
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
314
508
        }
315
4.41k
        if (bits != 0) {
316
26
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
317
26
        }
318
4.38k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
319
      /* Fall through. */
320
321
4.60k
      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
322
4.60k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
323
224
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
324
224
        }
325
4.37k
        if (bits == 0) {
326
2.75k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
327
2.75k
          return BROTLI_DECODER_SUCCESS;
328
2.75k
        }
329
1.62k
        s->size_nibbles = (uint8_t)bits;
330
1.62k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
331
      /* Fall through. */
332
333
2.19k
      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
334
2.19k
        i = s->loop_counter;
335
4.23k
        for (; i < (int)s->size_nibbles; ++i) {
336
2.63k
          if (!BrotliSafeReadBits(br, 8, &bits)) {
337
593
            s->loop_counter = i;
338
593
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
339
593
          }
340
2.04k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
341
360
              bits == 0) {
342
4
            return BROTLI_FAILURE(
343
4
                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
344
4
          }
345
2.03k
          s->meta_block_remaining_len |= (int)(bits << (i * 8));
346
2.03k
        }
347
1.59k
        ++s->meta_block_remaining_len;
348
1.59k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
349
1.59k
        return BROTLI_DECODER_SUCCESS;
350
351
0
      default:
352
0
        return
353
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
354
63.4k
    }
355
63.4k
  }
356
39.4k
}
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
1.48G
                                               BrotliBitReader* br) {
365
1.48G
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
366
1.48G
  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
367
1.48G
  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
368
11.2k
    brotli_reg_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
369
11.2k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
370
11.2k
    BROTLI_HC_ADJUST_TABLE_INDEX(table,
371
11.2k
        BROTLI_HC_FAST_LOAD_VALUE(table) +
372
11.2k
        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
373
11.2k
  }
374
1.48G
  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
375
1.48G
  return BROTLI_HC_FAST_LOAD_VALUE(table);
376
1.48G
}
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
337M
                                             BrotliBitReader* br) {
382
337M
  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
383
337M
}
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
1.19G
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
389
1.19G
  brotli_reg_t val;
390
1.19G
  brotli_reg_t available_bits = BrotliGetAvailableBits(br);
391
1.19G
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
392
1.19G
  if (available_bits == 0) {
393
99.1M
    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
394
98.3M
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
395
98.3M
      return BROTLI_TRUE;
396
98.3M
    }
397
850k
    return BROTLI_FALSE;  /* No valid bits at all. */
398
99.1M
  }
399
1.09G
  val = BrotliGetBitsUnmasked(br);
400
1.09G
  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
401
1.09G
  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
402
1.09G
    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
403
1.09G
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
404
1.09G
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
405
1.09G
      return BROTLI_TRUE;
406
1.09G
    } else {
407
172k
      return BROTLI_FALSE;  /* Not enough bits for the first level. */
408
172k
    }
409
1.09G
  }
410
7.73k
  if (available_bits <= HUFFMAN_TABLE_BITS) {
411
5.02k
    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
412
5.02k
  }
413
414
  /* Speculatively drop HUFFMAN_TABLE_BITS. */
415
2.71k
  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
416
2.71k
  available_bits -= HUFFMAN_TABLE_BITS;
417
2.71k
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
418
2.71k
  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
419
645
    return BROTLI_FALSE;  /* Not enough bits for the second level. */
420
645
  }
421
422
2.07k
  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
423
2.07k
  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
424
2.07k
  return BROTLI_TRUE;
425
2.71k
}
426
427
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
428
2.34G
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
429
2.34G
  brotli_reg_t val;
430
2.34G
  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
431
1.14G
    *result = DecodeSymbol(val, table, br);
432
1.14G
    return BROTLI_TRUE;
433
1.14G
  }
434
1.19G
  return SafeDecodeSymbol(table, br, result);
435
2.34G
}
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
841M
                                        brotli_reg_t* value) {
443
841M
  if (safe) {
444
248M
    return;
445
248M
  }
446
592M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
447
592M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
448
592M
  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
449
592M
  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
450
592M
}
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
510M
                                                  brotli_reg_t* value) {
458
510M
  brotli_reg_t result = *value;
459
510M
  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
460
3.82k
    brotli_reg_t val = BrotliGet16BitsUnmasked(br);
461
3.82k
    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
462
3.82k
    brotli_reg_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
463
3.82k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
464
3.82k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
465
3.82k
    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
466
3.82k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
467
3.82k
    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
468
510M
  } else {
469
510M
    BrotliDropBits(br, *bits);
470
510M
  }
471
510M
  PreloadSymbol(0, table, br, bits, value);
472
510M
  return result;
473
510M
}
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
164M
                                                        const int limit) {
485
164M
  const int kMaximalOverread = 4;
486
164M
  int pos_limit = limit;
487
164M
  int copies = 0;
488
  /* Calculate range where CheckInputAmount is always true.
489
     Start with the number of bytes we can read. */
490
164M
  int64_t new_lim = br->guard_in - br->next_in;
491
  /* Convert to bits, since symbols use variable number of bits. */
492
164M
  new_lim *= 8;
493
  /* At most 15 bits per symbol, so this is safe. */
494
164M
  new_lim /= 15;
495
164M
  if ((new_lim - kMaximalOverread) <= limit) {
496
    // Safe cast, since new_lim is already < num_steps
497
62.8M
    pos_limit = (int)(new_lim - kMaximalOverread);
498
62.8M
  }
499
164M
  if (pos_limit < 0) {
500
35.5M
    pos_limit = 0;
501
35.5M
  }
502
164M
  copies = pos_limit;
503
164M
  pos_limit += pos;
504
  /* Fast path, caller made sure it is safe to write,
505
     we verified that is is safe to read. */
506
353M
  for (; pos < pos_limit; pos++) {
507
189M
    BROTLI_DCHECK(BrotliCheckInputAmount(br));
508
189M
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
509
189M
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
510
189M
  }
511
  /* Do the remainder, caller made sure it is safe to write,
512
     we need to bverify that it is safe to read. */
513
485M
  while (BrotliCheckInputAmount(br) && copies < limit) {
514
321M
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
515
321M
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
516
321M
    pos++;
517
321M
    copies++;
518
321M
  }
519
164M
  return copies;
520
164M
}
521
522
75.1k
static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) {
523
75.1k
  brotli_reg_t result = 0;
524
656k
  while (x) {
525
581k
    x >>= 1;
526
581k
    ++result;
527
581k
  }
528
75.1k
  return result;
529
75.1k
}
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
75.1k
    BrotliDecoderState* s) {
537
  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
538
75.1k
  BrotliBitReader* br = &s->br;
539
75.1k
  BrotliMetablockHeaderArena* h = &s->arena.header;
540
75.1k
  brotli_reg_t max_bits = Log2Floor(alphabet_size_max - 1);
541
75.1k
  brotli_reg_t i = h->sub_loop_counter;
542
75.1k
  brotli_reg_t num_symbols = h->symbol;
543
143k
  while (i <= num_symbols) {
544
94.5k
    brotli_reg_t v;
545
94.5k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
546
26.0k
      h->sub_loop_counter = i;
547
26.0k
      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
548
26.0k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
549
26.0k
    }
550
68.5k
    if (v >= alphabet_size_limit) {
551
19
      return
552
19
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
553
19
    }
554
68.5k
    h->symbols_lists_array[i] = (uint16_t)v;
555
68.5k
    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
556
68.5k
    ++i;
557
68.5k
  }
558
559
68.4k
  for (i = 0; i < num_symbols; ++i) {
560
19.3k
    brotli_reg_t k = i + 1;
561
50.4k
    for (; k <= num_symbols; ++k) {
562
31.0k
      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
31.0k
    }
566
19.3k
  }
567
568
49.0k
  return BROTLI_DECODER_SUCCESS;
569
49.0k
}
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
360k
    uint16_t* code_length_histo, int* next_symbol) {
581
360k
  *repeat = 0;
582
360k
  if (code_len != 0) {  /* code_len == 1..15 */
583
356k
    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
584
356k
    next_symbol[code_len] = (int)(*symbol);
585
356k
    *prev_code_len = code_len;
586
356k
    *space -= 32768U >> code_len;
587
356k
    code_length_histo[code_len]++;
588
356k
    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
589
356k
        (int)*symbol, (int)code_len));
590
356k
  }
591
360k
  (*symbol)++;
592
360k
}
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
5.37k
    uint16_t* code_length_histo, int* next_symbol) {
609
5.37k
  brotli_reg_t old_repeat;
610
5.37k
  brotli_reg_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
611
5.37k
  brotli_reg_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
612
5.37k
  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
613
3.70k
    new_len = *prev_code_len;
614
3.70k
    extra_bits = 2;
615
3.70k
  }
616
5.37k
  if (*repeat_code_len != new_len) {
617
1.47k
    *repeat = 0;
618
1.47k
    *repeat_code_len = new_len;
619
1.47k
  }
620
5.37k
  old_repeat = *repeat;
621
5.37k
  if (*repeat > 0) {
622
1.37k
    *repeat -= 2;
623
1.37k
    *repeat <<= extra_bits;
624
1.37k
  }
625
5.37k
  *repeat += repeat_delta + 3U;
626
5.37k
  repeat_delta = *repeat - old_repeat;
627
5.37k
  if (*symbol + repeat_delta > alphabet_size) {
628
107
    BROTLI_DUMP();
629
107
    *symbol = alphabet_size;
630
107
    *space = 0xFFFFF;
631
107
    return;
632
107
  }
633
5.27k
  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
634
5.27k
      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
635
5.27k
  if (*repeat_code_len != 0) {
636
3.66k
    brotli_reg_t last = *symbol + repeat_delta;
637
3.66k
    int next = next_symbol[*repeat_code_len];
638
45.6k
    do {
639
45.6k
      symbol_lists[next] = (uint16_t)*symbol;
640
45.6k
      next = (int)*symbol;
641
45.6k
    } while (++(*symbol) != last);
642
3.66k
    next_symbol[*repeat_code_len] = next;
643
3.66k
    *space -= repeat_delta << (15 - *repeat_code_len);
644
3.66k
    code_length_histo[*repeat_code_len] =
645
3.66k
        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
646
3.66k
  } else {
647
1.60k
    *symbol += repeat_delta;
648
1.60k
  }
649
5.27k
}
650
651
/* Reads and decodes symbol codelengths. */
652
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
653
18.7k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
654
18.7k
  BrotliBitReader* br = &s->br;
655
18.7k
  BrotliMetablockHeaderArena* h = &s->arena.header;
656
18.7k
  brotli_reg_t symbol = h->symbol;
657
18.7k
  brotli_reg_t repeat = h->repeat;
658
18.7k
  brotli_reg_t space = h->space;
659
18.7k
  brotli_reg_t prev_code_len = h->prev_code_len;
660
18.7k
  brotli_reg_t repeat_code_len = h->repeat_code_len;
661
18.7k
  uint16_t* symbol_lists = h->symbol_lists;
662
18.7k
  uint16_t* code_length_histo = h->code_length_histo;
663
18.7k
  int* next_symbol = h->next_symbol;
664
18.7k
  if (!BrotliWarmupBitReader(br)) {
665
793
    return BROTLI_DECODER_NEEDS_MORE_INPUT;
666
793
  }
667
236k
  while (symbol < alphabet_size && space > 0) {
668
231k
    const HuffmanCode* p = h->table;
669
231k
    brotli_reg_t code_len;
670
231k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
671
231k
    if (!BrotliCheckInputAmount(br)) {
672
13.0k
      h->symbol = symbol;
673
13.0k
      h->repeat = repeat;
674
13.0k
      h->prev_code_len = prev_code_len;
675
13.0k
      h->repeat_code_len = repeat_code_len;
676
13.0k
      h->space = space;
677
13.0k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
678
13.0k
    }
679
218k
    BrotliFillBitWindow16(br);
680
218k
    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
681
218k
        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
682
218k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
683
218k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
684
218k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
685
216k
      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
686
216k
          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
687
216k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
688
2.00k
      brotli_reg_t extra_bits =
689
2.00k
          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
690
2.00k
      brotli_reg_t repeat_delta =
691
2.00k
          BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
692
2.00k
      BrotliDropBits(br, extra_bits);
693
2.00k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
694
2.00k
          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
695
2.00k
          symbol_lists, code_length_histo, next_symbol);
696
2.00k
    }
697
218k
  }
698
4.91k
  h->space = space;
699
4.91k
  return BROTLI_DECODER_SUCCESS;
700
17.9k
}
701
702
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
703
13.8k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
704
13.8k
  BrotliBitReader* br = &s->br;
705
13.8k
  BrotliMetablockHeaderArena* h = &s->arena.header;
706
13.8k
  BROTLI_BOOL get_byte = BROTLI_FALSE;
707
178k
  while (h->symbol < alphabet_size && h->space > 0) {
708
172k
    const HuffmanCode* p = h->table;
709
172k
    brotli_reg_t code_len;
710
172k
    brotli_reg_t available_bits;
711
172k
    brotli_reg_t bits = 0;
712
172k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
713
172k
    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
714
164k
    get_byte = BROTLI_FALSE;
715
164k
    available_bits = BrotliGetAvailableBits(br);
716
164k
    if (available_bits != 0) {
717
128k
      bits = (uint32_t)BrotliGetBitsUnmasked(br);
718
128k
    }
719
164k
    BROTLI_HC_ADJUST_TABLE_INDEX(p,
720
164k
        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
721
164k
    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
722
14.9k
      get_byte = BROTLI_TRUE;
723
14.9k
      continue;
724
14.9k
    }
725
149k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
726
149k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
727
144k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
728
144k
      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
729
144k
          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
730
144k
          h->next_symbol);
731
144k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
732
4.86k
      brotli_reg_t extra_bits = code_len - 14U;
733
4.86k
      brotli_reg_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
734
4.86k
          BitMask(extra_bits);
735
4.86k
      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
736
1.48k
        get_byte = BROTLI_TRUE;
737
1.48k
        continue;
738
1.48k
      }
739
3.37k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
740
3.37k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
741
3.37k
          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
742
3.37k
          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
743
3.37k
          h->next_symbol);
744
3.37k
    }
745
149k
  }
746
5.54k
  return BROTLI_DECODER_SUCCESS;
747
13.8k
}
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
17.5k
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
752
17.5k
  BrotliBitReader* br = &s->br;
753
17.5k
  BrotliMetablockHeaderArena* h = &s->arena.header;
754
17.5k
  brotli_reg_t num_codes = h->repeat;
755
17.5k
  brotli_reg_t space = h->space;
756
17.5k
  brotli_reg_t i = h->sub_loop_counter;
757
88.2k
  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
758
87.2k
    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
759
87.2k
    brotli_reg_t ix;
760
87.2k
    brotli_reg_t v;
761
87.2k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
762
11.7k
      brotli_reg_t available_bits = BrotliGetAvailableBits(br);
763
11.7k
      if (available_bits != 0) {
764
7.09k
        ix = BrotliGetBitsUnmasked(br) & 0xF;
765
7.09k
      } else {
766
4.60k
        ix = 0;
767
4.60k
      }
768
11.7k
      if (kCodeLengthPrefixLength[ix] > available_bits) {
769
6.70k
        h->sub_loop_counter = i;
770
6.70k
        h->repeat = num_codes;
771
6.70k
        h->space = space;
772
6.70k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
773
6.70k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
774
6.70k
      }
775
11.7k
    }
776
80.5k
    v = kCodeLengthPrefixValue[ix];
777
80.5k
    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
778
80.5k
    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
779
80.5k
    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
780
80.5k
    if (v != 0) {
781
43.3k
      space = space - (32U >> v);
782
43.3k
      ++num_codes;
783
43.3k
      ++h->code_length_histo[v];
784
43.3k
      if (space - 1U >= 32U) {
785
        /* space is 0 or wrapped around. */
786
9.82k
        break;
787
9.82k
      }
788
43.3k
    }
789
80.5k
  }
790
10.8k
  if (!(num_codes == 1 || space == 0)) {
791
121
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
792
121
  }
793
10.6k
  return BROTLI_DECODER_SUCCESS;
794
10.8k
}
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
111k
                                              BrotliDecoderState* s) {
812
111k
  BrotliBitReader* br = &s->br;
813
111k
  BrotliMetablockHeaderArena* h = &s->arena.header;
814
  /* State machine. */
815
122k
  for (;;) {
816
122k
    switch (h->substate_huffman) {
817
64.8k
      case BROTLI_STATE_HUFFMAN_NONE:
818
64.8k
        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
819
4.46k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
820
4.46k
        }
821
60.4k
        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
60.4k
        if (h->sub_loop_counter != 1) {
826
11.1k
          h->space = 32;
827
11.1k
          h->repeat = 0;  /* num_codes */
828
11.1k
          memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) *
829
11.1k
              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
830
11.1k
          memset(&h->code_length_code_lengths[0], 0,
831
11.1k
              sizeof(h->code_length_code_lengths));
832
11.1k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
833
11.1k
          continue;
834
11.1k
        }
835
      /* Fall through. */
836
837
55.0k
      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
838
        /* Read symbols, codes & code lengths directly. */
839
55.0k
        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
840
5.85k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
841
5.85k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
842
5.85k
        }
843
49.2k
        h->sub_loop_counter = 0;
844
      /* Fall through. */
845
846
75.1k
      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
847
75.1k
        BrotliDecoderErrorCode result =
848
75.1k
            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
849
75.1k
        if (result != BROTLI_DECODER_SUCCESS) {
850
26.0k
          return result;
851
26.0k
        }
852
75.1k
      }
853
      /* Fall through. */
854
855
49.8k
      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
856
49.8k
        brotli_reg_t table_size;
857
49.8k
        if (h->symbol == 3) {
858
4.02k
          brotli_reg_t bits;
859
4.02k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
860
727
            h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
861
727
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
862
727
          }
863
3.29k
          h->symbol += bits;
864
3.29k
        }
865
49.0k
        BROTLI_LOG_UINT(h->symbol);
866
49.0k
        table_size = BrotliBuildSimpleHuffmanTable(table, HUFFMAN_TABLE_BITS,
867
49.0k
                                                   h->symbols_lists_array,
868
49.0k
                                                   (uint32_t)h->symbol);
869
49.0k
        if (opt_table_size) {
870
41.1k
          *opt_table_size = table_size;
871
41.1k
        }
872
49.0k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
873
49.0k
        return BROTLI_DECODER_SUCCESS;
874
49.8k
      }
875
876
      /* Decode Huffman-coded code lengths. */
877
17.5k
      case BROTLI_STATE_HUFFMAN_COMPLEX: {
878
17.5k
        brotli_reg_t i;
879
17.5k
        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
880
17.5k
        if (result != BROTLI_DECODER_SUCCESS) {
881
6.82k
          return result;
882
6.82k
        }
883
10.6k
        BrotliBuildCodeLengthsHuffmanTable(h->table,
884
10.6k
                                           h->code_length_code_lengths,
885
10.6k
                                           h->code_length_histo);
886
10.6k
        memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo));
887
181k
        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
888
171k
          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
889
171k
          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
890
171k
        }
891
892
10.6k
        h->symbol = 0;
893
10.6k
        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
894
10.6k
        h->repeat = 0;
895
10.6k
        h->repeat_code_len = 0;
896
10.6k
        h->space = 32768;
897
10.6k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
898
10.6k
      }
899
      /* Fall through. */
900
901
18.7k
      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
902
18.7k
        brotli_reg_t table_size;
903
18.7k
        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
904
18.7k
            alphabet_size_limit, s);
905
18.7k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
906
13.8k
          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
907
13.8k
        }
908
18.7k
        if (result != BROTLI_DECODER_SUCCESS) {
909
8.26k
          return result;
910
8.26k
        }
911
912
10.4k
        if (h->space != 0) {
913
219
          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
914
219
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
915
219
        }
916
10.2k
        table_size = BrotliBuildHuffmanTable(
917
10.2k
            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
918
10.2k
        if (opt_table_size) {
919
8.88k
          *opt_table_size = table_size;
920
8.88k
        }
921
10.2k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
922
10.2k
        return BROTLI_DECODER_SUCCESS;
923
10.4k
      }
924
925
0
      default:
926
0
        return
927
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
928
122k
    }
929
122k
  }
930
111k
}
931
932
/* Decodes a block length by reading 3..39 bits. */
933
static BROTLI_INLINE brotli_reg_t ReadBlockLength(const HuffmanCode* table,
934
274k
                                                  BrotliBitReader* br) {
935
274k
  brotli_reg_t code;
936
274k
  brotli_reg_t nbits;
937
274k
  code = ReadSymbol(table, br);
938
274k
  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
939
274k
  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
940
274k
}
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
150k
    BrotliBitReader* br) {
947
150k
  brotli_reg_t index;
948
150k
  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
949
148k
    if (!SafeReadSymbol(table, br, &index)) {
950
7.87k
      return BROTLI_FALSE;
951
7.87k
    }
952
148k
  } else {
953
1.94k
    index = s->block_length_index;
954
1.94k
  }
955
142k
  {
956
142k
    brotli_reg_t bits;
957
142k
    brotli_reg_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
958
142k
    brotli_reg_t offset = _kBrotliPrefixCodeRanges[index].offset;
959
142k
    if (!BrotliSafeReadBits(br, nbits, &bits)) {
960
28.5k
      s->block_length_index = index;
961
28.5k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
962
28.5k
      return BROTLI_FALSE;
963
28.5k
    }
964
114k
    *result = offset + bits;
965
114k
    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
966
114k
    return BROTLI_TRUE;
967
142k
  }
968
142k
}
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
773
    uint8_t* v, brotli_reg_t v_len, BrotliDecoderState* state) {
986
  /* Reinitialize elements that could have been changed. */
987
773
  brotli_reg_t i = 1;
988
773
  brotli_reg_t upper_bound = state->mtf_upper_bound;
989
773
  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
990
773
  uint8_t* mtf_u8 = (uint8_t*)mtf;
991
  /* Load endian-aware constant. */
992
773
  const uint8_t b0123[4] = {0, 1, 2, 3};
993
773
  uint32_t pattern;
994
773
  memcpy(&pattern, &b0123, 4);
995
996
  /* Initialize list using 4 consequent values pattern. */
997
773
  mtf[0] = pattern;
998
20.5k
  do {
999
20.5k
    pattern += 0x04040404;  /* Advance all 4 values by 4. */
1000
20.5k
    mtf[i] = pattern;
1001
20.5k
    i++;
1002
20.5k
  } while (i <= upper_bound);
1003
1004
  /* Transform the input. */
1005
773
  upper_bound = 0;
1006
122k
  for (i = 0; i < v_len; ++i) {
1007
121k
    int index = v[i];
1008
121k
    uint8_t value = mtf_u8[index];
1009
121k
    upper_bound |= v[i];
1010
121k
    v[i] = value;
1011
121k
    mtf_u8[-1] = value;
1012
1.02M
    do {
1013
1.02M
      index--;
1014
1.02M
      mtf_u8[index + 1] = mtf_u8[index];
1015
1.02M
    } while (index >= 0);
1016
121k
  }
1017
  /* Remember amount of elements to be reinitialized. */
1018
773
  state->mtf_upper_bound = upper_bound >> 2;
1019
773
}
1020
1021
/* Decodes a series of Huffman table using ReadHuffmanCode function. */
1022
static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
1023
78.9k
    HuffmanTreeGroup* group, BrotliDecoderState* s) {
1024
78.9k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1025
78.9k
  if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
1026
37.0k
    h->next = group->codes;
1027
37.0k
    h->htree_index = 0;
1028
37.0k
    h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
1029
37.0k
  }
1030
128k
  while (h->htree_index < group->num_htrees) {
1031
92.4k
    brotli_reg_t table_size;
1032
92.4k
    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
1033
92.4k
        group->alphabet_size_limit, h->next, &table_size, s);
1034
92.4k
    if (result != BROTLI_DECODER_SUCCESS) return result;
1035
49.9k
    group->htrees[h->htree_index] = h->next;
1036
49.9k
    h->next += table_size;
1037
49.9k
    ++h->htree_index;
1038
49.9k
  }
1039
36.4k
  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
1040
36.4k
  return BROTLI_DECODER_SUCCESS;
1041
78.9k
}
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
32.7k
                                               BrotliDecoderState* s) {
1055
32.7k
  BrotliBitReader* br = &s->br;
1056
32.7k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1057
32.7k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1058
1059
32.7k
  switch ((int)h->substate_context_map) {
1060
29.0k
    case BROTLI_STATE_CONTEXT_MAP_NONE:
1061
29.0k
      result = DecodeVarLenUint8(s, br, num_htrees);
1062
29.0k
      if (result != BROTLI_DECODER_SUCCESS) {
1063
3.48k
        return result;
1064
3.48k
      }
1065
25.5k
      (*num_htrees)++;
1066
25.5k
      h->context_index = 0;
1067
25.5k
      BROTLI_LOG_UINT(context_map_size);
1068
25.5k
      BROTLI_LOG_UINT(*num_htrees);
1069
25.5k
      *context_map_arg =
1070
25.5k
          (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
1071
25.5k
      if (*context_map_arg == 0) {
1072
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
1073
0
      }
1074
25.5k
      if (*num_htrees <= 1) {
1075
23.7k
        memset(*context_map_arg, 0, (size_t)context_map_size);
1076
23.7k
        return BROTLI_DECODER_SUCCESS;
1077
23.7k
      }
1078
1.80k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
1079
    /* Fall through. */
1080
1081
2.43k
    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
1082
2.43k
      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
2.43k
      if (!BrotliSafeGetBits(br, 5, &bits)) {
1086
654
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1087
654
      }
1088
1.77k
      if ((bits & 1) != 0) { /* Use RLE for zeros. */
1089
360
        h->max_run_length_prefix = (bits >> 1) + 1;
1090
360
        BrotliDropBits(br, 5);
1091
1.41k
      } else {
1092
1.41k
        h->max_run_length_prefix = 0;
1093
1.41k
        BrotliDropBits(br, 1);
1094
1.41k
      }
1095
1.77k
      BROTLI_LOG_UINT(h->max_run_length_prefix);
1096
1.77k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
1097
1.77k
    }
1098
    /* Fall through. */
1099
1100
3.16k
    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
1101
3.16k
      brotli_reg_t alphabet_size = *num_htrees + h->max_run_length_prefix;
1102
3.16k
      result = ReadHuffmanCode(alphabet_size, alphabet_size,
1103
3.16k
                               h->context_map_table, NULL, s);
1104
3.16k
      if (result != BROTLI_DECODER_SUCCESS) return result;
1105
1.68k
      h->code = 0xFFFF;
1106
1.68k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
1107
1.68k
    }
1108
    /* Fall through. */
1109
1110
3.05k
    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
1111
3.05k
      brotli_reg_t context_index = h->context_index;
1112
3.05k
      brotli_reg_t max_run_length_prefix = h->max_run_length_prefix;
1113
3.05k
      uint8_t* context_map = *context_map_arg;
1114
3.05k
      brotli_reg_t code = h->code;
1115
3.05k
      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
1116
179k
      while (context_index < context_map_size || skip_preamble) {
1117
178k
        if (!skip_preamble) {
1118
177k
          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
1119
968
            h->code = 0xFFFF;
1120
968
            h->context_index = context_index;
1121
968
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1122
968
          }
1123
176k
          BROTLI_LOG_UINT(code);
1124
1125
176k
          if (code == 0) {
1126
15.3k
            context_map[context_index++] = 0;
1127
15.3k
            continue;
1128
15.3k
          }
1129
161k
          if (code > max_run_length_prefix) {
1130
158k
            context_map[context_index++] =
1131
158k
                (uint8_t)(code - max_run_length_prefix);
1132
158k
            continue;
1133
158k
          }
1134
161k
        } else {
1135
456
          skip_preamble = BROTLI_FALSE;
1136
456
        }
1137
        /* RLE sub-stage. */
1138
2.73k
        {
1139
2.73k
          brotli_reg_t reps;
1140
2.73k
          if (!BrotliSafeReadBits(br, code, &reps)) {
1141
487
            h->code = code;
1142
487
            h->context_index = context_index;
1143
487
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1144
487
          }
1145
2.24k
          reps += (brotli_reg_t)1U << code;
1146
2.24k
          BROTLI_LOG_UINT(reps);
1147
2.24k
          if (context_index + reps > context_map_size) {
1148
30
            return
1149
30
                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
1150
30
          }
1151
24.2k
          do {
1152
24.2k
            context_map[context_index++] = 0;
1153
24.2k
          } while (--reps);
1154
2.21k
        }
1155
2.21k
      }
1156
3.05k
    }
1157
    /* Fall through. */
1158
1159
1.93k
    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1160
1.93k
      brotli_reg_t bits;
1161
1.93k
      if (!BrotliSafeReadBits(br, 1, &bits)) {
1162
379
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
1163
379
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1164
379
      }
1165
1.55k
      if (bits != 0) {
1166
773
        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
1167
773
      }
1168
1.55k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
1169
1.55k
      return BROTLI_DECODER_SUCCESS;
1170
1.93k
    }
1171
1172
0
    default:
1173
0
      return
1174
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1175
32.7k
  }
1176
32.7k
}
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
462k
    int safe, BrotliDecoderState* s, int tree_type) {
1182
462k
  brotli_reg_t max_block_type = s->num_block_types[tree_type];
1183
462k
  const HuffmanCode* type_tree = &s->block_type_trees[
1184
462k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
1185
462k
  const HuffmanCode* len_tree = &s->block_len_trees[
1186
462k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1187
462k
  BrotliBitReader* br = &s->br;
1188
462k
  brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1189
462k
  brotli_reg_t block_type;
1190
462k
  if (max_block_type <= 1) {
1191
9
    return BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH;
1192
9
  }
1193
1194
  /* Read 0..15 + 3..39 bits. */
1195
462k
  if (!safe) {
1196
274k
    block_type = ReadSymbol(type_tree, br);
1197
274k
    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1198
274k
  } else {
1199
187k
    BrotliBitReaderState memento;
1200
187k
    BrotliBitReaderSaveState(br, &memento);
1201
187k
    if (!SafeReadSymbol(type_tree, br, &block_type)) {
1202
43.4k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1203
43.4k
    }
1204
144k
    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1205
33.4k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1206
33.4k
      BrotliBitReaderRestoreState(br, &memento);
1207
33.4k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1208
33.4k
    }
1209
144k
  }
1210
1211
385k
  if (block_type == 1) {
1212
49.9k
    block_type = ringbuffer[1] + 1;
1213
335k
  } else if (block_type == 0) {
1214
29.0k
    block_type = ringbuffer[0];
1215
306k
  } else {
1216
306k
    block_type -= 2;
1217
306k
  }
1218
385k
  if (block_type >= max_block_type) {
1219
12.6k
    block_type -= max_block_type;
1220
12.6k
  }
1221
385k
  ringbuffer[0] = ringbuffer[1];
1222
385k
  ringbuffer[1] = block_type;
1223
385k
  return BROTLI_DECODER_SUCCESS;
1224
462k
}
1225
1226
static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
1227
12.6k
    BrotliDecoderState* s) {
1228
12.6k
  size_t i;
1229
114k
  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1230
36.2k
  for (i = 0; i < s->num_block_types[0]; i++) {
1231
23.5k
    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1232
23.5k
    size_t error = 0;
1233
23.5k
    size_t sample = s->context_map[offset];
1234
23.5k
    size_t j;
1235
399k
    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1236
      /* NOLINTNEXTLINE(bugprone-macro-repeated-side-effects) */
1237
376k
      BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
1238
376k
    }
1239
23.5k
    if (error == 0) {
1240
21.6k
      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1241
21.6k
    }
1242
23.5k
  }
1243
12.6k
}
1244
1245
102k
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1246
102k
  uint8_t context_mode;
1247
102k
  size_t trivial;
1248
102k
  brotli_reg_t block_type = s->block_type_rb[1];
1249
102k
  brotli_reg_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1250
102k
  s->context_map_slice = s->context_map + context_offset;
1251
102k
  trivial = s->trivial_literal_contexts[block_type >> 5];
1252
102k
  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1253
102k
  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1254
102k
  context_mode = s->context_modes[block_type] & 3;
1255
102k
  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
1256
102k
}
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
155k
    int safe, BrotliDecoderState* s) {
1262
155k
  BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 0);
1263
155k
  if (result != BROTLI_DECODER_SUCCESS) {
1264
64.7k
    return result;
1265
64.7k
  }
1266
90.5k
  PrepareLiteralDecoding(s);
1267
90.5k
  return BROTLI_DECODER_SUCCESS;
1268
155k
}
1269
1270
static BROTLI_NOINLINE BrotliDecoderErrorCode
1271
17.9k
DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1272
17.9k
  return DecodeLiteralBlockSwitchInternal(0, s);
1273
17.9k
}
1274
1275
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeDecodeLiteralBlockSwitch(
1276
137k
    BrotliDecoderState* s) {
1277
137k
  return DecodeLiteralBlockSwitchInternal(1, s);
1278
137k
}
1279
1280
/* Block switch for insert/copy length.
1281
   Reads 3..54 bits. */
1282
static BROTLI_INLINE BrotliDecoderErrorCode DecodeCommandBlockSwitchInternal(
1283
85.2k
    int safe, BrotliDecoderState* s) {
1284
85.2k
  BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 1);
1285
85.2k
  if (result != BROTLI_DECODER_SUCCESS) {
1286
5.08k
    return result;
1287
5.08k
  }
1288
80.1k
  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
1289
80.1k
  return BROTLI_DECODER_SUCCESS;
1290
85.2k
}
1291
1292
static BROTLI_NOINLINE BrotliDecoderErrorCode
1293
64.4k
DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1294
64.4k
  return DecodeCommandBlockSwitchInternal(0, s);
1295
64.4k
}
1296
1297
static BROTLI_NOINLINE BrotliDecoderErrorCode
1298
20.8k
SafeDecodeCommandBlockSwitch(BrotliDecoderState* s) {
1299
20.8k
  return DecodeCommandBlockSwitchInternal(1, s);
1300
20.8k
}
1301
1302
/* Block switch for distance codes.
1303
   Reads 3..54 bits. */
1304
static BROTLI_INLINE BrotliDecoderErrorCode DecodeDistanceBlockSwitchInternal(
1305
221k
    int safe, BrotliDecoderState* s) {
1306
221k
  BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 2);
1307
221k
  if (result != BROTLI_DECODER_SUCCESS) {
1308
7.05k
    return result;
1309
7.05k
  }
1310
214k
  s->dist_context_map_slice = s->dist_context_map +
1311
214k
      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
1312
214k
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1313
214k
  return BROTLI_DECODER_SUCCESS;
1314
221k
}
1315
1316
static BROTLI_NOINLINE BrotliDecoderErrorCode
1317
192k
DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
1318
192k
  return DecodeDistanceBlockSwitchInternal(0, s);
1319
192k
}
1320
1321
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
1322
29.2k
    BrotliDecoderState* s) {
1323
29.2k
  return DecodeDistanceBlockSwitchInternal(1, s);
1324
29.2k
}
1325
1326
5.30M
static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
1327
5.30M
  size_t pos = wrap && s->pos > s->ringbuffer_size ?
1328
5.01M
      (size_t)s->ringbuffer_size : (size_t)(s->pos);
1329
5.30M
  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
1330
5.30M
  return partial_pos_rb - s->partial_pos_out;
1331
5.30M
}
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
5.30M
    size_t* total_out, BROTLI_BOOL force) {
1339
5.30M
  uint8_t* start =
1340
5.30M
      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
1341
5.30M
  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1342
5.30M
  size_t num_written = *available_out;
1343
5.30M
  if (num_written > to_write) {
1344
1.34M
    num_written = to_write;
1345
1.34M
  }
1346
5.30M
  if (s->meta_block_remaining_len < 0) {
1347
216
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
1348
216
  }
1349
5.30M
  if (next_out && !*next_out) {
1350
0
    *next_out = start;
1351
5.30M
  } else {
1352
5.30M
    if (next_out) {
1353
5.30M
      memcpy(*next_out, start, num_written);
1354
5.30M
      *next_out += num_written;
1355
5.30M
    }
1356
5.30M
  }
1357
5.30M
  *available_out -= num_written;
1358
5.30M
  BROTLI_LOG_UINT(to_write);
1359
5.30M
  BROTLI_LOG_UINT(num_written);
1360
5.30M
  s->partial_pos_out += num_written;
1361
5.30M
  if (total_out) {
1362
5.30M
    *total_out = s->partial_pos_out;
1363
5.30M
  }
1364
5.30M
  if (num_written < to_write) {
1365
3.64M
    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
1366
3.64M
      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
1367
3.64M
    } else {
1368
111
      return BROTLI_DECODER_SUCCESS;
1369
111
    }
1370
3.64M
  }
1371
  /* Wrap ring buffer only if it has reached its maximal size. */
1372
1.65M
  if (s->ringbuffer_size == (1 << s->window_bits) &&
1373
1.57M
      s->pos >= s->ringbuffer_size) {
1374
457k
    s->pos -= s->ringbuffer_size;
1375
457k
    s->rb_roundtrips++;
1376
457k
    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1377
457k
  }
1378
1.65M
  return BROTLI_DECODER_SUCCESS;
1379
5.30M
}
1380
1381
456k
static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1382
456k
  if (s->should_wrap_ringbuffer) {
1383
52.1k
    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1384
52.1k
    s->should_wrap_ringbuffer = 0;
1385
52.1k
  }
1386
456k
}
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
37.0k
    BrotliDecoderState* s) {
1397
37.0k
  uint8_t* old_ringbuffer = s->ringbuffer;
1398
37.0k
  if (s->ringbuffer_size == s->new_ringbuffer_size) {
1399
33.3k
    return BROTLI_TRUE;
1400
33.3k
  }
1401
1402
3.72k
  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
1403
3.72k
      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
1404
3.72k
  if (s->ringbuffer == 0) {
1405
    /* Restore previous value. */
1406
0
    s->ringbuffer = old_ringbuffer;
1407
0
    return BROTLI_FALSE;
1408
0
  }
1409
3.72k
  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1410
3.72k
  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
1411
1412
3.72k
  if (!!old_ringbuffer) {
1413
319
    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1414
319
    BROTLI_DECODER_FREE(s, old_ringbuffer);
1415
319
  }
1416
1417
3.72k
  s->ringbuffer_size = s->new_ringbuffer_size;
1418
3.72k
  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1419
3.72k
  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1420
1421
3.72k
  return BROTLI_TRUE;
1422
3.72k
}
1423
1424
static BrotliDecoderErrorCode BROTLI_NOINLINE
1425
55.2k
SkipMetadataBlock(BrotliDecoderState* s) {
1426
55.2k
  BrotliBitReader* br = &s->br;
1427
55.2k
  int nbytes;
1428
1429
55.2k
  if (s->meta_block_remaining_len == 0) {
1430
2.74k
    return BROTLI_DECODER_SUCCESS;
1431
2.74k
  }
1432
1433
52.5k
  BROTLI_DCHECK((BrotliGetAvailableBits(br) & 7) == 0);
1434
1435
  /* Drain accumulator. */
1436
52.5k
  if (BrotliGetAvailableBits(br) >= 8) {
1437
610
    uint8_t buffer[8];
1438
610
    nbytes = (int)(BrotliGetAvailableBits(br)) >> 3;
1439
610
    BROTLI_DCHECK(nbytes <= 8);
1440
610
    if (nbytes > s->meta_block_remaining_len) {
1441
338
      nbytes = s->meta_block_remaining_len;
1442
338
    }
1443
610
    BrotliCopyBytes(buffer, br, (size_t)nbytes);
1444
610
    if (s->metadata_chunk_func) {
1445
0
      s->metadata_chunk_func(s->metadata_callback_opaque, buffer,
1446
0
                             (size_t)nbytes);
1447
0
    }
1448
610
    s->meta_block_remaining_len -= nbytes;
1449
610
    if (s->meta_block_remaining_len == 0) {
1450
363
      return BROTLI_DECODER_SUCCESS;
1451
363
    }
1452
610
  }
1453
1454
  /* Direct access to metadata is possible. */
1455
52.1k
  nbytes = (int)BrotliGetRemainingBytes(br);
1456
52.1k
  if (nbytes > s->meta_block_remaining_len) {
1457
625
    nbytes = s->meta_block_remaining_len;
1458
625
  }
1459
52.1k
  if (nbytes > 0) {
1460
51.6k
    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
51.6k
    BrotliDropBytes(br, (size_t)nbytes);
1465
51.6k
    s->meta_block_remaining_len -= nbytes;
1466
51.6k
    if (s->meta_block_remaining_len == 0) {
1467
1.02k
      return BROTLI_DECODER_SUCCESS;
1468
1.02k
    }
1469
51.6k
  }
1470
1471
51.1k
  BROTLI_DCHECK(BrotliGetRemainingBytes(br) == 0);
1472
1473
51.1k
  return BROTLI_DECODER_NEEDS_MORE_INPUT;
1474
52.1k
}
1475
1476
static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1477
    size_t* available_out, uint8_t** next_out, size_t* total_out,
1478
25.1k
    BrotliDecoderState* s) {
1479
  /* TODO(eustas): avoid allocation for single uncompressed block. */
1480
25.1k
  if (!BrotliEnsureRingBuffer(s)) {
1481
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
1482
0
  }
1483
1484
  /* State machine */
1485
25.8k
  for (;;) {
1486
25.8k
    switch (s->substate_uncompressed) {
1487
5.50k
      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1488
5.50k
        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1489
5.50k
        if (nbytes > s->meta_block_remaining_len) {
1490
1.98k
          nbytes = s->meta_block_remaining_len;
1491
1.98k
        }
1492
5.50k
        if (s->pos + nbytes > s->ringbuffer_size) {
1493
601
          nbytes = s->ringbuffer_size - s->pos;
1494
601
        }
1495
        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1496
5.50k
        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1497
5.50k
        s->pos += nbytes;
1498
5.50k
        s->meta_block_remaining_len -= nbytes;
1499
5.50k
        if (s->pos < 1 << s->window_bits) {
1500
4.75k
          if (s->meta_block_remaining_len == 0) {
1501
2.46k
            return BROTLI_DECODER_SUCCESS;
1502
2.46k
          }
1503
2.29k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
1504
4.75k
        }
1505
756
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1506
756
      }
1507
      /* Fall through. */
1508
1509
21.1k
      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1510
21.1k
        BrotliDecoderErrorCode result;
1511
21.1k
        result = WriteRingBuffer(
1512
21.1k
            s, available_out, next_out, total_out, BROTLI_FALSE);
1513
21.1k
        if (result != BROTLI_DECODER_SUCCESS) {
1514
20.3k
          return result;
1515
20.3k
        }
1516
756
        if (s->ringbuffer_size == 1 << s->window_bits) {
1517
756
          s->max_distance = s->max_backward_distance;
1518
756
        }
1519
756
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1520
756
        break;
1521
21.1k
      }
1522
25.8k
    }
1523
25.8k
  }
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 -= (int)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
2.95M
static uint32_t GetCompoundDictionarySize(BrotliDecoderState* s) {
1609
2.95M
  return s->compound_dictionary ? s->compound_dictionary->total_size : 0u;
1610
2.95M
}
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 += (int)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
16.2k
    BrotliDecoderState* s) {
1666
16.2k
  int window_size = 1 << s->window_bits;
1667
16.2k
  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
16.2k
  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
1671
16.2k
  int output_size;
1672
1673
  /* If maximum is already reached, no further extension is retired. */
1674
16.2k
  if (s->ringbuffer_size == window_size) {
1675
6.66k
    return;
1676
6.66k
  }
1677
1678
  /* Metadata blocks does not touch ring buffer. */
1679
9.60k
  if (s->is_metadata) {
1680
0
    return;
1681
0
  }
1682
1683
9.60k
  if (!s->ringbuffer) {
1684
4.76k
    output_size = 0;
1685
4.83k
  } else {
1686
4.83k
    output_size = s->pos;
1687
4.83k
  }
1688
9.60k
  output_size += s->meta_block_remaining_len;
1689
9.60k
  min_size = min_size < output_size ? output_size : min_size;
1690
1691
9.60k
  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
46.6k
    while ((new_ringbuffer_size >> 1) >= min_size) {
1696
37.0k
      new_ringbuffer_size >>= 1;
1697
37.0k
    }
1698
9.60k
  }
1699
1700
9.60k
  s->new_ringbuffer_size = new_ringbuffer_size;
1701
9.60k
}
1702
1703
/* Reads 1..256 2-bit context modes. */
1704
14.5k
static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1705
14.5k
  BrotliBitReader* br = &s->br;
1706
14.5k
  int i = s->loop_counter;
1707
1708
39.5k
  while (i < (int)s->num_block_types[0]) {
1709
26.6k
    brotli_reg_t bits;
1710
26.6k
    if (!BrotliSafeReadBits(br, 2, &bits)) {
1711
1.68k
      s->loop_counter = i;
1712
1.68k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1713
1.68k
    }
1714
24.9k
    s->context_modes[i] = (uint8_t)bits;
1715
24.9k
    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1716
24.9k
    i++;
1717
24.9k
  }
1718
12.8k
  return BROTLI_DECODER_SUCCESS;
1719
14.5k
}
1720
1721
196M
static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1722
196M
  int offset = s->distance_code - 3;
1723
196M
  if (s->distance_code <= 3) {
1724
    /* Compensate double distance-ring-buffer roll for dictionary items. */
1725
97.4M
    s->distance_context = 1 >> s->distance_code;
1726
97.4M
    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
1727
97.4M
    s->dist_rb_idx -= s->distance_context;
1728
99.3M
  } else {
1729
99.3M
    int index_delta = 3;
1730
99.3M
    int delta;
1731
99.3M
    int base = s->distance_code - 10;
1732
99.3M
    if (s->distance_code < 10) {
1733
47.3M
      base = s->distance_code - 4;
1734
52.0M
    } else {
1735
52.0M
      index_delta = 2;
1736
52.0M
    }
1737
    /* Unpack one of six 4-bit values. */
1738
99.3M
    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
1739
99.3M
    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
1740
99.3M
    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
27
      s->distance_code = 0x7FFFFFFF;
1744
27
    }
1745
99.3M
  }
1746
196M
}
1747
1748
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1749
900M
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1750
900M
  if (n_bits != 0) {
1751
264k
    return BrotliSafeReadBits(br, n_bits, val);
1752
900M
  } else {
1753
900M
    *val = 0;
1754
900M
    return BROTLI_TRUE;
1755
900M
  }
1756
900M
}
1757
1758
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
1759
156M
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1760
156M
  if (n_bits != 0) {
1761
43.1k
    return BrotliSafeReadBits32(br, n_bits, val);
1762
156M
  } else {
1763
156M
    *val = 0;
1764
156M
    return BROTLI_TRUE;
1765
156M
  }
1766
156M
}
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
11.9k
static void CalculateDistanceLut(BrotliDecoderState* s) {
1836
11.9k
  BrotliMetablockBodyArena* b = &s->arena.body;
1837
11.9k
  brotli_reg_t npostfix = s->distance_postfix_bits;
1838
11.9k
  brotli_reg_t ndirect = s->num_direct_distance_codes;
1839
11.9k
  brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
1840
11.9k
  brotli_reg_t postfix = (brotli_reg_t)1u << npostfix;
1841
11.9k
  brotli_reg_t j;
1842
11.9k
  brotli_reg_t bits = 1;
1843
11.9k
  brotli_reg_t half = 0;
1844
1845
  /* Skip short codes. */
1846
11.9k
  brotli_reg_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
1847
1848
  /* Fill direct codes. */
1849
478k
  for (j = 0; j < ndirect; ++j) {
1850
466k
    b->dist_extra_bits[i] = 0;
1851
466k
    b->dist_offset[i] = j + 1;
1852
466k
    ++i;
1853
466k
  }
1854
1855
  /* Fill regular distance codes. */
1856
585k
  while (i < alphabet_size_limit) {
1857
573k
    brotli_reg_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
1858
    /* Always fill the complete group. */
1859
3.14M
    for (j = 0; j < postfix; ++j) {
1860
2.57M
      b->dist_extra_bits[i] = (uint8_t)bits;
1861
2.57M
      b->dist_offset[i] = base + j;
1862
2.57M
      ++i;
1863
2.57M
    }
1864
573k
    bits = bits + half;
1865
573k
    half = half ^ 1;
1866
573k
  }
1867
11.9k
}
1868
1869
/* Precondition: s->distance_code < 0. */
1870
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
1871
414M
    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1872
414M
  BrotliMetablockBodyArena* b = &s->arena.body;
1873
414M
  brotli_reg_t code;
1874
414M
  brotli_reg_t bits;
1875
414M
  BrotliBitReaderState memento;
1876
414M
  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1877
414M
  if (!safe) {
1878
90.3M
    code = ReadSymbol(distance_tree, br);
1879
324M
  } else {
1880
324M
    BrotliBitReaderSaveState(br, &memento);
1881
324M
    if (!SafeReadSymbol(distance_tree, br, &code)) {
1882
11.6k
      return BROTLI_FALSE;
1883
11.6k
    }
1884
324M
  }
1885
414M
  --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
414M
  s->distance_context = 0;
1889
414M
  if ((code & ~0xFu) == 0) {
1890
196M
    s->distance_code = (int)code;
1891
196M
    TakeDistanceFromRingBuffer(s);
1892
196M
    return BROTLI_TRUE;
1893
196M
  }
1894
217M
  if (!safe) {
1895
61.2M
    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
1896
156M
  } else {
1897
156M
    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
1898
9.85k
      ++s->block_length[2];
1899
9.85k
      BrotliBitReaderRestoreState(br, &memento);
1900
9.85k
      return BROTLI_FALSE;
1901
9.85k
    }
1902
156M
  }
1903
217M
  s->distance_code =
1904
217M
      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
1905
217M
  return BROTLI_TRUE;
1906
217M
}
1907
1908
static BROTLI_INLINE void ReadDistance(
1909
90.3M
    BrotliDecoderState* s, BrotliBitReader* br) {
1910
90.3M
  ReadDistanceInternal(0, s, br);
1911
90.3M
}
1912
1913
static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
1914
324M
    BrotliDecoderState* s, BrotliBitReader* br) {
1915
324M
  return ReadDistanceInternal(1, s, br);
1916
324M
}
1917
1918
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
1919
616M
    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1920
616M
  brotli_reg_t cmd_code;
1921
616M
  brotli_reg_t insert_len_extra = 0;
1922
616M
  brotli_reg_t copy_length;
1923
616M
  CmdLutElement v;
1924
616M
  BrotliBitReaderState memento;
1925
616M
  if (!safe) {
1926
165M
    cmd_code = ReadSymbol(s->htree_command, br);
1927
450M
  } else {
1928
450M
    BrotliBitReaderSaveState(br, &memento);
1929
450M
    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
1930
34.3k
      return BROTLI_FALSE;
1931
34.3k
    }
1932
450M
  }
1933
616M
  v = kCmdLut[cmd_code];
1934
616M
  s->distance_code = v.distance_code;
1935
616M
  s->distance_context = v.context;
1936
616M
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1937
616M
  *insert_length = v.insert_len_offset;
1938
616M
  if (!safe) {
1939
165M
    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1940
140k
      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
1941
140k
    }
1942
165M
    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
1943
450M
  } else {
1944
450M
    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1945
450M
        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1946
47.7k
      BrotliBitReaderRestoreState(br, &memento);
1947
47.7k
      return BROTLI_FALSE;
1948
47.7k
    }
1949
450M
  }
1950
616M
  s->copy_length = (int)copy_length + v.copy_len_offset;
1951
616M
  --s->block_length[1];
1952
616M
  *insert_length += (int)insert_len_extra;
1953
616M
  return BROTLI_TRUE;
1954
616M
}
1955
1956
static BROTLI_INLINE void ReadCommand(
1957
165M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1958
165M
  ReadCommandInternal(0, s, br, insert_length);
1959
165M
}
1960
1961
static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
1962
450M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1963
450M
  return ReadCommandInternal(1, s, br, insert_length);
1964
450M
}
1965
1966
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
1967
1.08G
    int safe, BrotliBitReader* const br) {
1968
1.08G
  if (safe) {
1969
757M
    return BROTLI_TRUE;
1970
757M
  }
1971
330M
  return BrotliCheckInputAmount(br);
1972
1.08G
}
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
1.03G
  {                                               \
1979
1.03G
    if (safe) {                                   \
1980
774M
      if (!Safe##METHOD) {                        \
1981
103k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
1982
103k
        goto saveStateAndReturn;                  \
1983
103k
      }                                           \
1984
774M
    } else {                                      \
1985
256M
      METHOD;                                     \
1986
256M
    }                                             \
1987
1.03G
  }
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
462k
  {                                             \
1993
462k
    BrotliDecoderErrorCode status;              \
1994
462k
    if (safe) {                                 \
1995
187k
      status = Safe##METHOD;                    \
1996
274k
    } else {                                    \
1997
274k
      status = METHOD;                          \
1998
274k
    }                                           \
1999
462k
    if (status != BROTLI_DECODER_SUCCESS) {     \
2000
76.8k
      result = status;                          \
2001
76.8k
      goto saveStateAndReturn;                  \
2002
76.8k
    }                                           \
2003
462k
  }
2004
2005
static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
2006
2.95M
    int safe, BrotliDecoderState* s) {
2007
2.95M
  int pos = s->pos;
2008
2.95M
  int i = s->loop_counter;
2009
2.95M
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2010
2.95M
  BrotliBitReader* br = &s->br;
2011
2.95M
  uint32_t compound_dictionary_size = GetCompoundDictionarySize(s);
2012
2013
2.95M
  if (!CheckInputAmount(safe, br)) {
2014
1.33M
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2015
1.33M
    goto saveStateAndReturn;
2016
1.33M
  }
2017
1.61M
  if (!safe) {
2018
244k
    BROTLI_UNUSED(BrotliWarmupBitReader(br));
2019
244k
  }
2020
2021
  /* Jump into state machine. */
2022
1.61M
  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
2023
178k
    goto CommandBegin;
2024
1.44M
  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
2025
1.07M
    goto CommandInner;
2026
1.07M
  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
2027
54.9k
    goto CommandPostDecodeLiterals;
2028
307k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
2029
307k
    goto CommandPostWrapCopy;
2030
307k
  } else {
2031
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
2032
0
  }
2033
2034
616M
CommandBegin:
2035
616M
  if (safe) {
2036
450M
    s->state = BROTLI_STATE_COMMAND_BEGIN;
2037
450M
  }
2038
616M
  if (!CheckInputAmount(safe, br)) {
2039
19.0k
    s->state = BROTLI_STATE_COMMAND_BEGIN;
2040
19.0k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2041
19.0k
    goto saveStateAndReturn;
2042
19.0k
  }
2043
616M
  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
2044
85.2k
    BROTLI_SAFE_WITH_STATUS(DecodeCommandBlockSwitch(s));
2045
80.1k
    goto CommandBegin;
2046
85.2k
  }
2047
  /* Read the insert/copy length in the command. */
2048
616M
  BROTLI_SAFE(ReadCommand(s, br, &i));
2049
616M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
2050
616M
              pos, i, s->copy_length));
2051
616M
  if (i == 0) {
2052
220M
    goto CommandPostDecodeLiterals;
2053
220M
  }
2054
395M
  s->meta_block_remaining_len -= i;
2055
2056
396M
CommandInner:
2057
396M
  if (safe) {
2058
304M
    s->state = BROTLI_STATE_COMMAND_INNER;
2059
304M
  }
2060
  /* Read the literals in the command. */
2061
396M
  if (s->trivial_literal_context) {
2062
330M
    brotli_reg_t bits;
2063
330M
    brotli_reg_t value;
2064
330M
    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
2065
330M
    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
82.1M
      int num_steps = i - 1;
2073
82.1M
      if (num_steps > 0 && ((brotli_reg_t)(num_steps) > s->block_length[0])) {
2074
        // Safe cast, since block_length < steps
2075
15.4k
        num_steps = (int)s->block_length[0];
2076
15.4k
      }
2077
82.1M
      if (s->ringbuffer_size >= pos &&
2078
82.1M
          (s->ringbuffer_size - pos) <= num_steps) {
2079
20.6k
        num_steps = s->ringbuffer_size - pos - 1;
2080
20.6k
      }
2081
82.1M
      if (num_steps < 0) {
2082
0
        num_steps = 0;
2083
0
      }
2084
82.1M
      num_steps = BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits,
2085
82.1M
                                                 &value, s->ringbuffer, pos,
2086
82.1M
                                                 num_steps);
2087
82.1M
      pos += num_steps;
2088
82.1M
      s->block_length[0] -= (brotli_reg_t)num_steps;
2089
82.1M
      i -= num_steps;
2090
82.1M
      do {
2091
82.1M
        if (!CheckInputAmount(safe, br)) {
2092
15.9k
          s->state = BROTLI_STATE_COMMAND_INNER;
2093
15.9k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2094
15.9k
          goto saveStateAndReturn;
2095
15.9k
        }
2096
82.1M
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2097
17.6k
          goto NextLiteralBlock;
2098
17.6k
        }
2099
82.0M
        BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, &value,
2100
82.0M
                                       s->ringbuffer, pos, 1);
2101
82.0M
        --s->block_length[0];
2102
82.0M
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2103
82.0M
        ++pos;
2104
82.0M
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2105
32.0k
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2106
32.0k
          --i;
2107
32.0k
          goto saveStateAndReturn;
2108
32.0k
        }
2109
82.0M
      } while (--i != 0);
2110
248M
    } else { /* safe */
2111
1.26G
      do {
2112
1.26G
        brotli_reg_t literal;
2113
1.26G
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2114
132k
          goto NextLiteralBlock;
2115
132k
        }
2116
1.26G
        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
2117
930k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2118
930k
          goto saveStateAndReturn;
2119
930k
        }
2120
1.26G
        s->ringbuffer[pos] = (uint8_t)literal;
2121
1.26G
        --s->block_length[0];
2122
1.26G
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2123
1.26G
        ++pos;
2124
1.26G
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2125
40.4k
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2126
40.4k
          --i;
2127
40.4k
          goto saveStateAndReturn;
2128
40.4k
        }
2129
1.26G
      } while (--i != 0);
2130
248M
    }
2131
330M
  } else {
2132
66.0M
    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2133
66.0M
    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2134
387M
    do {
2135
387M
      const HuffmanCode* hc;
2136
387M
      uint8_t context;
2137
387M
      if (!CheckInputAmount(safe, br)) {
2138
7.35k
        s->state = BROTLI_STATE_COMMAND_INNER;
2139
7.35k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2140
7.35k
        goto saveStateAndReturn;
2141
7.35k
      }
2142
387M
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2143
5.06k
        goto NextLiteralBlock;
2144
5.06k
      }
2145
387M
      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
2146
387M
      BROTLI_LOG_UINT(context);
2147
387M
      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
2148
387M
      p2 = p1;
2149
387M
      if (!safe) {
2150
81.2M
        p1 = (uint8_t)ReadSymbol(hc, br);
2151
305M
      } else {
2152
305M
        brotli_reg_t literal;
2153
305M
        if (!SafeReadSymbol(hc, br, &literal)) {
2154
294
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2155
294
          goto saveStateAndReturn;
2156
294
        }
2157
305M
        p1 = (uint8_t)literal;
2158
305M
      }
2159
387M
      s->ringbuffer[pos] = p1;
2160
387M
      --s->block_length[0];
2161
387M
      BROTLI_LOG_UINT(s->context_map_slice[context]);
2162
387M
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
2163
387M
      ++pos;
2164
387M
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2165
16.0k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2166
16.0k
        --i;
2167
16.0k
        goto saveStateAndReturn;
2168
16.0k
      }
2169
387M
    } while (--i != 0);
2170
66.0M
  }
2171
395M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2172
395M
  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
2173
3.86k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2174
3.86k
    goto saveStateAndReturn;
2175
3.86k
  }
2176
2177
616M
CommandPostDecodeLiterals:
2178
616M
  if (safe) {
2179
450M
    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2180
450M
  }
2181
616M
  if (s->distance_code >= 0) {
2182
    /* Implicit distance case. */
2183
201M
    s->distance_context = s->distance_code ? 0 : 1;
2184
201M
    --s->dist_rb_idx;
2185
201M
    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
2186
414M
  } else {
2187
    /* Read distance code in the command, unless it was implicitly zero. */
2188
414M
    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
2189
221k
      BROTLI_SAFE_WITH_STATUS(DecodeDistanceBlockSwitch(s));
2190
214k
    }
2191
414M
    BROTLI_SAFE(ReadDistance(s, br));
2192
414M
  }
2193
616M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
2194
616M
              pos, s->distance_code));
2195
616M
  if (s->max_distance != s->max_backward_distance) {
2196
189M
    s->max_distance =
2197
189M
        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
2198
189M
  }
2199
616M
  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
616M
  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
65.4M
    if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
2207
27
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2208
27
          "len: %d bytes left: %d\n",
2209
27
          pos, s->distance_code, i, s->meta_block_remaining_len));
2210
27
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
2211
27
    }
2212
    /* Check that LZ77-dictionary address is non-negative. */
2213
65.4M
    if ((uint32_t)(s->distance_code - s->max_distance) - 1u <
2214
65.4M
        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
65.4M
    } else if (i >= SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
2231
65.4M
               i <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
2232
65.4M
      uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2233
65.4M
      uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2234
65.4M
      uint8_t dict_id = s->dictionary->context_based ?
2235
0
          s->dictionary->context_map[BROTLI_CONTEXT(p1, p2, s->context_lookup)]
2236
65.4M
          : 0;
2237
65.4M
      const BrotliDictionary* words = s->dictionary->words[dict_id];
2238
65.4M
      const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
2239
65.4M
      int offset = (int)words->offsets_by_length[i];
2240
65.4M
      brotli_reg_t shift = words->size_bits_by_length[i];
2241
65.4M
      int address = s->distance_code - s->max_distance - 1 -
2242
65.4M
                    (int)compound_dictionary_size;
2243
65.4M
      int mask = (int)BitMask(shift);
2244
65.4M
      int word_idx = address & mask;
2245
65.4M
      int transform_idx = address >> shift;
2246
      /* Compensate double distance-ring-buffer roll. */
2247
65.4M
      s->dist_rb_idx += s->distance_context;
2248
65.4M
      offset += word_idx * i;
2249
      /* If the distance is out of bound, select a next static dictionary if
2250
         there exist multiple. */
2251
65.4M
      if ((transform_idx >= (int)transforms->num_transforms ||
2252
65.4M
          words->size_bits_by_length[i] == 0) &&
2253
186
          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
65.4M
      if (BROTLI_PREDICT_FALSE(words->size_bits_by_length[i] == 0)) {
2283
82
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2284
82
            "len: %d bytes left: %d\n",
2285
82
            pos, s->distance_code, i, s->meta_block_remaining_len));
2286
82
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2287
82
      }
2288
65.4M
      if (BROTLI_PREDICT_FALSE(!words->data)) {
2289
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
2290
0
      }
2291
65.4M
      if (transform_idx < (int)transforms->num_transforms) {
2292
65.4M
        const uint8_t* word = &words->data[offset];
2293
65.4M
        int len = i;
2294
65.4M
        if (transform_idx == transforms->cutOffTransforms[0]) {
2295
65.4M
          memcpy(&s->ringbuffer[pos], word, (size_t)len);
2296
65.4M
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
2297
65.4M
                      len, word));
2298
65.4M
        } else {
2299
82.9k
          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
2300
82.9k
              transforms, transform_idx);
2301
82.9k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
2302
82.9k
                      " transform_idx = %d, transformed: [%.*s]\n",
2303
82.9k
                      i, word, transform_idx, len, &s->ringbuffer[pos]));
2304
82.9k
          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
82.9k
        }
2309
65.4M
        pos += len;
2310
65.4M
        s->meta_block_remaining_len -= len;
2311
65.4M
        if (pos >= s->ringbuffer_size) {
2312
61.1k
          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
2313
61.1k
          goto saveStateAndReturn;
2314
61.1k
        }
2315
65.4M
      } else {
2316
104
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2317
104
            "len: %d bytes left: %d\n",
2318
104
            pos, s->distance_code, i, s->meta_block_remaining_len));
2319
104
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
2320
104
      }
2321
65.4M
    } else {
2322
102
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2323
102
          "len: %d bytes left: %d\n",
2324
102
          pos, s->distance_code, i, s->meta_block_remaining_len));
2325
102
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2326
102
    }
2327
550M
  } else {
2328
550M
    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
2329
550M
    uint8_t* copy_dst = &s->ringbuffer[pos];
2330
550M
    uint8_t* copy_src = &s->ringbuffer[src_start];
2331
550M
    int dst_end = pos + i;
2332
550M
    int src_end = src_start + i;
2333
    /* Update the recent distances cache. */
2334
550M
    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
2335
550M
    ++s->dist_rb_idx;
2336
550M
    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
550M
    memmove16(copy_dst, copy_src);
2341
550M
    if (src_end > pos && dst_end > src_start) {
2342
      /* Regions intersect. */
2343
103M
      goto CommandPostWrapCopy;
2344
103M
    }
2345
447M
    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
2346
      /* At least one region wraps. */
2347
548k
      goto CommandPostWrapCopy;
2348
548k
    }
2349
446M
    pos += i;
2350
446M
    if (i > 16) {
2351
164k
      if (i > 32) {
2352
152k
        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
2353
152k
      } else {
2354
        /* This branch covers about 45% cases.
2355
           Fixed size short copy allows more compiler optimizations. */
2356
12.1k
        memmove16(copy_dst + 16, copy_src + 16);
2357
12.1k
      }
2358
164k
    }
2359
446M
  }
2360
512M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2361
512M
  if (s->meta_block_remaining_len <= 0) {
2362
    /* Next metablock, if any. */
2363
3.62k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2364
3.62k
    goto saveStateAndReturn;
2365
512M
  } else {
2366
512M
    goto CommandBegin;
2367
512M
  }
2368
104M
CommandPostWrapCopy:
2369
104M
  {
2370
104M
    int wrap_guard = s->ringbuffer_size - pos;
2371
1.87G
    while (--i >= 0) {
2372
1.77G
      s->ringbuffer[pos] =
2373
1.77G
          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
2374
1.77G
      ++pos;
2375
1.77G
      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
2376
307k
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
2377
307k
        goto saveStateAndReturn;
2378
307k
      }
2379
1.77G
    }
2380
104M
  }
2381
103M
  if (s->meta_block_remaining_len <= 0) {
2382
    /* Next metablock, if any. */
2383
1.97k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2384
1.97k
    goto saveStateAndReturn;
2385
103M
  } else {
2386
103M
    goto CommandBegin;
2387
103M
  }
2388
2389
155k
NextLiteralBlock:
2390
155k
  BROTLI_SAFE_WITH_STATUS(DecodeLiteralBlockSwitch(s));
2391
90.5k
  goto CommandInner;
2392
2393
2.95M
saveStateAndReturn:
2394
2.95M
  s->pos = pos;
2395
2.95M
  s->loop_counter = i;
2396
2.95M
  return result;
2397
155k
}
2398
2399
#undef BROTLI_SAFE
2400
2401
static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
2402
1.57M
    BrotliDecoderState* s) {
2403
1.57M
  return ProcessCommandsInternal(0, s);
2404
1.57M
}
2405
2406
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
2407
1.37M
    BrotliDecoderState* s) {
2408
1.37M
  return ProcessCommandsInternal(1, s);
2409
1.37M
}
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
4.85M
    size_t* available_out, uint8_t** next_out, size_t* total_out) {
2450
4.85M
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2451
4.85M
  BrotliBitReader* br = &s->br;
2452
4.85M
  size_t input_size = *available_in;
2453
4.85M
#define BROTLI_SAVE_ERROR_CODE(code) \
2454
4.85M
    SaveErrorCode(s, (code), input_size - *available_in)
2455
  /* Ensure that |total_out| is set, even if no data will ever be pushed out. */
2456
4.85M
  if (total_out) {
2457
4.85M
    *total_out = s->partial_pos_out;
2458
4.85M
  }
2459
  /* Do not try to process further in a case of unrecoverable error. */
2460
4.85M
  if ((int)s->error_code < 0) {
2461
0
    return BROTLI_DECODER_RESULT_ERROR;
2462
0
  }
2463
4.85M
  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
4.85M
  if (!*available_out) next_out = 0;
2468
4.85M
  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
2469
4.84M
    BrotliBitReaderSetInput(br, *next_in, *available_in);
2470
4.84M
  } 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
13.1k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2475
13.1k
    BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
2476
13.1k
  }
2477
  /* State machine */
2478
10.7M
  for (;;) {
2479
10.7M
    if (result != BROTLI_DECODER_SUCCESS) {
2480
      /* Error, needs more input/output. */
2481
4.88M
      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2482
1.26M
        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
2483
1.22M
          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
2484
1.22M
              available_out, next_out, total_out, BROTLI_TRUE);
2485
          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
2486
1.22M
          if ((int)intermediate_result < 0) {
2487
36
            result = intermediate_result;
2488
36
            break;
2489
36
          }
2490
1.22M
        }
2491
1.26M
        if (s->buffer_length != 0) {  /* Used with internal buffer. */
2492
25.4k
          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
9.91k
            s->buffer_length = 0;
2497
            /* Switch to input stream and restart. */
2498
9.91k
            result = BROTLI_DECODER_SUCCESS;
2499
9.91k
            BrotliBitReaderSetInput(br, *next_in, *available_in);
2500
9.91k
            continue;
2501
15.5k
          } else if (*available_in != 0) {
2502
            /* Not enough data in buffer, but can take one more byte from
2503
               input stream. */
2504
13.6k
            result = BROTLI_DECODER_SUCCESS;
2505
13.6k
            BROTLI_DCHECK(s->buffer_length < 8);
2506
13.6k
            s->buffer.u8[s->buffer_length] = **next_in;
2507
13.6k
            s->buffer_length++;
2508
13.6k
            BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
2509
13.6k
            (*next_in)++;
2510
13.6k
            (*available_in)--;
2511
            /* Retry with more data in buffer. */
2512
13.6k
            continue;
2513
13.6k
          }
2514
          /* Can't finish reading and no more input. */
2515
1.89k
          break;
2516
1.24M
        } else {  /* Input stream doesn't contain enough input. */
2517
          /* Copy tail to internal buffer and return. */
2518
1.24M
          *next_in = br->next_in;
2519
1.24M
          *available_in = BrotliBitReaderGetAvailIn(br);
2520
1.25M
          while (*available_in) {
2521
12.0k
            s->buffer.u8[s->buffer_length] = **next_in;
2522
12.0k
            s->buffer_length++;
2523
12.0k
            (*next_in)++;
2524
12.0k
            (*available_in)--;
2525
12.0k
          }
2526
1.24M
          break;
2527
1.24M
        }
2528
        /* Unreachable. */
2529
1.26M
      }
2530
2531
      /* Fail or needs more output. */
2532
2533
3.61M
      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
1.33k
        s->buffer_length = 0;
2537
3.61M
      } 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
3.61M
        BrotliBitReaderUnload(br);
2542
3.61M
        *available_in = BrotliBitReaderGetAvailIn(br);
2543
3.61M
        *next_in = br->next_in;
2544
3.61M
      }
2545
3.61M
      break;
2546
4.88M
    }
2547
5.90M
    switch (s->state) {
2548
5.01k
      case BROTLI_STATE_UNINITED:
2549
        /* Prepare to the first read. */
2550
5.01k
        if (!BrotliWarmupBitReader(br)) {
2551
0
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2552
0
          break;
2553
0
        }
2554
        /* Decode window size. */
2555
5.01k
        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
2556
5.01k
        if (result != BROTLI_DECODER_SUCCESS) {
2557
1
          break;
2558
1
        }
2559
5.01k
        if (s->large_window) {
2560
0
          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
2561
0
          break;
2562
0
        }
2563
5.01k
        s->state = BROTLI_STATE_INITIALIZE;
2564
5.01k
        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
5.01k
      case BROTLI_STATE_INITIALIZE:
2583
5.01k
        BROTLI_LOG_UINT(s->window_bits);
2584
        /* Maximum distance, see section 9.1. of the spec. */
2585
5.01k
        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
5.01k
        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
2589
5.01k
            sizeof(HuffmanCode) * 3 *
2590
5.01k
                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2591
5.01k
        if (s->block_type_trees == 0) {
2592
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES);
2593
0
          break;
2594
0
        }
2595
5.01k
        s->block_len_trees =
2596
5.01k
            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
2597
2598
5.01k
        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2599
      /* Fall through. */
2600
2601
20.9k
      case BROTLI_STATE_METABLOCK_BEGIN:
2602
20.9k
        BrotliDecoderStateMetablockBegin(s);
2603
20.9k
        BROTLI_LOG_UINT(s->pos);
2604
20.9k
        s->state = BROTLI_STATE_METABLOCK_HEADER;
2605
      /* Fall through. */
2606
2607
39.4k
      case BROTLI_STATE_METABLOCK_HEADER:
2608
39.4k
        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
2609
39.4k
        if (result != BROTLI_DECODER_SUCCESS) {
2610
18.7k
          break;
2611
18.7k
        }
2612
20.7k
        BROTLI_DCHECK(s->meta_block_remaining_len <=
2613
20.7k
                      (int)BROTLI_BLOCK_SIZE_CAP);
2614
20.7k
        BROTLI_LOG_UINT(s->is_last_metablock);
2615
20.7k
        BROTLI_LOG_UINT(s->meta_block_remaining_len);
2616
20.7k
        BROTLI_LOG_UINT(s->is_metadata);
2617
20.7k
        BROTLI_LOG_UINT(s->is_uncompressed);
2618
20.7k
        if (s->is_metadata || s->is_uncompressed) {
2619
7.03k
          if (!BrotliJumpToByteBoundary(br)) {
2620
42
            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
2621
42
            break;
2622
42
          }
2623
7.03k
        }
2624
20.6k
        if (s->is_metadata) {
2625
4.33k
          s->state = BROTLI_STATE_METADATA;
2626
4.33k
          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
4.33k
          break;
2631
4.33k
        }
2632
16.3k
        if (s->meta_block_remaining_len == 0) {
2633
71
          s->state = BROTLI_STATE_METABLOCK_DONE;
2634
71
          break;
2635
71
        }
2636
16.2k
        BrotliCalculateRingBufferSize(s);
2637
16.2k
        if (s->is_uncompressed) {
2638
2.65k
          s->state = BROTLI_STATE_UNCOMPRESSED;
2639
2.65k
          break;
2640
2.65k
        }
2641
13.6k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER;
2642
      /* Fall through. */
2643
2644
13.6k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: {
2645
13.6k
        BrotliMetablockHeaderArena* h = &s->arena.header;
2646
13.6k
        s->loop_counter = 0;
2647
        /* Initialize compressed metablock header arena. */
2648
13.6k
        h->sub_loop_counter = 0;
2649
        /* Make small negative indexes addressable. */
2650
13.6k
        h->symbol_lists =
2651
13.6k
            &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
2652
13.6k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
2653
13.6k
        h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
2654
13.6k
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
2655
13.6k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2656
13.6k
      }
2657
      /* Fall through. */
2658
2659
54.5k
      case BROTLI_STATE_HUFFMAN_CODE_0:
2660
54.5k
        if (s->loop_counter >= 3) {
2661
12.9k
          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
2662
12.9k
          break;
2663
12.9k
        }
2664
        /* Reads 1..11 bits. */
2665
41.6k
        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
2666
41.6k
        if (result != BROTLI_DECODER_SUCCESS) {
2667
1.75k
          break;
2668
1.75k
        }
2669
39.8k
        s->num_block_types[s->loop_counter]++;
2670
39.8k
        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2671
39.8k
        if (s->num_block_types[s->loop_counter] < 2) {
2672
35.5k
          s->loop_counter++;
2673
35.5k
          break;
2674
35.5k
        }
2675
4.26k
        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2676
      /* Fall through. */
2677
2678
7.60k
      case BROTLI_STATE_HUFFMAN_CODE_1: {
2679
7.60k
        brotli_reg_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
2680
7.60k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2681
7.60k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2682
7.60k
            &s->block_type_trees[tree_offset], NULL, s);
2683
7.60k
        if (result != BROTLI_DECODER_SUCCESS) break;
2684
3.89k
        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2685
3.89k
      }
2686
      /* Fall through. */
2687
2688
8.51k
      case BROTLI_STATE_HUFFMAN_CODE_2: {
2689
8.51k
        brotli_reg_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
2690
8.51k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2691
8.51k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2692
8.51k
            &s->block_len_trees[tree_offset], NULL, s);
2693
8.51k
        if (result != BROTLI_DECODER_SUCCESS) break;
2694
3.74k
        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2695
3.74k
      }
2696
      /* Fall through. */
2697
2698
6.70k
      case BROTLI_STATE_HUFFMAN_CODE_3: {
2699
6.70k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2700
6.70k
        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2701
6.70k
            &s->block_len_trees[tree_offset], br)) {
2702
3.01k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2703
3.01k
          break;
2704
3.01k
        }
2705
3.68k
        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2706
3.68k
        s->loop_counter++;
2707
3.68k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2708
3.68k
        break;
2709
6.70k
      }
2710
2711
25.1k
      case BROTLI_STATE_UNCOMPRESSED: {
2712
25.1k
        result = CopyUncompressedBlockToOutput(
2713
25.1k
            available_out, next_out, total_out, s);
2714
25.1k
        if (result != BROTLI_DECODER_SUCCESS) {
2715
22.6k
          break;
2716
22.6k
        }
2717
2.46k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2718
2.46k
        break;
2719
25.1k
      }
2720
2721
55.2k
      case BROTLI_STATE_METADATA:
2722
55.2k
        result = SkipMetadataBlock(s);
2723
55.2k
        if (result != BROTLI_DECODER_SUCCESS) {
2724
51.1k
          break;
2725
51.1k
        }
2726
4.13k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2727
4.13k
        break;
2728
2729
17.8k
      case BROTLI_STATE_METABLOCK_HEADER_2: {
2730
17.8k
        brotli_reg_t bits;
2731
17.8k
        if (!BrotliSafeReadBits(br, 6, &bits)) {
2732
4.91k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2733
4.91k
          break;
2734
4.91k
        }
2735
12.9k
        s->distance_postfix_bits = bits & BitMask(2);
2736
12.9k
        bits >>= 2;
2737
12.9k
        s->num_direct_distance_codes = bits << s->distance_postfix_bits;
2738
12.9k
        BROTLI_LOG_UINT(s->num_direct_distance_codes);
2739
12.9k
        BROTLI_LOG_UINT(s->distance_postfix_bits);
2740
12.9k
        s->context_modes =
2741
12.9k
            (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
2742
12.9k
        if (s->context_modes == 0) {
2743
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
2744
0
          break;
2745
0
        }
2746
12.9k
        s->loop_counter = 0;
2747
12.9k
        s->state = BROTLI_STATE_CONTEXT_MODES;
2748
12.9k
      }
2749
      /* Fall through. */
2750
2751
14.5k
      case BROTLI_STATE_CONTEXT_MODES:
2752
14.5k
        result = ReadContextModes(s);
2753
14.5k
        if (result != BROTLI_DECODER_SUCCESS) {
2754
1.68k
          break;
2755
1.68k
        }
2756
12.8k
        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2757
      /* Fall through. */
2758
2759
18.0k
      case BROTLI_STATE_CONTEXT_MAP_1:
2760
18.0k
        result = DecodeContextMap(
2761
18.0k
            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2762
18.0k
            &s->num_literal_htrees, &s->context_map, s);
2763
18.0k
        if (result != BROTLI_DECODER_SUCCESS) {
2764
5.35k
          break;
2765
5.35k
        }
2766
12.6k
        DetectTrivialLiteralBlockTypes(s);
2767
12.6k
        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2768
      /* Fall through. */
2769
2770
14.6k
      case BROTLI_STATE_CONTEXT_MAP_2: {
2771
14.6k
        brotli_reg_t npostfix = s->distance_postfix_bits;
2772
14.6k
        brotli_reg_t ndirect = s->num_direct_distance_codes;
2773
14.6k
        brotli_reg_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2774
14.6k
            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
2775
14.6k
        brotli_reg_t distance_alphabet_size_limit = distance_alphabet_size_max;
2776
14.6k
        BROTLI_BOOL allocation_success = BROTLI_TRUE;
2777
14.6k
        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
14.6k
        result = DecodeContextMap(
2786
14.6k
            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2787
14.6k
            &s->num_dist_htrees, &s->dist_context_map, s);
2788
14.6k
        if (result != BROTLI_DECODER_SUCCESS) {
2789
2.12k
          break;
2790
2.12k
        }
2791
12.5k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2792
12.5k
            s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
2793
12.5k
            BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
2794
12.5k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2795
12.5k
            s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
2796
12.5k
            BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
2797
12.5k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2798
12.5k
            s, &s->distance_hgroup, distance_alphabet_size_max,
2799
12.5k
            distance_alphabet_size_limit, s->num_dist_htrees);
2800
12.5k
        if (!allocation_success) {
2801
0
          return BROTLI_SAVE_ERROR_CODE(
2802
0
              BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
2803
0
        }
2804
12.5k
        s->loop_counter = 0;
2805
12.5k
        s->state = BROTLI_STATE_TREE_GROUP;
2806
12.5k
      }
2807
      /* Fall through. */
2808
2809
78.9k
      case BROTLI_STATE_TREE_GROUP: {
2810
78.9k
        HuffmanTreeGroup* hgroup = NULL;
2811
78.9k
        switch (s->loop_counter) {
2812
25.4k
          case 0: hgroup = &s->literal_hgroup; break;
2813
23.9k
          case 1: hgroup = &s->insert_copy_hgroup; break;
2814
29.4k
          case 2: hgroup = &s->distance_hgroup; break;
2815
0
          default: return BROTLI_SAVE_ERROR_CODE(BROTLI_FAILURE(
2816
78.9k
              BROTLI_DECODER_ERROR_UNREACHABLE));  /* COV_NF_LINE */
2817
78.9k
        }
2818
78.9k
        result = HuffmanTreeGroupDecode(hgroup, s);
2819
78.9k
        if (result != BROTLI_DECODER_SUCCESS) break;
2820
36.4k
        s->loop_counter++;
2821
36.4k
        if (s->loop_counter < 3) {
2822
24.4k
          break;
2823
24.4k
        }
2824
11.9k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY;
2825
11.9k
      }
2826
      /* Fall through. */
2827
2828
11.9k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY:
2829
11.9k
        PrepareLiteralDecoding(s);
2830
11.9k
        s->dist_context_map_slice = s->dist_context_map;
2831
11.9k
        s->htree_command = s->insert_copy_hgroup.htrees[0];
2832
11.9k
        if (!BrotliEnsureRingBuffer(s)) {
2833
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
2834
0
          break;
2835
0
        }
2836
11.9k
        CalculateDistanceLut(s);
2837
11.9k
        s->state = BROTLI_STATE_COMMAND_BEGIN;
2838
      /* Fall through. */
2839
2840
159k
      case BROTLI_STATE_COMMAND_BEGIN:
2841
      /* Fall through. */
2842
1.21M
      case BROTLI_STATE_COMMAND_INNER:
2843
      /* Fall through. */
2844
1.27M
      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2845
      /* Fall through. */
2846
1.57M
      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2847
1.57M
        result = ProcessCommands(s);
2848
1.57M
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2849
1.37M
          result = SafeProcessCommands(s);
2850
1.37M
        }
2851
1.57M
        break;
2852
2853
1.46M
      case BROTLI_STATE_COMMAND_INNER_WRITE:
2854
      /* Fall through. */
2855
1.85M
      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2856
      /* Fall through. */
2857
3.91M
      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2858
3.91M
        result = WriteRingBuffer(
2859
3.91M
            s, available_out, next_out, total_out, BROTLI_FALSE);
2860
3.91M
        if (result != BROTLI_DECODER_SUCCESS) {
2861
3.45M
          break;
2862
3.45M
        }
2863
456k
        WrapRingBuffer(s);
2864
456k
        if (s->ringbuffer_size == 1 << s->window_bits) {
2865
456k
          s->max_distance = s->max_backward_distance;
2866
456k
        }
2867
456k
        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
2868
61.1k
          BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
2869
61.1k
          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
61.1k
          if (s->meta_block_remaining_len == 0) {
2874
            /* Next metablock, if any. */
2875
91
            s->state = BROTLI_STATE_METABLOCK_DONE;
2876
61.0k
          } else {
2877
61.0k
            s->state = BROTLI_STATE_COMMAND_BEGIN;
2878
61.0k
          }
2879
61.1k
          break;
2880
395k
        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2881
307k
          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2882
307k
        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2883
88.4k
          if (s->loop_counter == 0) {
2884
27.3k
            if (s->meta_block_remaining_len == 0) {
2885
350
              s->state = BROTLI_STATE_METABLOCK_DONE;
2886
27.0k
            } else {
2887
27.0k
              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2888
27.0k
            }
2889
27.3k
            break;
2890
27.3k
          }
2891
61.0k
          s->state = BROTLI_STATE_COMMAND_INNER;
2892
61.0k
        }
2893
368k
        break;
2894
2895
368k
      case BROTLI_STATE_METABLOCK_DONE:
2896
16.5k
        if (s->meta_block_remaining_len < 0) {
2897
487
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
2898
487
          break;
2899
487
        }
2900
16.0k
        BrotliDecoderStateCleanupAfterMetablock(s);
2901
16.0k
        if (!s->is_last_metablock) {
2902
15.9k
          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2903
15.9k
          break;
2904
15.9k
        }
2905
140
        if (!BrotliJumpToByteBoundary(br)) {
2906
39
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2907
39
          break;
2908
39
        }
2909
101
        if (s->buffer_length == 0) {
2910
98
          BrotliBitReaderUnload(br);
2911
98
          *available_in = BrotliBitReaderGetAvailIn(br);
2912
98
          *next_in = br->next_in;
2913
98
        }
2914
101
        s->state = BROTLI_STATE_DONE;
2915
      /* Fall through. */
2916
2917
136k
      case BROTLI_STATE_DONE:
2918
136k
        if (s->ringbuffer != 0) {
2919
136k
          result = WriteRingBuffer(
2920
136k
              s, available_out, next_out, total_out, BROTLI_TRUE);
2921
136k
          if (result != BROTLI_DECODER_SUCCESS) {
2922
136k
            break;
2923
136k
          }
2924
136k
        }
2925
101
        return BROTLI_SAVE_ERROR_CODE(result);
2926
5.90M
    }
2927
5.90M
  }
2928
4.85M
  return BROTLI_SAVE_ERROR_CODE(result);
2929
4.85M
#undef BROTLI_SAVE_ERROR_CODE
2930
4.85M
}
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
0
BrotliDecoderErrorCode BrotliDecoderGetErrorCode(const BrotliDecoderState* s) {
2977
0
  return (BrotliDecoderErrorCode)s->error_code;
2978
0
}
2979
2980
0
const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c) {
2981
0
  switch (c) {
2982
0
#define BROTLI_ERROR_CODE_CASE_(PREFIX, NAME, CODE) \
2983
0
    case BROTLI_DECODER ## PREFIX ## NAME: return #PREFIX #NAME;
2984
0
#define BROTLI_NOTHING_
2985
0
    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
0
  }
2990
0
}
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