Coverage Report

Created: 2026-02-14 06:39

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