Coverage Report

Created: 2026-08-17 07:50

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