Coverage Report

Created: 2025-07-18 06:52

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