Coverage Report

Created: 2025-08-18 06:39

/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 "../common/constants.h"
10
#include "../common/context.h"
11
#include "../common/dictionary.h"
12
#include "../common/platform.h"
13
#include "../common/shared_dictionary_internal.h"
14
#include "../common/transform.h"
15
#include "../common/version.h"
16
#include "bit_reader.h"
17
#include "huffman.h"
18
#include "prefix.h"
19
#include "state.h"
20
21
#if defined(BROTLI_TARGET_NEON)
22
#include <arm_neon.h>
23
#endif
24
25
#if defined(__cplusplus) || defined(c_plusplus)
26
extern "C" {
27
#endif
28
29
1.68k
#define BROTLI_FAILURE(CODE) (BROTLI_DUMP(), CODE)
30
31
#define BROTLI_LOG_UINT(name)                                       \
32
  BROTLI_LOG(("[%s] %s = %lu\n", __func__, #name, (unsigned long)(name)))
33
#define BROTLI_LOG_ARRAY_INDEX(array_name, idx)                     \
34
  BROTLI_LOG(("[%s] %s[%lu] = %lu\n", __func__, #array_name,        \
35
         (unsigned long)(idx), (unsigned long)array_name[idx]))
36
37
2.49G
#define HUFFMAN_TABLE_BITS 8U
38
4.18k
#define HUFFMAN_TABLE_MASK 0xFF
39
40
/* We need the slack region for the following reasons:
41
    - doing up to two 16-byte copies for fast backward copying
42
    - inserting transformed dictionary word:
43
        255 prefix + 32 base + 255 suffix */
44
static const brotli_reg_t kRingBufferWriteAheadSlack = 542;
45
46
static const BROTLI_MODEL("small")
47
uint8_t kCodeLengthCodeOrder[BROTLI_CODE_LENGTH_CODES] = {
48
  1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
49
};
50
51
/* Static prefix code for the complex code length code lengths. */
52
static const BROTLI_MODEL("small")
53
uint8_t kCodeLengthPrefixLength[16] = {
54
  2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 4,
55
};
56
57
static const BROTLI_MODEL("small")
58
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.34k
    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
80
5.34k
  BrotliDecoderState* state = 0;
81
5.34k
  if (!alloc_func && !free_func) {
82
5.34k
    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
83
5.34k
  } else if (alloc_func && free_func) {
84
0
    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
85
0
  }
86
5.34k
  if (state == 0) {
87
0
    BROTLI_DUMP();
88
0
    return 0;
89
0
  }
90
5.34k
  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.34k
  return state;
100
5.34k
}
101
102
/* Deinitializes and frees BrotliDecoderState instance. */
103
5.34k
void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
104
5.34k
  if (!state) {
105
0
    return;
106
5.34k
  } else {
107
5.34k
    brotli_free_func free_func = state->free_func;
108
5.34k
    void* opaque = state->memory_manager_opaque;
109
5.34k
    BrotliDecoderStateCleanup(state);
110
5.34k
    free_func(opaque, state);
111
5.34k
  }
112
5.34k
}
113
114
/* Saves error code and converts it to BrotliDecoderResult. */
115
static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
116
5.60M
    BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
117
5.60M
  s->error_code = (int)e;
118
5.60M
  s->used_input += consumed_input;
119
5.60M
  if ((s->buffer_length != 0) && (s->br.next_in == s->br.last_in)) {
120
    /* If internal buffer is depleted at last, reset it. */
121
3
    s->buffer_length = 0;
122
3
  }
123
5.60M
  switch (e) {
124
118
    case BROTLI_DECODER_SUCCESS:
125
118
      return BROTLI_DECODER_RESULT_SUCCESS;
126
127
2.18M
    case BROTLI_DECODER_NEEDS_MORE_INPUT:
128
2.18M
      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
129
130
3.42M
    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
131
3.42M
      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
132
133
1.68k
    default:
134
1.68k
      return BROTLI_DECODER_RESULT_ERROR;
135
5.60M
  }
136
5.60M
}
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.34k
                                               BrotliBitReader* br) {
142
5.34k
  brotli_reg_t n;
143
5.34k
  BROTLI_BOOL large_window = s->large_window;
144
5.34k
  s->large_window = BROTLI_FALSE;
145
5.34k
  BrotliTakeBits(br, 1, &n);
146
5.34k
  if (n == 0) {
147
3.77k
    s->window_bits = 16;
148
3.77k
    return BROTLI_DECODER_SUCCESS;
149
3.77k
  }
150
1.57k
  BrotliTakeBits(br, 3, &n);
151
1.57k
  if (n != 0) {
152
879
    s->window_bits = (17u + n) & 63u;
153
879
    return BROTLI_DECODER_SUCCESS;
154
879
  }
155
695
  BrotliTakeBits(br, 3, &n);
156
695
  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
694
  if (n != 0) {
169
610
    s->window_bits = (8u + n) & 63u;
170
610
    return BROTLI_DECODER_SUCCESS;
171
610
  }
172
84
  s->window_bits = 17;
173
84
  return BROTLI_DECODER_SUCCESS;
174
694
}
175
176
528M
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
528M
  uint32_t buffer[4];
181
528M
  memcpy(buffer, src, 16);
182
528M
  memcpy(dst, buffer, 16);
183
528M
#endif
184
528M
}
185
186
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
187
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
188
73.0k
    BrotliDecoderState* s, BrotliBitReader* br, brotli_reg_t* value) {
189
73.0k
  brotli_reg_t bits;
190
73.0k
  switch (s->substate_decode_uint8) {
191
71.5k
    case BROTLI_STATE_DECODE_UINT8_NONE:
192
71.5k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
193
3.87k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
194
3.87k
      }
195
67.6k
      if (bits == 0) {
196
60.9k
        *value = 0;
197
60.9k
        return BROTLI_DECODER_SUCCESS;
198
60.9k
      }
199
    /* Fall through. */
200
201
7.39k
    case BROTLI_STATE_DECODE_UINT8_SHORT:
202
7.39k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
203
824
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
204
824
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
205
824
      }
206
6.57k
      if (bits == 0) {
207
3.30k
        *value = 1;
208
3.30k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
209
3.30k
        return BROTLI_DECODER_SUCCESS;
210
3.30k
      }
211
      /* Use output value as a temporary storage. It MUST be persisted. */
212
3.27k
      *value = bits;
213
    /* Fall through. */
214
215
4.08k
    case BROTLI_STATE_DECODE_UINT8_LONG:
216
4.08k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
217
855
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
218
855
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
219
855
      }
220
3.22k
      *value = ((brotli_reg_t)1U << *value) + bits;
221
3.22k
      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
222
3.22k
      return BROTLI_DECODER_SUCCESS;
223
224
0
    default:
225
0
      return
226
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
227
73.0k
  }
228
73.0k
}
229
230
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
231
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
232
37.9k
    BrotliDecoderState* s, BrotliBitReader* br) {
233
37.9k
  brotli_reg_t bits;
234
37.9k
  int i;
235
61.6k
  for (;;) {
236
61.6k
    switch (s->substate_metablock_header) {
237
23.1k
      case BROTLI_STATE_METABLOCK_HEADER_NONE:
238
23.1k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
239
1.98k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
240
1.98k
        }
241
21.1k
        s->is_last_metablock = bits ? 1 : 0;
242
21.1k
        s->meta_block_remaining_len = 0;
243
21.1k
        s->is_uncompressed = 0;
244
21.1k
        s->is_metadata = 0;
245
21.1k
        if (!s->is_last_metablock) {
246
19.6k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
247
19.6k
          break;
248
19.6k
        }
249
1.52k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
250
      /* Fall through. */
251
252
1.54k
      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
253
1.54k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
254
21
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
255
21
        }
256
1.52k
        if (bits) {
257
82
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
258
82
          return BROTLI_DECODER_SUCCESS;
259
82
        }
260
1.44k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
261
      /* Fall through. */
262
263
22.1k
      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
264
22.1k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
265
1.15k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
266
1.15k
        }
267
21.0k
        s->size_nibbles = (uint8_t)(bits + 4);
268
21.0k
        s->loop_counter = 0;
269
21.0k
        if (bits == 3) {
270
4.11k
          s->is_metadata = 1;
271
4.11k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
272
4.11k
          break;
273
4.11k
        }
274
16.8k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
275
      /* Fall through. */
276
277
29.1k
      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
278
29.1k
        i = s->loop_counter;
279
98.8k
        for (; i < (int)s->size_nibbles; ++i) {
280
82.0k
          if (!BrotliSafeReadBits(br, 4, &bits)) {
281
12.3k
            s->loop_counter = i;
282
12.3k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
283
12.3k
          }
284
69.7k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
285
69.7k
              bits == 0) {
286
11
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
287
11
          }
288
69.6k
          s->meta_block_remaining_len |= (int)(bits << (i * 4));
289
69.6k
        }
290
16.7k
        s->substate_metablock_header =
291
16.7k
            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
292
      /* Fall through. */
293
294
17.1k
      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
295
17.1k
        if (!s->is_last_metablock) {
296
15.8k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
297
425
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
298
425
          }
299
15.4k
          s->is_uncompressed = bits ? 1 : 0;
300
15.4k
        }
301
16.7k
        ++s->meta_block_remaining_len;
302
16.7k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
303
16.7k
        return BROTLI_DECODER_SUCCESS;
304
305
4.59k
      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
306
4.59k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
307
475
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
308
475
        }
309
4.11k
        if (bits != 0) {
310
16
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
311
16
        }
312
4.10k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
313
      /* Fall through. */
314
315
4.30k
      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
316
4.30k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
317
210
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
318
210
        }
319
4.09k
        if (bits == 0) {
320
2.53k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
321
2.53k
          return BROTLI_DECODER_SUCCESS;
322
2.53k
        }
323
1.56k
        s->size_nibbles = (uint8_t)bits;
324
1.56k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
325
      /* Fall through. */
326
327
1.87k
      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
328
1.87k
        i = s->loop_counter;
329
3.87k
        for (; i < (int)s->size_nibbles; ++i) {
330
2.33k
          if (!BrotliSafeReadBits(br, 8, &bits)) {
331
333
            s->loop_counter = i;
332
333
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
333
333
          }
334
2.00k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
335
2.00k
              bits == 0) {
336
2
            return BROTLI_FAILURE(
337
2
                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
338
2
          }
339
2.00k
          s->meta_block_remaining_len |= (int)(bits << (i * 8));
340
2.00k
        }
341
1.54k
        ++s->meta_block_remaining_len;
342
1.54k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
343
1.54k
        return BROTLI_DECODER_SUCCESS;
344
345
0
      default:
346
0
        return
347
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
348
61.6k
    }
349
61.6k
  }
350
37.9k
}
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.47G
                                               BrotliBitReader* br) {
359
1.47G
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
360
1.47G
  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
361
1.47G
  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
362
12.2k
    brotli_reg_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
363
12.2k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
364
12.2k
    BROTLI_HC_ADJUST_TABLE_INDEX(table,
365
12.2k
        BROTLI_HC_FAST_LOAD_VALUE(table) +
366
12.2k
        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
367
12.2k
  }
368
1.47G
  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
369
1.47G
  return BROTLI_HC_FAST_LOAD_VALUE(table);
370
1.47G
}
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
296M
                                             BrotliBitReader* br) {
376
296M
  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
377
296M
}
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.13G
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
383
1.13G
  brotli_reg_t val;
384
1.13G
  brotli_reg_t available_bits = BrotliGetAvailableBits(br);
385
1.13G
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
386
1.13G
  if (available_bits == 0) {
387
124M
    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
388
122M
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
389
122M
      return BROTLI_TRUE;
390
122M
    }
391
1.66M
    return BROTLI_FALSE;  /* No valid bits at all. */
392
124M
  }
393
1.01G
  val = BrotliGetBitsUnmasked(br);
394
1.01G
  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
395
1.01G
  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
396
1.01G
    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
397
1.01G
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
398
1.01G
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
399
1.01G
      return BROTLI_TRUE;
400
1.01G
    } else {
401
272k
      return BROTLI_FALSE;  /* Not enough bits for the first level. */
402
272k
    }
403
1.01G
  }
404
4.93k
  if (available_bits <= HUFFMAN_TABLE_BITS) {
405
3.39k
    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
406
3.39k
  }
407
408
  /* Speculatively drop HUFFMAN_TABLE_BITS. */
409
1.53k
  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
410
1.53k
  available_bits -= HUFFMAN_TABLE_BITS;
411
1.53k
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
412
1.53k
  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
413
441
    return BROTLI_FALSE;  /* Not enough bits for the second level. */
414
441
  }
415
416
1.09k
  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
417
1.09k
  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
418
1.09k
  return BROTLI_TRUE;
419
1.53k
}
420
421
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
422
2.31G
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
423
2.31G
  brotli_reg_t val;
424
2.31G
  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
425
1.17G
    *result = DecodeSymbol(val, table, br);
426
1.17G
    return BROTLI_TRUE;
427
1.17G
  }
428
1.13G
  return SafeDecodeSymbol(table, br, result);
429
2.31G
}
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
786M
                                        brotli_reg_t* value) {
437
786M
  if (safe) {
438
256M
    return;
439
256M
  }
440
530M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
441
530M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
442
530M
  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
443
530M
  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
444
530M
}
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
461M
                                                  brotli_reg_t* value) {
452
461M
  brotli_reg_t result = *value;
453
461M
  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
454
4.18k
    brotli_reg_t val = BrotliGet16BitsUnmasked(br);
455
4.18k
    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
456
4.18k
    brotli_reg_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
457
4.18k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
458
4.18k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
459
4.18k
    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
460
4.18k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
461
4.18k
    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
462
461M
  } else {
463
461M
    BrotliDropBits(br, *bits);
464
461M
  }
465
461M
  PreloadSymbol(0, table, br, bits, value);
466
461M
  return result;
467
461M
}
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
137M
                                                        const int limit) {
479
  /* Calculate range where CheckInputAmount is always true.
480
     Start with the number of bytes we can read. */
481
137M
  int64_t new_lim = br->guard_in - br->next_in;
482
  /* Convert to bits, since sybmols use variable number of bits. */
483
137M
  new_lim *= 8;
484
  /* At most 15 bits per symbol, so this is safe. */
485
137M
  new_lim /= 15;
486
137M
  const int kMaximalOverread = 4;
487
137M
  int pos_limit = limit;
488
137M
  int copies = 0;
489
137M
  if ((new_lim - kMaximalOverread) <= limit) {
490
    // Safe cast, since new_lim is already < num_steps
491
75.3M
    pos_limit = (int)(new_lim - kMaximalOverread);
492
75.3M
  }
493
137M
  if (pos_limit < 0) {
494
64.7M
    pos_limit = 0;
495
64.7M
  }
496
137M
  copies = pos_limit;
497
137M
  pos_limit += pos;
498
  /* Fast path, caller made sure it is safe to write,
499
     we verified that is is safe to read. */
500
251M
  for (; pos < pos_limit; pos++) {
501
113M
    BROTLI_DCHECK(BrotliCheckInputAmount(br));
502
113M
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
503
113M
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
504
113M
  }
505
  /* Do the remainder, caller made sure it is safe to write,
506
     we need to bverify that it is safe to read. */
507
485M
  while (BrotliCheckInputAmount(br) && copies < limit) {
508
347M
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
509
347M
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
510
347M
    pos++;
511
347M
    copies++;
512
347M
  }
513
137M
  return copies;
514
137M
}
515
516
77.1k
static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) {
517
77.1k
  brotli_reg_t result = 0;
518
674k
  while (x) {
519
597k
    x >>= 1;
520
597k
    ++result;
521
597k
  }
522
77.1k
  return result;
523
77.1k
}
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
77.1k
    BrotliDecoderState* s) {
531
  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
532
77.1k
  BrotliBitReader* br = &s->br;
533
77.1k
  BrotliMetablockHeaderArena* h = &s->arena.header;
534
77.1k
  brotli_reg_t max_bits = Log2Floor(alphabet_size_max - 1);
535
77.1k
  brotli_reg_t i = h->sub_loop_counter;
536
77.1k
  brotli_reg_t num_symbols = h->symbol;
537
146k
  while (i <= num_symbols) {
538
95.1k
    brotli_reg_t v;
539
95.1k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
540
26.2k
      h->sub_loop_counter = i;
541
26.2k
      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
542
26.2k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
543
26.2k
    }
544
68.9k
    if (v >= alphabet_size_limit) {
545
25
      return
546
25
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
547
25
    }
548
68.9k
    h->symbols_lists_array[i] = (uint16_t)v;
549
68.9k
    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
550
68.9k
    ++i;
551
68.9k
  }
552
553
68.8k
  for (i = 0; i < num_symbols; ++i) {
554
18.0k
    brotli_reg_t k = i + 1;
555
46.2k
    for (; k <= num_symbols; ++k) {
556
28.2k
      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
28.2k
    }
560
18.0k
  }
561
562
50.8k
  return BROTLI_DECODER_SUCCESS;
563
50.8k
}
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
307k
    uint16_t* code_length_histo, int* next_symbol) {
575
307k
  *repeat = 0;
576
307k
  if (code_len != 0) {  /* code_len == 1..15 */
577
303k
    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
578
303k
    next_symbol[code_len] = (int)(*symbol);
579
303k
    *prev_code_len = code_len;
580
303k
    *space -= 32768U >> code_len;
581
303k
    code_length_histo[code_len]++;
582
303k
    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
583
303k
        (int)*symbol, (int)code_len));
584
303k
  }
585
307k
  (*symbol)++;
586
307k
}
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.94k
    uint16_t* code_length_histo, int* next_symbol) {
603
5.94k
  brotli_reg_t old_repeat;
604
5.94k
  brotli_reg_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
605
5.94k
  brotli_reg_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
606
5.94k
  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
607
3.65k
    new_len = *prev_code_len;
608
3.65k
    extra_bits = 2;
609
3.65k
  }
610
5.94k
  if (*repeat_code_len != new_len) {
611
1.53k
    *repeat = 0;
612
1.53k
    *repeat_code_len = new_len;
613
1.53k
  }
614
5.94k
  old_repeat = *repeat;
615
5.94k
  if (*repeat > 0) {
616
1.44k
    *repeat -= 2;
617
1.44k
    *repeat <<= extra_bits;
618
1.44k
  }
619
5.94k
  *repeat += repeat_delta + 3U;
620
5.94k
  repeat_delta = *repeat - old_repeat;
621
5.94k
  if (*symbol + repeat_delta > alphabet_size) {
622
122
    BROTLI_DUMP();
623
122
    *symbol = alphabet_size;
624
122
    *space = 0xFFFFF;
625
122
    return;
626
122
  }
627
5.82k
  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
628
5.82k
      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
629
5.82k
  if (*repeat_code_len != 0) {
630
3.59k
    brotli_reg_t last = *symbol + repeat_delta;
631
3.59k
    int next = next_symbol[*repeat_code_len];
632
48.1k
    do {
633
48.1k
      symbol_lists[next] = (uint16_t)*symbol;
634
48.1k
      next = (int)*symbol;
635
48.1k
    } while (++(*symbol) != last);
636
3.59k
    next_symbol[*repeat_code_len] = next;
637
3.59k
    *space -= repeat_delta << (15 - *repeat_code_len);
638
3.59k
    code_length_histo[*repeat_code_len] =
639
3.59k
        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
640
3.59k
  } else {
641
2.22k
    *symbol += repeat_delta;
642
2.22k
  }
643
5.82k
}
644
645
/* Reads and decodes symbol codelengths. */
646
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
647
20.8k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
648
20.8k
  BrotliBitReader* br = &s->br;
649
20.8k
  BrotliMetablockHeaderArena* h = &s->arena.header;
650
20.8k
  brotli_reg_t symbol = h->symbol;
651
20.8k
  brotli_reg_t repeat = h->repeat;
652
20.8k
  brotli_reg_t space = h->space;
653
20.8k
  brotli_reg_t prev_code_len = h->prev_code_len;
654
20.8k
  brotli_reg_t repeat_code_len = h->repeat_code_len;
655
20.8k
  uint16_t* symbol_lists = h->symbol_lists;
656
20.8k
  uint16_t* code_length_histo = h->code_length_histo;
657
20.8k
  int* next_symbol = h->next_symbol;
658
20.8k
  if (!BrotliWarmupBitReader(br)) {
659
830
    return BROTLI_DECODER_NEEDS_MORE_INPUT;
660
830
  }
661
149k
  while (symbol < alphabet_size && space > 0) {
662
144k
    const HuffmanCode* p = h->table;
663
144k
    brotli_reg_t code_len;
664
144k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
665
144k
    if (!BrotliCheckInputAmount(br)) {
666
15.5k
      h->symbol = symbol;
667
15.5k
      h->repeat = repeat;
668
15.5k
      h->prev_code_len = prev_code_len;
669
15.5k
      h->repeat_code_len = repeat_code_len;
670
15.5k
      h->space = space;
671
15.5k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
672
15.5k
    }
673
129k
    BrotliFillBitWindow16(br);
674
129k
    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
675
129k
        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
676
129k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
677
129k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
678
129k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
679
127k
      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
680
127k
          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
681
127k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
682
2.14k
      brotli_reg_t extra_bits =
683
2.14k
          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
684
2.14k
      brotli_reg_t repeat_delta =
685
2.14k
          BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
686
2.14k
      BrotliDropBits(br, extra_bits);
687
2.14k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
688
2.14k
          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
689
2.14k
          symbol_lists, code_length_histo, next_symbol);
690
2.14k
    }
691
129k
  }
692
4.52k
  h->space = space;
693
4.52k
  return BROTLI_DECODER_SUCCESS;
694
20.0k
}
695
696
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
697
16.3k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
698
16.3k
  BrotliBitReader* br = &s->br;
699
16.3k
  BrotliMetablockHeaderArena* h = &s->arena.header;
700
16.3k
  BROTLI_BOOL get_byte = BROTLI_FALSE;
701
223k
  while (h->symbol < alphabet_size && h->space > 0) {
702
217k
    const HuffmanCode* p = h->table;
703
217k
    brotli_reg_t code_len;
704
217k
    brotli_reg_t available_bits;
705
217k
    brotli_reg_t bits = 0;
706
217k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
707
217k
    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
708
207k
    get_byte = BROTLI_FALSE;
709
207k
    available_bits = BrotliGetAvailableBits(br);
710
207k
    if (available_bits != 0) {
711
163k
      bits = (uint32_t)BrotliGetBitsUnmasked(br);
712
163k
    }
713
207k
    BROTLI_HC_ADJUST_TABLE_INDEX(p,
714
207k
        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
715
207k
    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
716
20.1k
      get_byte = BROTLI_TRUE;
717
20.1k
      continue;
718
20.1k
    }
719
187k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
720
187k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
721
180k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
722
180k
      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
723
180k
          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
724
180k
          h->next_symbol);
725
180k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
726
6.48k
      brotli_reg_t extra_bits = code_len - 14U;
727
6.48k
      brotli_reg_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
728
6.48k
          BitMask(extra_bits);
729
6.48k
      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
730
2.69k
        get_byte = BROTLI_TRUE;
731
2.69k
        continue;
732
2.69k
      }
733
3.79k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
734
3.79k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
735
3.79k
          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
736
3.79k
          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
737
3.79k
          h->next_symbol);
738
3.79k
    }
739
187k
  }
740
5.92k
  return BROTLI_DECODER_SUCCESS;
741
16.3k
}
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
18.5k
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
746
18.5k
  BrotliBitReader* br = &s->br;
747
18.5k
  BrotliMetablockHeaderArena* h = &s->arena.header;
748
18.5k
  brotli_reg_t num_codes = h->repeat;
749
18.5k
  brotli_reg_t space = h->space;
750
18.5k
  brotli_reg_t i = h->sub_loop_counter;
751
87.4k
  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
752
86.5k
    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
753
86.5k
    brotli_reg_t ix;
754
86.5k
    brotli_reg_t v;
755
86.5k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
756
13.9k
      brotli_reg_t available_bits = BrotliGetAvailableBits(br);
757
13.9k
      if (available_bits != 0) {
758
8.97k
        ix = BrotliGetBitsUnmasked(br) & 0xF;
759
8.97k
      } else {
760
4.94k
        ix = 0;
761
4.94k
      }
762
13.9k
      if (kCodeLengthPrefixLength[ix] > available_bits) {
763
7.75k
        h->sub_loop_counter = i;
764
7.75k
        h->repeat = num_codes;
765
7.75k
        h->space = space;
766
7.75k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
767
7.75k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
768
7.75k
      }
769
13.9k
    }
770
78.8k
    v = kCodeLengthPrefixValue[ix];
771
78.8k
    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
772
78.8k
    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
773
78.8k
    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
774
78.8k
    if (v != 0) {
775
41.9k
      space = space - (32U >> v);
776
41.9k
      ++num_codes;
777
41.9k
      ++h->code_length_histo[v];
778
41.9k
      if (space - 1U >= 32U) {
779
        /* space is 0 or wrapped around. */
780
9.96k
        break;
781
9.96k
      }
782
41.9k
    }
783
78.8k
  }
784
10.8k
  if (!(num_codes == 1 || space == 0)) {
785
132
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
786
132
  }
787
10.6k
  return BROTLI_DECODER_SUCCESS;
788
10.8k
}
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
118k
                                              BrotliDecoderState* s) {
806
118k
  BrotliBitReader* br = &s->br;
807
118k
  BrotliMetablockHeaderArena* h = &s->arena.header;
808
  /* State machine. */
809
129k
  for (;;) {
810
129k
    switch (h->substate_huffman) {
811
66.7k
      case BROTLI_STATE_HUFFMAN_NONE:
812
66.7k
        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
813
4.52k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
814
4.52k
        }
815
62.2k
        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
62.2k
        if (h->sub_loop_counter != 1) {
820
11.1k
          h->space = 32;
821
11.1k
          h->repeat = 0;  /* num_codes */
822
11.1k
          memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) *
823
11.1k
              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
824
11.1k
          memset(&h->code_length_code_lengths[0], 0,
825
11.1k
              sizeof(h->code_length_code_lengths));
826
11.1k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
827
11.1k
          continue;
828
11.1k
        }
829
      /* Fall through. */
830
831
58.1k
      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
832
        /* Read symbols, codes & code lengths directly. */
833
58.1k
        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
834
7.22k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
835
7.22k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
836
7.22k
        }
837
50.9k
        h->sub_loop_counter = 0;
838
      /* Fall through. */
839
840
77.1k
      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
841
77.1k
        BrotliDecoderErrorCode result =
842
77.1k
            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
843
77.1k
        if (result != BROTLI_DECODER_SUCCESS) {
844
26.3k
          return result;
845
26.3k
        }
846
77.1k
      }
847
      /* Fall through. */
848
849
51.3k
      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
850
51.3k
        brotli_reg_t table_size;
851
51.3k
        if (h->symbol == 3) {
852
3.37k
          brotli_reg_t bits;
853
3.37k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
854
554
            h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
855
554
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
856
554
          }
857
2.82k
          h->symbol += bits;
858
2.82k
        }
859
50.8k
        BROTLI_LOG_UINT(h->symbol);
860
50.8k
        table_size = BrotliBuildSimpleHuffmanTable(table, HUFFMAN_TABLE_BITS,
861
50.8k
                                                   h->symbols_lists_array,
862
50.8k
                                                   (uint32_t)h->symbol);
863
50.8k
        if (opt_table_size) {
864
42.3k
          *opt_table_size = table_size;
865
42.3k
        }
866
50.8k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
867
50.8k
        return BROTLI_DECODER_SUCCESS;
868
51.3k
      }
869
870
      /* Decode Huffman-coded code lengths. */
871
18.5k
      case BROTLI_STATE_HUFFMAN_COMPLEX: {
872
18.5k
        brotli_reg_t i;
873
18.5k
        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
874
18.5k
        if (result != BROTLI_DECODER_SUCCESS) {
875
7.88k
          return result;
876
7.88k
        }
877
10.6k
        BrotliBuildCodeLengthsHuffmanTable(h->table,
878
10.6k
                                           h->code_length_code_lengths,
879
10.6k
                                           h->code_length_histo);
880
10.6k
        memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo));
881
181k
        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
882
171k
          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
883
171k
          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
884
171k
        }
885
886
10.6k
        h->symbol = 0;
887
10.6k
        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
888
10.6k
        h->repeat = 0;
889
10.6k
        h->repeat_code_len = 0;
890
10.6k
        h->space = 32768;
891
10.6k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
892
10.6k
      }
893
      /* Fall through. */
894
895
20.8k
      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
896
20.8k
        brotli_reg_t table_size;
897
20.8k
        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
898
20.8k
            alphabet_size_limit, s);
899
20.8k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
900
16.3k
          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
901
16.3k
        }
902
20.8k
        if (result != BROTLI_DECODER_SUCCESS) {
903
10.4k
          return result;
904
10.4k
        }
905
906
10.4k
        if (h->space != 0) {
907
240
          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
908
240
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
909
240
        }
910
10.2k
        table_size = BrotliBuildHuffmanTable(
911
10.2k
            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
912
10.2k
        if (opt_table_size) {
913
8.80k
          *opt_table_size = table_size;
914
8.80k
        }
915
10.2k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
916
10.2k
        return BROTLI_DECODER_SUCCESS;
917
10.4k
      }
918
919
0
      default:
920
0
        return
921
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
922
129k
    }
923
129k
  }
924
118k
}
925
926
/* Decodes a block length by reading 3..39 bits. */
927
static BROTLI_INLINE brotli_reg_t ReadBlockLength(const HuffmanCode* table,
928
226k
                                                  BrotliBitReader* br) {
929
226k
  brotli_reg_t code;
930
226k
  brotli_reg_t nbits;
931
226k
  code = ReadSymbol(table, br);
932
226k
  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
933
226k
  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
934
226k
}
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
119k
    BrotliBitReader* br) {
941
119k
  brotli_reg_t index;
942
119k
  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
943
117k
    if (!SafeReadSymbol(table, br, &index)) {
944
10.8k
      return BROTLI_FALSE;
945
10.8k
    }
946
117k
  } else {
947
2.10k
    index = s->block_length_index;
948
2.10k
  }
949
108k
  {
950
108k
    brotli_reg_t bits;
951
108k
    brotli_reg_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
952
108k
    brotli_reg_t offset = _kBrotliPrefixCodeRanges[index].offset;
953
108k
    if (!BrotliSafeReadBits(br, nbits, &bits)) {
954
24.5k
      s->block_length_index = index;
955
24.5k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
956
24.5k
      return BROTLI_FALSE;
957
24.5k
    }
958
84.3k
    *result = offset + bits;
959
84.3k
    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
960
84.3k
    return BROTLI_TRUE;
961
108k
  }
962
108k
}
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.19k
    uint8_t* v, brotli_reg_t v_len, BrotliDecoderState* state) {
980
  /* Reinitialize elements that could have been changed. */
981
1.19k
  brotli_reg_t i = 1;
982
1.19k
  brotli_reg_t upper_bound = state->mtf_upper_bound;
983
1.19k
  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
984
1.19k
  uint8_t* mtf_u8 = (uint8_t*)mtf;
985
  /* Load endian-aware constant. */
986
1.19k
  const uint8_t b0123[4] = {0, 1, 2, 3};
987
1.19k
  uint32_t pattern;
988
1.19k
  memcpy(&pattern, &b0123, 4);
989
990
  /* Initialize list using 4 consequent values pattern. */
991
1.19k
  mtf[0] = pattern;
992
26.8k
  do {
993
26.8k
    pattern += 0x04040404;  /* Advance all 4 values by 4. */
994
26.8k
    mtf[i] = pattern;
995
26.8k
    i++;
996
26.8k
  } while (i <= upper_bound);
997
998
  /* Transform the input. */
999
1.19k
  upper_bound = 0;
1000
174k
  for (i = 0; i < v_len; ++i) {
1001
173k
    int index = v[i];
1002
173k
    uint8_t value = mtf_u8[index];
1003
173k
    upper_bound |= v[i];
1004
173k
    v[i] = value;
1005
173k
    mtf_u8[-1] = value;
1006
1.37M
    do {
1007
1.37M
      index--;
1008
1.37M
      mtf_u8[index + 1] = mtf_u8[index];
1009
1.37M
    } while (index >= 0);
1010
173k
  }
1011
  /* Remember amount of elements to be reinitialized. */
1012
1.19k
  state->mtf_upper_bound = upper_bound >> 2;
1013
1.19k
}
1014
1015
/* Decodes a series of Huffman table using ReadHuffmanCode function. */
1016
static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
1017
84.0k
    HuffmanTreeGroup* group, BrotliDecoderState* s) {
1018
84.0k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1019
84.0k
  if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
1020
37.9k
    h->next = group->codes;
1021
37.9k
    h->htree_index = 0;
1022
37.9k
    h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
1023
37.9k
  }
1024
135k
  while (h->htree_index < group->num_htrees) {
1025
98.0k
    brotli_reg_t table_size;
1026
98.0k
    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
1027
98.0k
        group->alphabet_size_limit, h->next, &table_size, s);
1028
98.0k
    if (result != BROTLI_DECODER_SUCCESS) return result;
1029
51.1k
    group->htrees[h->htree_index] = h->next;
1030
51.1k
    h->next += table_size;
1031
51.1k
    ++h->htree_index;
1032
51.1k
  }
1033
37.1k
  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
1034
37.1k
  return BROTLI_DECODER_SUCCESS;
1035
84.0k
}
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
33.8k
                                               BrotliDecoderState* s) {
1049
33.8k
  BrotliBitReader* br = &s->br;
1050
33.8k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1051
33.8k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1052
1053
33.8k
  switch ((int)h->substate_context_map) {
1054
29.9k
    case BROTLI_STATE_CONTEXT_MAP_NONE:
1055
29.9k
      result = DecodeVarLenUint8(s, br, num_htrees);
1056
29.9k
      if (result != BROTLI_DECODER_SUCCESS) {
1057
3.65k
        return result;
1058
3.65k
      }
1059
26.3k
      (*num_htrees)++;
1060
26.3k
      h->context_index = 0;
1061
26.3k
      BROTLI_LOG_UINT(context_map_size);
1062
26.3k
      BROTLI_LOG_UINT(*num_htrees);
1063
26.3k
      *context_map_arg =
1064
26.3k
          (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
1065
26.3k
      if (*context_map_arg == 0) {
1066
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
1067
0
      }
1068
26.3k
      if (*num_htrees <= 1) {
1069
24.1k
        memset(*context_map_arg, 0, (size_t)context_map_size);
1070
24.1k
        return BROTLI_DECODER_SUCCESS;
1071
24.1k
      }
1072
2.14k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
1073
    /* Fall through. */
1074
1075
2.74k
    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
1076
2.74k
      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.74k
      if (!BrotliSafeGetBits(br, 5, &bits)) {
1080
626
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1081
626
      }
1082
2.11k
      if ((bits & 1) != 0) { /* Use RLE for zeros. */
1083
846
        h->max_run_length_prefix = (bits >> 1) + 1;
1084
846
        BrotliDropBits(br, 5);
1085
1.26k
      } else {
1086
1.26k
        h->max_run_length_prefix = 0;
1087
1.26k
        BrotliDropBits(br, 1);
1088
1.26k
      }
1089
2.11k
      BROTLI_LOG_UINT(h->max_run_length_prefix);
1090
2.11k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
1091
2.11k
    }
1092
    /* Fall through. */
1093
1094
3.59k
    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
1095
3.59k
      brotli_reg_t alphabet_size = *num_htrees + h->max_run_length_prefix;
1096
3.59k
      result = ReadHuffmanCode(alphabet_size, alphabet_size,
1097
3.59k
                               h->context_map_table, NULL, s);
1098
3.59k
      if (result != BROTLI_DECODER_SUCCESS) return result;
1099
2.01k
      h->code = 0xFFFF;
1100
2.01k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
1101
2.01k
    }
1102
    /* Fall through. */
1103
1104
3.28k
    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
1105
3.28k
      brotli_reg_t context_index = h->context_index;
1106
3.28k
      brotli_reg_t max_run_length_prefix = h->max_run_length_prefix;
1107
3.28k
      uint8_t* context_map = *context_map_arg;
1108
3.28k
      brotli_reg_t code = h->code;
1109
3.28k
      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
1110
218k
      while (context_index < context_map_size || skip_preamble) {
1111
216k
        if (!skip_preamble) {
1112
216k
          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
1113
967
            h->code = 0xFFFF;
1114
967
            h->context_index = context_index;
1115
967
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1116
967
          }
1117
215k
          BROTLI_LOG_UINT(code);
1118
1119
215k
          if (code == 0) {
1120
11.5k
            context_map[context_index++] = 0;
1121
11.5k
            continue;
1122
11.5k
          }
1123
203k
          if (code > max_run_length_prefix) {
1124
200k
            context_map[context_index++] =
1125
200k
                (uint8_t)(code - max_run_length_prefix);
1126
200k
            continue;
1127
200k
          }
1128
203k
        } else {
1129
357
          skip_preamble = BROTLI_FALSE;
1130
357
        }
1131
        /* RLE sub-stage. */
1132
3.40k
        {
1133
3.40k
          brotli_reg_t reps;
1134
3.40k
          if (!BrotliSafeReadBits(br, code, &reps)) {
1135
385
            h->code = code;
1136
385
            h->context_index = context_index;
1137
385
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1138
385
          }
1139
3.01k
          reps += (brotli_reg_t)1U << code;
1140
3.01k
          BROTLI_LOG_UINT(reps);
1141
3.01k
          if (context_index + reps > context_map_size) {
1142
35
            return
1143
35
                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
1144
35
          }
1145
27.4k
          do {
1146
27.4k
            context_map[context_index++] = 0;
1147
27.4k
          } while (--reps);
1148
2.98k
        }
1149
2.98k
      }
1150
3.28k
    }
1151
    /* Fall through. */
1152
1153
2.40k
    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1154
2.40k
      brotli_reg_t bits;
1155
2.40k
      if (!BrotliSafeReadBits(br, 1, &bits)) {
1156
521
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
1157
521
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1158
521
      }
1159
1.88k
      if (bits != 0) {
1160
1.19k
        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
1161
1.19k
      }
1162
1.88k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
1163
1.88k
      return BROTLI_DECODER_SUCCESS;
1164
2.40k
    }
1165
1166
0
    default:
1167
0
      return
1168
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1169
33.8k
  }
1170
33.8k
}
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
350k
    int safe, BrotliDecoderState* s, int tree_type) {
1176
350k
  brotli_reg_t max_block_type = s->num_block_types[tree_type];
1177
350k
  const HuffmanCode* type_tree = &s->block_type_trees[
1178
350k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
1179
350k
  const HuffmanCode* len_tree = &s->block_len_trees[
1180
350k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1181
350k
  BrotliBitReader* br = &s->br;
1182
350k
  brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1183
350k
  brotli_reg_t block_type;
1184
350k
  if (max_block_type <= 1) {
1185
1
    return BROTLI_FALSE;
1186
1
  }
1187
1188
  /* Read 0..15 + 3..39 bits. */
1189
350k
  if (!safe) {
1190
226k
    block_type = ReadSymbol(type_tree, br);
1191
226k
    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1192
226k
  } else {
1193
124k
    BrotliBitReaderState memento;
1194
124k
    BrotliBitReaderSaveState(br, &memento);
1195
124k
    if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE;
1196
112k
    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1197
32.1k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1198
32.1k
      BrotliBitReaderRestoreState(br, &memento);
1199
32.1k
      return BROTLI_FALSE;
1200
32.1k
    }
1201
112k
  }
1202
1203
307k
  if (block_type == 1) {
1204
72.3k
    block_type = ringbuffer[1] + 1;
1205
235k
  } else if (block_type == 0) {
1206
14.4k
    block_type = ringbuffer[0];
1207
220k
  } else {
1208
220k
    block_type -= 2;
1209
220k
  }
1210
307k
  if (block_type >= max_block_type) {
1211
12.0k
    block_type -= max_block_type;
1212
12.0k
  }
1213
307k
  ringbuffer[0] = ringbuffer[1];
1214
307k
  ringbuffer[1] = block_type;
1215
307k
  return BROTLI_TRUE;
1216
350k
}
1217
1218
static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
1219
13.1k
    BrotliDecoderState* s) {
1220
13.1k
  size_t i;
1221
118k
  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1222
38.2k
  for (i = 0; i < s->num_block_types[0]; i++) {
1223
25.1k
    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1224
25.1k
    size_t error = 0;
1225
25.1k
    size_t sample = s->context_map[offset];
1226
25.1k
    size_t j;
1227
427k
    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1228
      /* NOLINTNEXTLINE(bugprone-macro-repeated-side-effects) */
1229
401k
      BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
1230
401k
    }
1231
25.1k
    if (error == 0) {
1232
22.3k
      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1233
22.3k
    }
1234
25.1k
  }
1235
13.1k
}
1236
1237
70.4k
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1238
70.4k
  uint8_t context_mode;
1239
70.4k
  size_t trivial;
1240
70.4k
  brotli_reg_t block_type = s->block_type_rb[1];
1241
70.4k
  brotli_reg_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1242
70.4k
  s->context_map_slice = s->context_map + context_offset;
1243
70.4k
  trivial = s->trivial_literal_contexts[block_type >> 5];
1244
70.4k
  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1245
70.4k
  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1246
70.4k
  context_mode = s->context_modes[block_type] & 3;
1247
70.4k
  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
1248
70.4k
}
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
85.7k
    int safe, BrotliDecoderState* s) {
1254
85.7k
  if (!DecodeBlockTypeAndLength(safe, s, 0)) {
1255
27.4k
    return BROTLI_FALSE;
1256
27.4k
  }
1257
58.2k
  PrepareLiteralDecoding(s);
1258
58.2k
  return BROTLI_TRUE;
1259
85.7k
}
1260
1261
19.3k
static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1262
19.3k
  DecodeLiteralBlockSwitchInternal(0, s);
1263
19.3k
}
1264
1265
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch(
1266
66.4k
    BrotliDecoderState* s) {
1267
66.4k
  return DecodeLiteralBlockSwitchInternal(1, s);
1268
66.4k
}
1269
1270
/* Block switch for insert/copy length.
1271
   Reads 3..54 bits. */
1272
static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal(
1273
209k
    int safe, BrotliDecoderState* s) {
1274
209k
  if (!DecodeBlockTypeAndLength(safe, s, 1)) {
1275
5.83k
    return BROTLI_FALSE;
1276
5.83k
  }
1277
203k
  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
1278
203k
  return BROTLI_TRUE;
1279
209k
}
1280
1281
182k
static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1282
182k
  DecodeCommandBlockSwitchInternal(0, s);
1283
182k
}
1284
1285
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch(
1286
26.6k
    BrotliDecoderState* s) {
1287
26.6k
  return DecodeCommandBlockSwitchInternal(1, s);
1288
26.6k
}
1289
1290
/* Block switch for distance codes.
1291
   Reads 3..54 bits. */
1292
static BROTLI_INLINE BROTLI_BOOL DecodeDistanceBlockSwitchInternal(
1293
56.1k
    int safe, BrotliDecoderState* s) {
1294
56.1k
  if (!DecodeBlockTypeAndLength(safe, s, 2)) {
1295
10.2k
    return BROTLI_FALSE;
1296
10.2k
  }
1297
45.8k
  s->dist_context_map_slice = s->dist_context_map +
1298
45.8k
      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
1299
45.8k
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1300
45.8k
  return BROTLI_TRUE;
1301
56.1k
}
1302
1303
25.1k
static void BROTLI_NOINLINE DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
1304
25.1k
  DecodeDistanceBlockSwitchInternal(0, s);
1305
25.1k
}
1306
1307
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
1308
30.9k
    BrotliDecoderState* s) {
1309
30.9k
  return DecodeDistanceBlockSwitchInternal(1, s);
1310
30.9k
}
1311
1312
5.98M
static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
1313
5.98M
  size_t pos = wrap && s->pos > s->ringbuffer_size ?
1314
5.68M
      (size_t)s->ringbuffer_size : (size_t)(s->pos);
1315
5.98M
  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
1316
5.98M
  return partial_pos_rb - s->partial_pos_out;
1317
5.98M
}
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
5.98M
    size_t* total_out, BROTLI_BOOL force) {
1325
5.98M
  uint8_t* start =
1326
5.98M
      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
1327
5.98M
  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1328
5.98M
  size_t num_written = *available_out;
1329
5.98M
  if (num_written > to_write) {
1330
2.30M
    num_written = to_write;
1331
2.30M
  }
1332
5.98M
  if (s->meta_block_remaining_len < 0) {
1333
241
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
1334
241
  }
1335
5.98M
  if (next_out && !*next_out) {
1336
0
    *next_out = start;
1337
5.98M
  } else {
1338
5.98M
    if (next_out) {
1339
5.98M
      memcpy(*next_out, start, num_written);
1340
5.98M
      *next_out += num_written;
1341
5.98M
    }
1342
5.98M
  }
1343
5.98M
  *available_out -= num_written;
1344
5.98M
  BROTLI_LOG_UINT(to_write);
1345
5.98M
  BROTLI_LOG_UINT(num_written);
1346
5.98M
  s->partial_pos_out += num_written;
1347
5.98M
  if (total_out) {
1348
5.98M
    *total_out = s->partial_pos_out;
1349
5.98M
  }
1350
5.98M
  if (num_written < to_write) {
1351
3.44M
    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
1352
3.44M
      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
1353
3.44M
    } else {
1354
72
      return BROTLI_DECODER_SUCCESS;
1355
72
    }
1356
3.44M
  }
1357
  /* Wrap ring buffer only if it has reached its maximal size. */
1358
2.53M
  if (s->ringbuffer_size == (1 << s->window_bits) &&
1359
2.53M
      s->pos >= s->ringbuffer_size) {
1360
390k
    s->pos -= s->ringbuffer_size;
1361
390k
    s->rb_roundtrips++;
1362
390k
    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1363
390k
  }
1364
2.53M
  return BROTLI_DECODER_SUCCESS;
1365
5.98M
}
1366
1367
389k
static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1368
389k
  if (s->should_wrap_ringbuffer) {
1369
30.5k
    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1370
30.5k
    s->should_wrap_ringbuffer = 0;
1371
30.5k
  }
1372
389k
}
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
121k
    BrotliDecoderState* s) {
1383
121k
  uint8_t* old_ringbuffer = s->ringbuffer;
1384
121k
  if (s->ringbuffer_size == s->new_ringbuffer_size) {
1385
117k
    return BROTLI_TRUE;
1386
117k
  }
1387
1388
3.81k
  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
1389
3.81k
      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
1390
3.81k
  if (s->ringbuffer == 0) {
1391
    /* Restore previous value. */
1392
0
    s->ringbuffer = old_ringbuffer;
1393
0
    return BROTLI_FALSE;
1394
0
  }
1395
3.81k
  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1396
3.81k
  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
1397
1398
3.81k
  if (!!old_ringbuffer) {
1399
258
    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1400
258
    BROTLI_DECODER_FREE(s, old_ringbuffer);
1401
258
  }
1402
1403
3.81k
  s->ringbuffer_size = s->new_ringbuffer_size;
1404
3.81k
  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1405
3.81k
  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1406
1407
3.81k
  return BROTLI_TRUE;
1408
3.81k
}
1409
1410
static BrotliDecoderErrorCode BROTLI_NOINLINE
1411
7.55k
SkipMetadataBlock(BrotliDecoderState* s) {
1412
7.55k
  BrotliBitReader* br = &s->br;
1413
7.55k
  int nbytes;
1414
1415
7.55k
  if (s->meta_block_remaining_len == 0) {
1416
2.52k
    return BROTLI_DECODER_SUCCESS;
1417
2.52k
  }
1418
1419
5.03k
  BROTLI_DCHECK((BrotliGetAvailableBits(br) & 7) == 0);
1420
1421
  /* Drain accumulator. */
1422
5.03k
  if (BrotliGetAvailableBits(br) >= 8) {
1423
631
    uint8_t buffer[8];
1424
631
    nbytes = (int)(BrotliGetAvailableBits(br)) >> 3;
1425
631
    BROTLI_DCHECK(nbytes <= 8);
1426
631
    if (nbytes > s->meta_block_remaining_len) {
1427
334
      nbytes = s->meta_block_remaining_len;
1428
334
    }
1429
631
    BrotliCopyBytes(buffer, br, (size_t)nbytes);
1430
631
    if (s->metadata_chunk_func) {
1431
0
      s->metadata_chunk_func(s->metadata_callback_opaque, buffer,
1432
0
                             (size_t)nbytes);
1433
0
    }
1434
631
    s->meta_block_remaining_len -= nbytes;
1435
631
    if (s->meta_block_remaining_len == 0) {
1436
350
      return BROTLI_DECODER_SUCCESS;
1437
350
    }
1438
631
  }
1439
1440
  /* Direct access to metadata is possible. */
1441
4.68k
  nbytes = (int)BrotliGetRemainingBytes(br);
1442
4.68k
  if (nbytes > s->meta_block_remaining_len) {
1443
746
    nbytes = s->meta_block_remaining_len;
1444
746
  }
1445
4.68k
  if (nbytes > 0) {
1446
4.37k
    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.37k
    BrotliDropBytes(br, (size_t)nbytes);
1451
4.37k
    s->meta_block_remaining_len -= nbytes;
1452
4.37k
    if (s->meta_block_remaining_len == 0) {
1453
988
      return BROTLI_DECODER_SUCCESS;
1454
988
    }
1455
4.37k
  }
1456
1457
3.69k
  BROTLI_DCHECK(BrotliGetRemainingBytes(br) == 0);
1458
1459
3.69k
  return BROTLI_DECODER_NEEDS_MORE_INPUT;
1460
4.68k
}
1461
1462
static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1463
    size_t* available_out, uint8_t** next_out, size_t* total_out,
1464
109k
    BrotliDecoderState* s) {
1465
  /* TODO(eustas): avoid allocation for single uncompressed block. */
1466
109k
  if (!BrotliEnsureRingBuffer(s)) {
1467
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
1468
0
  }
1469
1470
  /* State machine */
1471
110k
  for (;;) {
1472
110k
    switch (s->substate_uncompressed) {
1473
89.7k
      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1474
89.7k
        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1475
89.7k
        if (nbytes > s->meta_block_remaining_len) {
1476
2.30k
          nbytes = s->meta_block_remaining_len;
1477
2.30k
        }
1478
89.7k
        if (s->pos + nbytes > s->ringbuffer_size) {
1479
1.21k
          nbytes = s->ringbuffer_size - s->pos;
1480
1.21k
        }
1481
        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1482
89.7k
        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1483
89.7k
        s->pos += nbytes;
1484
89.7k
        s->meta_block_remaining_len -= nbytes;
1485
89.7k
        if (s->pos < 1 << s->window_bits) {
1486
88.2k
          if (s->meta_block_remaining_len == 0) {
1487
2.48k
            return BROTLI_DECODER_SUCCESS;
1488
2.48k
          }
1489
85.7k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
1490
88.2k
        }
1491
1.57k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1492
1.57k
      }
1493
      /* Fall through. */
1494
1495
22.5k
      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1496
22.5k
        BrotliDecoderErrorCode result;
1497
22.5k
        result = WriteRingBuffer(
1498
22.5k
            s, available_out, next_out, total_out, BROTLI_FALSE);
1499
22.5k
        if (result != BROTLI_DECODER_SUCCESS) {
1500
20.9k
          return result;
1501
20.9k
        }
1502
1.57k
        if (s->ringbuffer_size == 1 << s->window_bits) {
1503
1.57k
          s->max_distance = s->max_backward_distance;
1504
1.57k
        }
1505
1.57k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1506
1.57k
        break;
1507
22.5k
      }
1508
110k
    }
1509
110k
  }
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
4.67M
static int GetCompoundDictionarySize(BrotliDecoderState* s) {
1574
4.67M
  return s->compound_dictionary ? s->compound_dictionary->total_size : 0;
1575
4.67M
}
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
16.7k
    BrotliDecoderState* s) {
1630
16.7k
  int window_size = 1 << s->window_bits;
1631
16.7k
  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
16.7k
  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
1635
16.7k
  int output_size;
1636
1637
  /* If maximum is already reached, no further extension is retired. */
1638
16.7k
  if (s->ringbuffer_size == window_size) {
1639
6.94k
    return;
1640
6.94k
  }
1641
1642
  /* Metadata blocks does not touch ring buffer. */
1643
9.77k
  if (s->is_metadata) {
1644
0
    return;
1645
0
  }
1646
1647
9.77k
  if (!s->ringbuffer) {
1648
5.09k
    output_size = 0;
1649
5.09k
  } else {
1650
4.68k
    output_size = s->pos;
1651
4.68k
  }
1652
9.77k
  output_size += s->meta_block_remaining_len;
1653
9.77k
  min_size = min_size < output_size ? output_size : min_size;
1654
1655
9.77k
  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
46.8k
    while ((new_ringbuffer_size >> 1) >= min_size) {
1660
37.0k
      new_ringbuffer_size >>= 1;
1661
37.0k
    }
1662
9.77k
  }
1663
1664
9.77k
  s->new_ringbuffer_size = new_ringbuffer_size;
1665
9.77k
}
1666
1667
/* Reads 1..256 2-bit context modes. */
1668
15.2k
static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1669
15.2k
  BrotliBitReader* br = &s->br;
1670
15.2k
  int i = s->loop_counter;
1671
1672
41.7k
  while (i < (int)s->num_block_types[0]) {
1673
28.4k
    brotli_reg_t bits;
1674
28.4k
    if (!BrotliSafeReadBits(br, 2, &bits)) {
1675
1.90k
      s->loop_counter = i;
1676
1.90k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1677
1.90k
    }
1678
26.5k
    s->context_modes[i] = (uint8_t)bits;
1679
26.5k
    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1680
26.5k
    i++;
1681
26.5k
  }
1682
13.3k
  return BROTLI_DECODER_SUCCESS;
1683
15.2k
}
1684
1685
138M
static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1686
138M
  int offset = s->distance_code - 3;
1687
138M
  if (s->distance_code <= 3) {
1688
    /* Compensate double distance-ring-buffer roll for dictionary items. */
1689
59.7M
    s->distance_context = 1 >> s->distance_code;
1690
59.7M
    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
1691
59.7M
    s->dist_rb_idx -= s->distance_context;
1692
78.9M
  } else {
1693
78.9M
    int index_delta = 3;
1694
78.9M
    int delta;
1695
78.9M
    int base = s->distance_code - 10;
1696
78.9M
    if (s->distance_code < 10) {
1697
42.4M
      base = s->distance_code - 4;
1698
42.4M
    } else {
1699
36.4M
      index_delta = 2;
1700
36.4M
    }
1701
    /* Unpack one of six 4-bit values. */
1702
78.9M
    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
1703
78.9M
    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
1704
78.9M
    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
37
      s->distance_code = 0x7FFFFFFF;
1708
37
    }
1709
78.9M
  }
1710
138M
}
1711
1712
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1713
868M
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1714
868M
  if (n_bits != 0) {
1715
221k
    return BrotliSafeReadBits(br, n_bits, val);
1716
868M
  } else {
1717
868M
    *val = 0;
1718
868M
    return BROTLI_TRUE;
1719
868M
  }
1720
868M
}
1721
1722
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
1723
89.5M
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1724
89.5M
  if (n_bits != 0) {
1725
27.6k
    return BrotliSafeReadBits32(br, n_bits, val);
1726
89.5M
  } else {
1727
89.5M
    *val = 0;
1728
89.5M
    return BROTLI_TRUE;
1729
89.5M
  }
1730
89.5M
}
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
12.1k
static void CalculateDistanceLut(BrotliDecoderState* s) {
1800
12.1k
  BrotliMetablockBodyArena* b = &s->arena.body;
1801
12.1k
  brotli_reg_t npostfix = s->distance_postfix_bits;
1802
12.1k
  brotli_reg_t ndirect = s->num_direct_distance_codes;
1803
12.1k
  brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
1804
12.1k
  brotli_reg_t postfix = (brotli_reg_t)1u << npostfix;
1805
12.1k
  brotli_reg_t j;
1806
12.1k
  brotli_reg_t bits = 1;
1807
12.1k
  brotli_reg_t half = 0;
1808
1809
  /* Skip short codes. */
1810
12.1k
  brotli_reg_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
1811
1812
  /* Fill direct codes. */
1813
423k
  for (j = 0; j < ndirect; ++j) {
1814
411k
    b->dist_extra_bits[i] = 0;
1815
411k
    b->dist_offset[i] = j + 1;
1816
411k
    ++i;
1817
411k
  }
1818
1819
  /* Fill regular distance codes. */
1820
597k
  while (i < alphabet_size_limit) {
1821
585k
    brotli_reg_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
1822
    /* Always fill the complete group. */
1823
3.03M
    for (j = 0; j < postfix; ++j) {
1824
2.44M
      b->dist_extra_bits[i] = (uint8_t)bits;
1825
2.44M
      b->dist_offset[i] = base + j;
1826
2.44M
      ++i;
1827
2.44M
    }
1828
585k
    bits = bits + half;
1829
585k
    half = half ^ 1;
1830
585k
  }
1831
12.1k
}
1832
1833
/* Precondition: s->distance_code < 0. */
1834
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
1835
269M
    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1836
269M
  BrotliMetablockBodyArena* b = &s->arena.body;
1837
269M
  brotli_reg_t code;
1838
269M
  brotli_reg_t bits;
1839
269M
  BrotliBitReaderState memento;
1840
269M
  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1841
269M
  if (!safe) {
1842
62.8M
    code = ReadSymbol(distance_tree, br);
1843
207M
  } else {
1844
207M
    BrotliBitReaderSaveState(br, &memento);
1845
207M
    if (!SafeReadSymbol(distance_tree, br, &code)) {
1846
27.3k
      return BROTLI_FALSE;
1847
27.3k
    }
1848
207M
  }
1849
269M
  --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
269M
  s->distance_context = 0;
1853
269M
  if ((code & ~0xFu) == 0) {
1854
138M
    s->distance_code = (int)code;
1855
138M
    TakeDistanceFromRingBuffer(s);
1856
138M
    return BROTLI_TRUE;
1857
138M
  }
1858
131M
  if (!safe) {
1859
41.6M
    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
1860
89.5M
  } else {
1861
89.5M
    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
1862
7.33k
      ++s->block_length[2];
1863
7.33k
      BrotliBitReaderRestoreState(br, &memento);
1864
7.33k
      return BROTLI_FALSE;
1865
7.33k
    }
1866
89.5M
  }
1867
131M
  s->distance_code =
1868
131M
      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
1869
131M
  return BROTLI_TRUE;
1870
131M
}
1871
1872
static BROTLI_INLINE void ReadDistance(
1873
62.8M
    BrotliDecoderState* s, BrotliBitReader* br) {
1874
62.8M
  ReadDistanceInternal(0, s, br);
1875
62.8M
}
1876
1877
static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
1878
207M
    BrotliDecoderState* s, BrotliBitReader* br) {
1879
207M
  return ReadDistanceInternal(1, s, br);
1880
207M
}
1881
1882
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
1883
588M
    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1884
588M
  brotli_reg_t cmd_code;
1885
588M
  brotli_reg_t insert_len_extra = 0;
1886
588M
  brotli_reg_t copy_length;
1887
588M
  CmdLutElement v;
1888
588M
  BrotliBitReaderState memento;
1889
588M
  if (!safe) {
1890
153M
    cmd_code = ReadSymbol(s->htree_command, br);
1891
434M
  } else {
1892
434M
    BrotliBitReaderSaveState(br, &memento);
1893
434M
    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
1894
20.2k
      return BROTLI_FALSE;
1895
20.2k
    }
1896
434M
  }
1897
588M
  v = kCmdLut[cmd_code];
1898
588M
  s->distance_code = v.distance_code;
1899
588M
  s->distance_context = v.context;
1900
588M
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1901
588M
  *insert_length = v.insert_len_offset;
1902
588M
  if (!safe) {
1903
153M
    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1904
51.4k
      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
1905
51.4k
    }
1906
153M
    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
1907
434M
  } else {
1908
434M
    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1909
434M
        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1910
50.4k
      BrotliBitReaderRestoreState(br, &memento);
1911
50.4k
      return BROTLI_FALSE;
1912
50.4k
    }
1913
434M
  }
1914
588M
  s->copy_length = (int)copy_length + v.copy_len_offset;
1915
588M
  --s->block_length[1];
1916
588M
  *insert_length += (int)insert_len_extra;
1917
588M
  return BROTLI_TRUE;
1918
588M
}
1919
1920
static BROTLI_INLINE void ReadCommand(
1921
153M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1922
153M
  ReadCommandInternal(0, s, br, insert_length);
1923
153M
}
1924
1925
static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
1926
434M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1927
434M
  return ReadCommandInternal(1, s, br, insert_length);
1928
434M
}
1929
1930
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
1931
1.03G
    int safe, BrotliBitReader* const br) {
1932
1.03G
  if (safe) {
1933
733M
    return BROTLI_TRUE;
1934
733M
  }
1935
304M
  return BrotliCheckInputAmount(br);
1936
1.03G
}
1937
1938
#define BROTLI_SAFE(METHOD)                       \
1939
858M
  {                                               \
1940
858M
    if (safe) {                                   \
1941
641M
      if (!Safe##METHOD) {                        \
1942
148k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
1943
148k
        goto saveStateAndReturn;                  \
1944
148k
      }                                           \
1945
641M
    } else {                                      \
1946
216M
      METHOD;                                     \
1947
216M
    }                                             \
1948
858M
  }
1949
1950
static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
1951
4.67M
    int safe, BrotliDecoderState* s) {
1952
4.67M
  int pos = s->pos;
1953
4.67M
  int i = s->loop_counter;
1954
4.67M
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1955
4.67M
  BrotliBitReader* br = &s->br;
1956
4.67M
  int compound_dictionary_size = GetCompoundDictionarySize(s);
1957
1958
4.67M
  if (!CheckInputAmount(safe, br)) {
1959
2.22M
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1960
2.22M
    goto saveStateAndReturn;
1961
2.22M
  }
1962
2.44M
  if (!safe) {
1963
190k
    BROTLI_UNUSED(BrotliWarmupBitReader(br));
1964
190k
  }
1965
1966
  /* Jump into state machine. */
1967
2.44M
  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
1968
135k
    goto CommandBegin;
1969
2.31M
  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
1970
1.95M
    goto CommandInner;
1971
1.95M
  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
1972
66.2k
    goto CommandPostDecodeLiterals;
1973
293k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
1974
293k
    goto CommandPostWrapCopy;
1975
293k
  } else {
1976
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1977
0
  }
1978
1979
588M
CommandBegin:
1980
588M
  if (safe) {
1981
434M
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1982
434M
  }
1983
588M
  if (!CheckInputAmount(safe, br)) {
1984
10.4k
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1985
10.4k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1986
10.4k
    goto saveStateAndReturn;
1987
10.4k
  }
1988
588M
  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
1989
209k
    BROTLI_SAFE(DecodeCommandBlockSwitch(s));
1990
203k
    goto CommandBegin;
1991
209k
  }
1992
  /* Read the insert/copy length in the command. */
1993
588M
  BROTLI_SAFE(ReadCommand(s, br, &i));
1994
588M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
1995
588M
              pos, i, s->copy_length));
1996
588M
  if (i == 0) {
1997
195M
    goto CommandPostDecodeLiterals;
1998
195M
  }
1999
393M
  s->meta_block_remaining_len -= i;
2000
2001
395M
CommandInner:
2002
395M
  if (safe) {
2003
316M
    s->state = BROTLI_STATE_COMMAND_INNER;
2004
316M
  }
2005
  /* Read the literals in the command. */
2006
395M
  if (s->trivial_literal_context) {
2007
325M
    brotli_reg_t bits;
2008
325M
    brotli_reg_t value;
2009
325M
    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
2010
325M
    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
68.9M
      int num_steps = i - 1;
2018
68.9M
      if (num_steps > 0 && ((brotli_reg_t)(num_steps) > s->block_length[0])) {
2019
        // Safe cast, since block_length < steps
2020
17.2k
        num_steps = (int)s->block_length[0];
2021
17.2k
      }
2022
68.9M
      if (s->ringbuffer_size >= pos &&
2023
68.9M
          (s->ringbuffer_size - pos) <= num_steps) {
2024
11.7k
        num_steps = s->ringbuffer_size - pos - 1;
2025
11.7k
      }
2026
68.9M
      if (num_steps < 0) {
2027
0
        num_steps = 0;
2028
0
      }
2029
68.9M
      num_steps = BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits,
2030
68.9M
                                                 &value, s->ringbuffer, pos,
2031
68.9M
                                                 num_steps);
2032
68.9M
      pos += num_steps;
2033
68.9M
      s->block_length[0] -= (brotli_reg_t)num_steps;
2034
68.9M
      i -= num_steps;
2035
68.9M
      do {
2036
68.9M
        if (!CheckInputAmount(safe, br)) {
2037
15.2k
          s->state = BROTLI_STATE_COMMAND_INNER;
2038
15.2k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2039
15.2k
          goto saveStateAndReturn;
2040
15.2k
        }
2041
68.9M
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2042
19.1k
          goto NextLiteralBlock;
2043
19.1k
        }
2044
68.9M
        BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, &value,
2045
68.9M
                                       s->ringbuffer, pos, 1);
2046
68.9M
        --s->block_length[0];
2047
68.9M
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2048
68.9M
        ++pos;
2049
68.9M
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2050
15.2k
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2051
15.2k
          --i;
2052
15.2k
          goto saveStateAndReturn;
2053
15.2k
        }
2054
68.9M
      } while (--i != 0);
2055
256M
    } else { /* safe */
2056
1.37G
      do {
2057
1.37G
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2058
46.8k
          goto NextLiteralBlock;
2059
46.8k
        }
2060
1.37G
        brotli_reg_t literal;
2061
1.37G
        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
2062
1.86M
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2063
1.86M
          goto saveStateAndReturn;
2064
1.86M
        }
2065
1.37G
        s->ringbuffer[pos] = (uint8_t)literal;
2066
1.37G
        --s->block_length[0];
2067
1.37G
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2068
1.37G
        ++pos;
2069
1.37G
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2070
33.6k
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2071
33.6k
          --i;
2072
33.6k
          goto saveStateAndReturn;
2073
33.6k
        }
2074
1.37G
      } while (--i != 0);
2075
256M
    }
2076
325M
  } else {
2077
69.8M
    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2078
69.8M
    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2079
375M
    do {
2080
375M
      const HuffmanCode* hc;
2081
375M
      uint8_t context;
2082
375M
      if (!CheckInputAmount(safe, br)) {
2083
5.26k
        s->state = BROTLI_STATE_COMMAND_INNER;
2084
5.26k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2085
5.26k
        goto saveStateAndReturn;
2086
5.26k
      }
2087
375M
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2088
19.8k
        goto NextLiteralBlock;
2089
19.8k
      }
2090
375M
      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
2091
375M
      BROTLI_LOG_UINT(context);
2092
375M
      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
2093
375M
      p2 = p1;
2094
375M
      if (!safe) {
2095
78.9M
        p1 = (uint8_t)ReadSymbol(hc, br);
2096
296M
      } else {
2097
296M
        brotli_reg_t literal;
2098
296M
        if (!SafeReadSymbol(hc, br, &literal)) {
2099
1.00k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2100
1.00k
          goto saveStateAndReturn;
2101
1.00k
        }
2102
296M
        p1 = (uint8_t)literal;
2103
296M
      }
2104
375M
      s->ringbuffer[pos] = p1;
2105
375M
      --s->block_length[0];
2106
375M
      BROTLI_LOG_UINT(s->context_map_slice[context]);
2107
375M
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
2108
375M
      ++pos;
2109
375M
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2110
9.74k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2111
9.74k
        --i;
2112
9.74k
        goto saveStateAndReturn;
2113
9.74k
      }
2114
375M
    } while (--i != 0);
2115
69.8M
  }
2116
393M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2117
393M
  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
2118
3.69k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2119
3.69k
    goto saveStateAndReturn;
2120
3.69k
  }
2121
2122
588M
CommandPostDecodeLiterals:
2123
588M
  if (safe) {
2124
434M
    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2125
434M
  }
2126
588M
  if (s->distance_code >= 0) {
2127
    /* Implicit distance case. */
2128
318M
    s->distance_context = s->distance_code ? 0 : 1;
2129
318M
    --s->dist_rb_idx;
2130
318M
    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
2131
318M
  } else {
2132
    /* Read distance code in the command, unless it was implicitly zero. */
2133
269M
    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
2134
56.1k
      BROTLI_SAFE(DecodeDistanceBlockSwitch(s));
2135
45.8k
    }
2136
269M
    BROTLI_SAFE(ReadDistance(s, br));
2137
269M
  }
2138
588M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
2139
588M
              pos, s->distance_code));
2140
588M
  if (s->max_distance != s->max_backward_distance) {
2141
174M
    s->max_distance =
2142
174M
        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
2143
174M
  }
2144
588M
  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
588M
  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
60.4M
    if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
2152
37
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2153
37
          "len: %d bytes left: %d\n",
2154
37
          pos, s->distance_code, i, s->meta_block_remaining_len));
2155
37
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
2156
37
    }
2157
60.4M
    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
60.4M
    } else if (i >= SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
2169
60.4M
               i <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
2170
60.4M
      uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2171
60.4M
      uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2172
60.4M
      uint8_t dict_id = s->dictionary->context_based ?
2173
0
          s->dictionary->context_map[BROTLI_CONTEXT(p1, p2, s->context_lookup)]
2174
60.4M
          : 0;
2175
60.4M
      const BrotliDictionary* words = s->dictionary->words[dict_id];
2176
60.4M
      const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
2177
60.4M
      int offset = (int)words->offsets_by_length[i];
2178
60.4M
      brotli_reg_t shift = words->size_bits_by_length[i];
2179
60.4M
      int address =
2180
60.4M
          s->distance_code - s->max_distance - 1 - compound_dictionary_size;
2181
60.4M
      int mask = (int)BitMask(shift);
2182
60.4M
      int word_idx = address & mask;
2183
60.4M
      int transform_idx = address >> shift;
2184
      /* Compensate double distance-ring-buffer roll. */
2185
60.4M
      s->dist_rb_idx += s->distance_context;
2186
60.4M
      offset += word_idx * i;
2187
      /* If the distance is out of bound, select a next static dictionary if
2188
         there exist multiple. */
2189
60.4M
      if ((transform_idx >= (int)transforms->num_transforms ||
2190
60.4M
          words->size_bits_by_length[i] == 0) &&
2191
60.4M
          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
60.4M
      if (BROTLI_PREDICT_FALSE(words->size_bits_by_length[i] == 0)) {
2221
81
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2222
81
            "len: %d bytes left: %d\n",
2223
81
            pos, s->distance_code, i, s->meta_block_remaining_len));
2224
81
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2225
81
      }
2226
60.4M
      if (BROTLI_PREDICT_FALSE(!words->data)) {
2227
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
2228
0
      }
2229
60.4M
      if (transform_idx < (int)transforms->num_transforms) {
2230
60.4M
        const uint8_t* word = &words->data[offset];
2231
60.4M
        int len = i;
2232
60.4M
        if (transform_idx == transforms->cutOffTransforms[0]) {
2233
60.3M
          memcpy(&s->ringbuffer[pos], word, (size_t)len);
2234
60.3M
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
2235
60.3M
                      len, word));
2236
60.3M
        } else {
2237
31.0k
          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
2238
31.0k
              transforms, transform_idx);
2239
31.0k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
2240
31.0k
                      " transform_idx = %d, transformed: [%.*s]\n",
2241
31.0k
                      i, word, transform_idx, len, &s->ringbuffer[pos]));
2242
31.0k
          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
31.0k
        }
2247
60.4M
        pos += len;
2248
60.4M
        s->meta_block_remaining_len -= len;
2249
60.4M
        if (pos >= s->ringbuffer_size) {
2250
37.2k
          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
2251
37.2k
          goto saveStateAndReturn;
2252
37.2k
        }
2253
60.4M
      } else {
2254
95
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2255
95
            "len: %d bytes left: %d\n",
2256
95
            pos, s->distance_code, i, s->meta_block_remaining_len));
2257
95
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
2258
95
      }
2259
60.4M
    } else {
2260
127
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2261
127
          "len: %d bytes left: %d\n",
2262
127
          pos, s->distance_code, i, s->meta_block_remaining_len));
2263
127
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2264
127
    }
2265
527M
  } else {
2266
527M
    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
2267
527M
    uint8_t* copy_dst = &s->ringbuffer[pos];
2268
527M
    uint8_t* copy_src = &s->ringbuffer[src_start];
2269
527M
    int dst_end = pos + i;
2270
527M
    int src_end = src_start + i;
2271
    /* Update the recent distances cache. */
2272
527M
    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
2273
527M
    ++s->dist_rb_idx;
2274
527M
    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
527M
    memmove16(copy_dst, copy_src);
2279
527M
    if (src_end > pos && dst_end > src_start) {
2280
      /* Regions intersect. */
2281
117M
      goto CommandPostWrapCopy;
2282
117M
    }
2283
409M
    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
2284
      /* At least one region wraps. */
2285
544k
      goto CommandPostWrapCopy;
2286
544k
    }
2287
409M
    pos += i;
2288
409M
    if (i > 16) {
2289
365k
      if (i > 32) {
2290
19.7k
        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
2291
345k
      } else {
2292
        /* This branch covers about 45% cases.
2293
           Fixed size short copy allows more compiler optimizations. */
2294
345k
        memmove16(copy_dst + 16, copy_src + 16);
2295
345k
      }
2296
365k
    }
2297
409M
  }
2298
469M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2299
469M
  if (s->meta_block_remaining_len <= 0) {
2300
    /* Next metablock, if any. */
2301
3.04k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2302
3.04k
    goto saveStateAndReturn;
2303
469M
  } else {
2304
469M
    goto CommandBegin;
2305
469M
  }
2306
118M
CommandPostWrapCopy:
2307
118M
  {
2308
118M
    int wrap_guard = s->ringbuffer_size - pos;
2309
1.77G
    while (--i >= 0) {
2310
1.65G
      s->ringbuffer[pos] =
2311
1.65G
          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
2312
1.65G
      ++pos;
2313
1.65G
      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
2314
293k
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
2315
293k
        goto saveStateAndReturn;
2316
293k
      }
2317
1.65G
    }
2318
118M
  }
2319
118M
  if (s->meta_block_remaining_len <= 0) {
2320
    /* Next metablock, if any. */
2321
2.41k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2322
2.41k
    goto saveStateAndReturn;
2323
118M
  } else {
2324
118M
    goto CommandBegin;
2325
118M
  }
2326
2327
85.7k
NextLiteralBlock:
2328
85.7k
  BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
2329
58.2k
  goto CommandInner;
2330
2331
4.67M
saveStateAndReturn:
2332
4.67M
  s->pos = pos;
2333
4.67M
  s->loop_counter = i;
2334
4.67M
  return result;
2335
85.7k
}
2336
2337
#undef BROTLI_SAFE
2338
2339
static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
2340
2.41M
    BrotliDecoderState* s) {
2341
2.41M
  return ProcessCommandsInternal(0, s);
2342
2.41M
}
2343
2344
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
2345
2.25M
    BrotliDecoderState* s) {
2346
2.25M
  return ProcessCommandsInternal(1, s);
2347
2.25M
}
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
5.60M
    size_t* available_out, uint8_t** next_out, size_t* total_out) {
2388
5.60M
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2389
5.60M
  BrotliBitReader* br = &s->br;
2390
5.60M
  size_t input_size = *available_in;
2391
5.60M
#define BROTLI_SAVE_ERROR_CODE(code) \
2392
5.60M
    SaveErrorCode(s, (code), input_size - *available_in)
2393
  /* Ensure that |total_out| is set, even if no data will ever be pushed out. */
2394
5.60M
  if (total_out) {
2395
5.60M
    *total_out = s->partial_pos_out;
2396
5.60M
  }
2397
  /* Do not try to process further in a case of unrecoverable error. */
2398
5.60M
  if ((int)s->error_code < 0) {
2399
0
    return BROTLI_DECODER_RESULT_ERROR;
2400
0
  }
2401
5.60M
  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
5.60M
  if (!*available_out) next_out = 0;
2406
5.60M
  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
2407
5.58M
    BrotliBitReaderSetInput(br, *next_in, *available_in);
2408
5.58M
  } 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
17.0k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2413
17.0k
    BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
2414
17.0k
  }
2415
  /* State machine */
2416
12.1M
  for (;;) {
2417
12.1M
    if (result != BROTLI_DECODER_SUCCESS) {
2418
      /* Error, needs more input/output. */
2419
5.63M
      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2420
2.21M
        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
2421
2.17M
          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
2422
2.17M
              available_out, next_out, total_out, BROTLI_TRUE);
2423
          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
2424
2.17M
          if ((int)intermediate_result < 0) {
2425
20
            result = intermediate_result;
2426
20
            break;
2427
20
          }
2428
2.17M
        }
2429
2.21M
        if (s->buffer_length != 0) {  /* Used with internal buffer. */
2430
33.1k
          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
13.3k
            s->buffer_length = 0;
2435
            /* Switch to input stream and restart. */
2436
13.3k
            result = BROTLI_DECODER_SUCCESS;
2437
13.3k
            BrotliBitReaderSetInput(br, *next_in, *available_in);
2438
13.3k
            continue;
2439
19.7k
          } else if (*available_in != 0) {
2440
            /* Not enough data in buffer, but can take one more byte from
2441
               input stream. */
2442
17.2k
            result = BROTLI_DECODER_SUCCESS;
2443
17.2k
            BROTLI_DCHECK(s->buffer_length < 8);
2444
17.2k
            s->buffer.u8[s->buffer_length] = **next_in;
2445
17.2k
            s->buffer_length++;
2446
17.2k
            BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
2447
17.2k
            (*next_in)++;
2448
17.2k
            (*available_in)--;
2449
            /* Retry with more data in buffer. */
2450
17.2k
            continue;
2451
17.2k
          }
2452
          /* Can't finish reading and no more input. */
2453
2.54k
          break;
2454
2.18M
        } else {  /* Input stream doesn't contain enough input. */
2455
          /* Copy tail to internal buffer and return. */
2456
2.18M
          *next_in = br->next_in;
2457
2.18M
          *available_in = BrotliBitReaderGetAvailIn(br);
2458
2.19M
          while (*available_in) {
2459
15.0k
            s->buffer.u8[s->buffer_length] = **next_in;
2460
15.0k
            s->buffer_length++;
2461
15.0k
            (*next_in)++;
2462
15.0k
            (*available_in)--;
2463
15.0k
          }
2464
2.18M
          break;
2465
2.18M
        }
2466
        /* Unreachable. */
2467
2.21M
      }
2468
2469
      /* Fail or needs more output. */
2470
2471
3.42M
      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.13k
        s->buffer_length = 0;
2475
3.42M
      } 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.42M
        BrotliBitReaderUnload(br);
2480
3.42M
        *available_in = BrotliBitReaderGetAvailIn(br);
2481
3.42M
        *next_in = br->next_in;
2482
3.42M
      }
2483
3.42M
      break;
2484
5.63M
    }
2485
6.52M
    switch (s->state) {
2486
5.34k
      case BROTLI_STATE_UNINITED:
2487
        /* Prepare to the first read. */
2488
5.34k
        if (!BrotliWarmupBitReader(br)) {
2489
0
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2490
0
          break;
2491
0
        }
2492
        /* Decode window size. */
2493
5.34k
        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
2494
5.34k
        if (result != BROTLI_DECODER_SUCCESS) {
2495
1
          break;
2496
1
        }
2497
5.34k
        if (s->large_window) {
2498
0
          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
2499
0
          break;
2500
0
        }
2501
5.34k
        s->state = BROTLI_STATE_INITIALIZE;
2502
5.34k
        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.34k
      case BROTLI_STATE_INITIALIZE:
2521
5.34k
        BROTLI_LOG_UINT(s->window_bits);
2522
        /* Maximum distance, see section 9.1. of the spec. */
2523
5.34k
        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.34k
        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
2527
5.34k
            sizeof(HuffmanCode) * 3 *
2528
5.34k
                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2529
5.34k
        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.34k
        s->block_len_trees =
2534
5.34k
            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
2535
2536
5.34k
        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2537
      /* Fall through. */
2538
2539
21.1k
      case BROTLI_STATE_METABLOCK_BEGIN:
2540
21.1k
        BrotliDecoderStateMetablockBegin(s);
2541
21.1k
        BROTLI_LOG_UINT(s->pos);
2542
21.1k
        s->state = BROTLI_STATE_METABLOCK_HEADER;
2543
      /* Fall through. */
2544
2545
37.9k
      case BROTLI_STATE_METABLOCK_HEADER:
2546
37.9k
        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
2547
37.9k
        if (result != BROTLI_DECODER_SUCCESS) {
2548
17.0k
          break;
2549
17.0k
        }
2550
20.9k
        BROTLI_LOG_UINT(s->is_last_metablock);
2551
20.9k
        BROTLI_LOG_UINT(s->meta_block_remaining_len);
2552
20.9k
        BROTLI_LOG_UINT(s->is_metadata);
2553
20.9k
        BROTLI_LOG_UINT(s->is_uncompressed);
2554
20.9k
        if (s->is_metadata || s->is_uncompressed) {
2555
6.78k
          if (!BrotliJumpToByteBoundary(br)) {
2556
59
            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
2557
59
            break;
2558
59
          }
2559
6.78k
        }
2560
20.8k
        if (s->is_metadata) {
2561
4.04k
          s->state = BROTLI_STATE_METADATA;
2562
4.04k
          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
4.04k
          break;
2567
4.04k
        }
2568
16.8k
        if (s->meta_block_remaining_len == 0) {
2569
82
          s->state = BROTLI_STATE_METABLOCK_DONE;
2570
82
          break;
2571
82
        }
2572
16.7k
        BrotliCalculateRingBufferSize(s);
2573
16.7k
        if (s->is_uncompressed) {
2574
2.68k
          s->state = BROTLI_STATE_UNCOMPRESSED;
2575
2.68k
          break;
2576
2.68k
        }
2577
14.0k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER;
2578
      /* Fall through. */
2579
2580
14.0k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: {
2581
14.0k
        BrotliMetablockHeaderArena* h = &s->arena.header;
2582
14.0k
        s->loop_counter = 0;
2583
        /* Initialize compressed metablock header arena. */
2584
14.0k
        h->sub_loop_counter = 0;
2585
        /* Make small negative indexes addressable. */
2586
14.0k
        h->symbol_lists =
2587
14.0k
            &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
2588
14.0k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
2589
14.0k
        h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
2590
14.0k
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
2591
14.0k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2592
14.0k
      }
2593
      /* Fall through. */
2594
2595
56.5k
      case BROTLI_STATE_HUFFMAN_CODE_0:
2596
56.5k
        if (s->loop_counter >= 3) {
2597
13.4k
          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
2598
13.4k
          break;
2599
13.4k
        }
2600
        /* Reads 1..11 bits. */
2601
43.0k
        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
2602
43.0k
        if (result != BROTLI_DECODER_SUCCESS) {
2603
1.89k
          break;
2604
1.89k
        }
2605
41.1k
        s->num_block_types[s->loop_counter]++;
2606
41.1k
        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2607
41.1k
        if (s->num_block_types[s->loop_counter] < 2) {
2608
36.8k
          s->loop_counter++;
2609
36.8k
          break;
2610
36.8k
        }
2611
4.37k
        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2612
      /* Fall through. */
2613
2614
7.67k
      case BROTLI_STATE_HUFFMAN_CODE_1: {
2615
7.67k
        brotli_reg_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
2616
7.67k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2617
7.67k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2618
7.67k
            &s->block_type_trees[tree_offset], NULL, s);
2619
7.67k
        if (result != BROTLI_DECODER_SUCCESS) break;
2620
4.01k
        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2621
4.01k
      }
2622
      /* Fall through. */
2623
2624
8.86k
      case BROTLI_STATE_HUFFMAN_CODE_2: {
2625
8.86k
        brotli_reg_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
2626
8.86k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2627
8.86k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2628
8.86k
            &s->block_len_trees[tree_offset], NULL, s);
2629
8.86k
        if (result != BROTLI_DECODER_SUCCESS) break;
2630
3.85k
        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2631
3.85k
      }
2632
      /* Fall through. */
2633
2634
7.02k
      case BROTLI_STATE_HUFFMAN_CODE_3: {
2635
7.02k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2636
7.02k
        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2637
7.02k
            &s->block_len_trees[tree_offset], br)) {
2638
3.22k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2639
3.22k
          break;
2640
3.22k
        }
2641
3.80k
        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2642
3.80k
        s->loop_counter++;
2643
3.80k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2644
3.80k
        break;
2645
7.02k
      }
2646
2647
109k
      case BROTLI_STATE_UNCOMPRESSED: {
2648
109k
        result = CopyUncompressedBlockToOutput(
2649
109k
            available_out, next_out, total_out, s);
2650
109k
        if (result != BROTLI_DECODER_SUCCESS) {
2651
106k
          break;
2652
106k
        }
2653
2.48k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2654
2.48k
        break;
2655
109k
      }
2656
2657
7.55k
      case BROTLI_STATE_METADATA:
2658
7.55k
        result = SkipMetadataBlock(s);
2659
7.55k
        if (result != BROTLI_DECODER_SUCCESS) {
2660
3.69k
          break;
2661
3.69k
        }
2662
3.86k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2663
3.86k
        break;
2664
2665
18.6k
      case BROTLI_STATE_METABLOCK_HEADER_2: {
2666
18.6k
        brotli_reg_t bits;
2667
18.6k
        if (!BrotliSafeReadBits(br, 6, &bits)) {
2668
5.32k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2669
5.32k
          break;
2670
5.32k
        }
2671
13.3k
        s->distance_postfix_bits = bits & BitMask(2);
2672
13.3k
        bits >>= 2;
2673
13.3k
        s->num_direct_distance_codes = bits << s->distance_postfix_bits;
2674
13.3k
        BROTLI_LOG_UINT(s->num_direct_distance_codes);
2675
13.3k
        BROTLI_LOG_UINT(s->distance_postfix_bits);
2676
13.3k
        s->context_modes =
2677
13.3k
            (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
2678
13.3k
        if (s->context_modes == 0) {
2679
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
2680
0
          break;
2681
0
        }
2682
13.3k
        s->loop_counter = 0;
2683
13.3k
        s->state = BROTLI_STATE_CONTEXT_MODES;
2684
13.3k
      }
2685
      /* Fall through. */
2686
2687
15.2k
      case BROTLI_STATE_CONTEXT_MODES:
2688
15.2k
        result = ReadContextModes(s);
2689
15.2k
        if (result != BROTLI_DECODER_SUCCESS) {
2690
1.90k
          break;
2691
1.90k
        }
2692
13.3k
        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2693
      /* Fall through. */
2694
2695
18.9k
      case BROTLI_STATE_CONTEXT_MAP_1:
2696
18.9k
        result = DecodeContextMap(
2697
18.9k
            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2698
18.9k
            &s->num_literal_htrees, &s->context_map, s);
2699
18.9k
        if (result != BROTLI_DECODER_SUCCESS) {
2700
5.78k
          break;
2701
5.78k
        }
2702
13.1k
        DetectTrivialLiteralBlockTypes(s);
2703
13.1k
        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2704
      /* Fall through. */
2705
2706
14.9k
      case BROTLI_STATE_CONTEXT_MAP_2: {
2707
14.9k
        brotli_reg_t npostfix = s->distance_postfix_bits;
2708
14.9k
        brotli_reg_t ndirect = s->num_direct_distance_codes;
2709
14.9k
        brotli_reg_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2710
14.9k
            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
2711
14.9k
        brotli_reg_t distance_alphabet_size_limit = distance_alphabet_size_max;
2712
14.9k
        BROTLI_BOOL allocation_success = BROTLI_TRUE;
2713
14.9k
        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.9k
        result = DecodeContextMap(
2722
14.9k
            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2723
14.9k
            &s->num_dist_htrees, &s->dist_context_map, s);
2724
14.9k
        if (result != BROTLI_DECODER_SUCCESS) {
2725
1.99k
          break;
2726
1.99k
        }
2727
12.9k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2728
12.9k
            s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
2729
12.9k
            BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
2730
12.9k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2731
12.9k
            s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
2732
12.9k
            BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
2733
12.9k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2734
12.9k
            s, &s->distance_hgroup, distance_alphabet_size_max,
2735
12.9k
            distance_alphabet_size_limit, s->num_dist_htrees);
2736
12.9k
        if (!allocation_success) {
2737
0
          return BROTLI_SAVE_ERROR_CODE(
2738
0
              BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
2739
0
        }
2740
12.9k
        s->loop_counter = 0;
2741
12.9k
        s->state = BROTLI_STATE_TREE_GROUP;
2742
12.9k
      }
2743
      /* Fall through. */
2744
2745
84.0k
      case BROTLI_STATE_TREE_GROUP: {
2746
84.0k
        HuffmanTreeGroup* hgroup = NULL;
2747
84.0k
        switch (s->loop_counter) {
2748
26.6k
          case 0: hgroup = &s->literal_hgroup; break;
2749
26.2k
          case 1: hgroup = &s->insert_copy_hgroup; break;
2750
31.1k
          case 2: hgroup = &s->distance_hgroup; break;
2751
0
          default: return BROTLI_SAVE_ERROR_CODE(BROTLI_FAILURE(
2752
84.0k
              BROTLI_DECODER_ERROR_UNREACHABLE));  /* COV_NF_LINE */
2753
84.0k
        }
2754
84.0k
        result = HuffmanTreeGroupDecode(hgroup, s);
2755
84.0k
        if (result != BROTLI_DECODER_SUCCESS) break;
2756
37.1k
        s->loop_counter++;
2757
37.1k
        if (s->loop_counter < 3) {
2758
24.9k
          break;
2759
24.9k
        }
2760
12.1k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY;
2761
12.1k
      }
2762
      /* Fall through. */
2763
2764
12.1k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY:
2765
12.1k
        PrepareLiteralDecoding(s);
2766
12.1k
        s->dist_context_map_slice = s->dist_context_map;
2767
12.1k
        s->htree_command = s->insert_copy_hgroup.htrees[0];
2768
12.1k
        if (!BrotliEnsureRingBuffer(s)) {
2769
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
2770
0
          break;
2771
0
        }
2772
12.1k
        CalculateDistanceLut(s);
2773
12.1k
        s->state = BROTLI_STATE_COMMAND_BEGIN;
2774
      /* Fall through. */
2775
2776
125k
      case BROTLI_STATE_COMMAND_BEGIN:
2777
      /* Fall through. */
2778
2.05M
      case BROTLI_STATE_COMMAND_INNER:
2779
      /* Fall through. */
2780
2.12M
      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2781
      /* Fall through. */
2782
2.41M
      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2783
2.41M
        result = ProcessCommands(s);
2784
2.41M
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2785
2.25M
          result = SafeProcessCommands(s);
2786
2.25M
        }
2787
2.41M
        break;
2788
2789
1.36M
      case BROTLI_STATE_COMMAND_INNER_WRITE:
2790
      /* Fall through. */
2791
1.75M
      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2792
      /* Fall through. */
2793
3.58M
      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2794
3.58M
        result = WriteRingBuffer(
2795
3.58M
            s, available_out, next_out, total_out, BROTLI_FALSE);
2796
3.58M
        if (result != BROTLI_DECODER_SUCCESS) {
2797
3.19M
          break;
2798
3.19M
        }
2799
389k
        WrapRingBuffer(s);
2800
389k
        if (s->ringbuffer_size == 1 << s->window_bits) {
2801
389k
          s->max_distance = s->max_backward_distance;
2802
389k
        }
2803
389k
        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
2804
37.2k
          BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
2805
37.2k
          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
37.2k
          if (s->meta_block_remaining_len == 0) {
2810
            /* Next metablock, if any. */
2811
99
            s->state = BROTLI_STATE_METABLOCK_DONE;
2812
37.1k
          } else {
2813
37.1k
            s->state = BROTLI_STATE_COMMAND_BEGIN;
2814
37.1k
          }
2815
37.2k
          break;
2816
351k
        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2817
293k
          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2818
293k
        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2819
58.5k
          if (s->loop_counter == 0) {
2820
22.7k
            if (s->meta_block_remaining_len == 0) {
2821
830
              s->state = BROTLI_STATE_METABLOCK_DONE;
2822
21.8k
            } else {
2823
21.8k
              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2824
21.8k
            }
2825
22.7k
            break;
2826
22.7k
          }
2827
35.8k
          s->state = BROTLI_STATE_COMMAND_INNER;
2828
35.8k
        }
2829
329k
        break;
2830
2831
329k
      case BROTLI_STATE_METABLOCK_DONE:
2832
16.5k
        if (s->meta_block_remaining_len < 0) {
2833
531
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
2834
531
          break;
2835
531
        }
2836
15.9k
        BrotliDecoderStateCleanupAfterMetablock(s);
2837
15.9k
        if (!s->is_last_metablock) {
2838
15.8k
          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2839
15.8k
          break;
2840
15.8k
        }
2841
154
        if (!BrotliJumpToByteBoundary(br)) {
2842
36
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2843
36
          break;
2844
36
        }
2845
118
        if (s->buffer_length == 0) {
2846
115
          BrotliBitReaderUnload(br);
2847
115
          *available_in = BrotliBitReaderGetAvailIn(br);
2848
115
          *next_in = br->next_in;
2849
115
        }
2850
118
        s->state = BROTLI_STATE_DONE;
2851
      /* Fall through. */
2852
2853
206k
      case BROTLI_STATE_DONE:
2854
206k
        if (s->ringbuffer != 0) {
2855
206k
          result = WriteRingBuffer(
2856
206k
              s, available_out, next_out, total_out, BROTLI_TRUE);
2857
206k
          if (result != BROTLI_DECODER_SUCCESS) {
2858
206k
            break;
2859
206k
          }
2860
206k
        }
2861
118
        return BROTLI_SAVE_ERROR_CODE(result);
2862
6.52M
    }
2863
6.52M
  }
2864
5.60M
  return BROTLI_SAVE_ERROR_CODE(result);
2865
5.60M
#undef BROTLI_SAVE_ERROR_CODE
2866
5.60M
}
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 BrotliSafeReadSymbolForTest(
2944
    const HuffmanCode*, BrotliBitReader*, brotli_reg_t*);
2945
BROTLI_BOOL BrotliSafeReadSymbolForTest(
2946
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
2947
  return SafeReadSymbol(table, br, result);
2948
}
2949
void BrotliInverseMoveToFrontTransformForTest(
2950
    uint8_t*, brotli_reg_t, BrotliDecoderState*);
2951
void BrotliInverseMoveToFrontTransformForTest(
2952
    uint8_t* v, brotli_reg_t l, BrotliDecoderState* s) {
2953
  InverseMoveToFrontTransform(v, l, s);
2954
}
2955
#endif
2956
2957
#if defined(__cplusplus) || defined(c_plusplus)
2958
}  /* extern "C" */
2959
#endif