Coverage Report

Created: 2026-02-03 07:07

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.64k
#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.54G
#define HUFFMAN_TABLE_BITS 8U
39
5.27k
#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
5.15k
    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
81
5.15k
  BrotliDecoderState* state = 0;
82
5.15k
  if (!BrotliDecoderEnsureStaticInit()) {
83
0
    BROTLI_DUMP();
84
0
    return 0;
85
0
  }
86
5.15k
  if (!alloc_func && !free_func) {
87
5.15k
    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
88
5.15k
  } else if (alloc_func && free_func) {
89
0
    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
90
0
  }
91
5.15k
  if (state == 0) {
92
0
    BROTLI_DUMP();
93
0
    return 0;
94
0
  }
95
5.15k
  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
5.15k
  return state;
105
5.15k
}
106
107
/* Deinitializes and frees BrotliDecoderState instance. */
108
5.15k
void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
109
5.15k
  if (!state) {
110
0
    return;
111
5.15k
  } else {
112
5.15k
    brotli_free_func free_func = state->free_func;
113
5.15k
    void* opaque = state->memory_manager_opaque;
114
5.15k
    BrotliDecoderStateCleanup(state);
115
5.15k
    free_func(opaque, state);
116
5.15k
  }
117
5.15k
}
118
119
/* Saves error code and converts it to BrotliDecoderResult. */
120
static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
121
4.45M
    BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
122
4.45M
  s->error_code = (int)e;
123
4.45M
  s->used_input += consumed_input;
124
4.45M
  if ((s->buffer_length != 0) && (s->br.next_in == s->br.last_in)) {
125
    /* If internal buffer is depleted at last, reset it. */
126
1
    s->buffer_length = 0;
127
1
  }
128
4.45M
  switch (e) {
129
103
    case BROTLI_DECODER_SUCCESS:
130
103
      return BROTLI_DECODER_RESULT_SUCCESS;
131
132
1.15M
    case BROTLI_DECODER_NEEDS_MORE_INPUT:
133
1.15M
      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
134
135
3.29M
    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
136
3.29M
      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
137
138
1.64k
    default:
139
1.64k
      return BROTLI_DECODER_RESULT_ERROR;
140
4.45M
  }
141
4.45M
}
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
5.15k
                                               BrotliBitReader* br) {
147
5.15k
  brotli_reg_t n;
148
5.15k
  BROTLI_BOOL large_window = s->large_window;
149
5.15k
  s->large_window = BROTLI_FALSE;
150
5.15k
  BrotliTakeBits(br, 1, &n);
151
5.15k
  if (n == 0) {
152
3.60k
    s->window_bits = 16;
153
3.60k
    return BROTLI_DECODER_SUCCESS;
154
3.60k
  }
155
1.55k
  BrotliTakeBits(br, 3, &n);
156
1.55k
  if (n != 0) {
157
864
    s->window_bits = (17u + n) & 63u;
158
864
    return BROTLI_DECODER_SUCCESS;
159
864
  }
160
691
  BrotliTakeBits(br, 3, &n);
161
691
  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
690
  if (n != 0) {
174
623
    s->window_bits = (8u + n) & 63u;
175
623
    return BROTLI_DECODER_SUCCESS;
176
623
  }
177
67
  s->window_bits = 17;
178
67
  return BROTLI_DECODER_SUCCESS;
179
690
}
180
181
554M
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
554M
  uint32_t buffer[4];
186
554M
  memcpy(buffer, src, 16);
187
554M
  memcpy(dst, buffer, 16);
188
554M
#endif
189
554M
}
190
191
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
192
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
193
72.0k
    BrotliDecoderState* s, BrotliBitReader* br, brotli_reg_t* value) {
194
72.0k
  brotli_reg_t bits;
195
72.0k
  switch (s->substate_decode_uint8) {
196
70.6k
    case BROTLI_STATE_DECODE_UINT8_NONE:
197
70.6k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
198
3.66k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
199
3.66k
      }
200
66.9k
      if (bits == 0) {
201
60.5k
        *value = 0;
202
60.5k
        return BROTLI_DECODER_SUCCESS;
203
60.5k
      }
204
    /* Fall through. */
205
206
7.26k
    case BROTLI_STATE_DECODE_UINT8_SHORT:
207
7.26k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
208
865
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
209
865
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
210
865
      }
211
6.40k
      if (bits == 0) {
212
3.52k
        *value = 1;
213
3.52k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
214
3.52k
        return BROTLI_DECODER_SUCCESS;
215
3.52k
      }
216
      /* Use output value as a temporary storage. It MUST be persisted. */
217
2.87k
      *value = bits;
218
    /* Fall through. */
219
220
3.50k
    case BROTLI_STATE_DECODE_UINT8_LONG:
221
3.50k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
222
662
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
223
662
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
224
662
      }
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
72.0k
  }
233
72.0k
}
234
235
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
236
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
237
38.3k
    BrotliDecoderState* s, BrotliBitReader* br) {
238
38.3k
  brotli_reg_t bits;
239
38.3k
  int i;
240
62.0k
  for (;;) {
241
62.0k
    switch (s->substate_metablock_header) {
242
23.6k
      case BROTLI_STATE_METABLOCK_HEADER_NONE:
243
23.6k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
244
2.44k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
245
2.44k
        }
246
21.1k
        s->is_last_metablock = bits ? 1 : 0;
247
21.1k
        s->meta_block_remaining_len = 0;
248
21.1k
        s->is_uncompressed = 0;
249
21.1k
        s->is_metadata = 0;
250
21.1k
        if (!s->is_last_metablock) {
251
19.7k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
252
19.7k
          break;
253
19.7k
        }
254
1.42k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
255
      /* Fall through. */
256
257
1.43k
      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
258
1.43k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
259
24
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
260
24
        }
261
1.41k
        if (bits) {
262
55
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
263
55
          return BROTLI_DECODER_SUCCESS;
264
55
        }
265
1.35k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
266
      /* Fall through. */
267
268
22.0k
      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
269
22.0k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
270
1.01k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
271
1.01k
        }
272
21.0k
        s->size_nibbles = (uint8_t)(bits + 4);
273
21.0k
        s->loop_counter = 0;
274
21.0k
        if (bits == 3) {
275
3.99k
          s->is_metadata = 1;
276
3.99k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
277
3.99k
          break;
278
3.99k
        }
279
17.0k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
280
      /* Fall through. */
281
282
29.2k
      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
283
29.2k
        i = s->loop_counter;
284
99.7k
        for (; i < (int)s->size_nibbles; ++i) {
285
82.8k
          if (!BrotliSafeReadBits(br, 4, &bits)) {
286
12.2k
            s->loop_counter = i;
287
12.2k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
288
12.2k
          }
289
70.5k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
290
1.91k
              bits == 0) {
291
12
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
292
12
          }
293
70.5k
          s->meta_block_remaining_len |= (int)(bits << (i * 4));
294
70.5k
        }
295
16.9k
        s->substate_metablock_header =
296
16.9k
            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
297
      /* Fall through. */
298
299
17.4k
      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
300
17.4k
        if (!s->is_last_metablock) {
301
16.1k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
302
449
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
303
449
          }
304
15.7k
          s->is_uncompressed = bits ? 1 : 0;
305
15.7k
        }
306
16.9k
        ++s->meta_block_remaining_len;
307
16.9k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
308
16.9k
        return BROTLI_DECODER_SUCCESS;
309
310
4.46k
      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
311
4.46k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
312
473
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
313
473
        }
314
3.99k
        if (bits != 0) {
315
19
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
316
19
        }
317
3.97k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
318
      /* Fall through. */
319
320
4.22k
      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
321
4.22k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
322
264
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
323
264
        }
324
3.96k
        if (bits == 0) {
325
2.36k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
326
2.36k
          return BROTLI_DECODER_SUCCESS;
327
2.36k
        }
328
1.59k
        s->size_nibbles = (uint8_t)bits;
329
1.59k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
330
      /* Fall through. */
331
332
1.96k
      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
333
1.96k
        i = s->loop_counter;
334
3.99k
        for (; i < (int)s->size_nibbles; ++i) {
335
2.43k
          if (!BrotliSafeReadBits(br, 8, &bits)) {
336
396
            s->loop_counter = i;
337
396
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
338
396
          }
339
2.03k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
340
374
              bits == 0) {
341
2
            return BROTLI_FAILURE(
342
2
                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
343
2
          }
344
2.03k
          s->meta_block_remaining_len |= (int)(bits << (i * 8));
345
2.03k
        }
346
1.56k
        ++s->meta_block_remaining_len;
347
1.56k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
348
1.56k
        return BROTLI_DECODER_SUCCESS;
349
350
0
      default:
351
0
        return
352
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
353
62.0k
    }
354
62.0k
  }
355
38.3k
}
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.27G
                                               BrotliBitReader* br) {
364
1.27G
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
365
1.27G
  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
366
1.27G
  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
367
11.4k
    brotli_reg_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
368
11.4k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
369
11.4k
    BROTLI_HC_ADJUST_TABLE_INDEX(table,
370
11.4k
        BROTLI_HC_FAST_LOAD_VALUE(table) +
371
11.4k
        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
372
11.4k
  }
373
1.27G
  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
374
1.27G
  return BROTLI_HC_FAST_LOAD_VALUE(table);
375
1.27G
}
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
304M
                                             BrotliBitReader* br) {
381
304M
  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
382
304M
}
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.36G
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
388
1.36G
  brotli_reg_t val;
389
1.36G
  brotli_reg_t available_bits = BrotliGetAvailableBits(br);
390
1.36G
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
391
1.36G
  if (available_bits == 0) {
392
90.7M
    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
393
90.0M
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
394
90.0M
      return BROTLI_TRUE;
395
90.0M
    }
396
710k
    return BROTLI_FALSE;  /* No valid bits at all. */
397
90.7M
  }
398
1.27G
  val = BrotliGetBitsUnmasked(br);
399
1.27G
  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
400
1.27G
  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
401
1.27G
    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
402
1.27G
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
403
1.27G
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
404
1.27G
      return BROTLI_TRUE;
405
1.27G
    } else {
406
115k
      return BROTLI_FALSE;  /* Not enough bits for the first level. */
407
115k
    }
408
1.27G
  }
409
4.41k
  if (available_bits <= HUFFMAN_TABLE_BITS) {
410
3.31k
    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
411
3.31k
  }
412
413
  /* Speculatively drop HUFFMAN_TABLE_BITS. */
414
1.10k
  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
415
1.10k
  available_bits -= HUFFMAN_TABLE_BITS;
416
1.10k
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
417
1.10k
  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
418
199
    return BROTLI_FALSE;  /* Not enough bits for the second level. */
419
199
  }
420
421
902
  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
422
902
  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
423
902
  return BROTLI_TRUE;
424
1.10k
}
425
426
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
427
2.33G
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
428
2.33G
  brotli_reg_t val;
429
2.33G
  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
430
966M
    *result = DecodeSymbol(val, table, br);
431
966M
    return BROTLI_TRUE;
432
966M
  }
433
1.36G
  return SafeDecodeSymbol(table, br, result);
434
2.33G
}
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
661M
                                        brotli_reg_t* value) {
442
661M
  if (safe) {
443
260M
    return;
444
260M
  }
445
400M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
446
400M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
447
400M
  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
448
400M
  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
449
400M
}
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
329M
                                                  brotli_reg_t* value) {
457
329M
  brotli_reg_t result = *value;
458
329M
  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
459
5.27k
    brotli_reg_t val = BrotliGet16BitsUnmasked(br);
460
5.27k
    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
461
5.27k
    brotli_reg_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
462
5.27k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
463
5.27k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
464
5.27k
    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
465
5.27k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
466
5.27k
    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
467
329M
  } else {
468
329M
    BrotliDropBits(br, *bits);
469
329M
  }
470
329M
  PreloadSymbol(0, table, br, bits, value);
471
329M
  return result;
472
329M
}
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
143M
                                                        const int limit) {
484
  /* Calculate range where CheckInputAmount is always true.
485
     Start with the number of bytes we can read. */
486
143M
  int64_t new_lim = br->guard_in - br->next_in;
487
  /* Convert to bits, since symbols use variable number of bits. */
488
143M
  new_lim *= 8;
489
  /* At most 15 bits per symbol, so this is safe. */
490
143M
  new_lim /= 15;
491
143M
  const int kMaximalOverread = 4;
492
143M
  int pos_limit = limit;
493
143M
  int copies = 0;
494
143M
  if ((new_lim - kMaximalOverread) <= limit) {
495
    // Safe cast, since new_lim is already < num_steps
496
72.0M
    pos_limit = (int)(new_lim - kMaximalOverread);
497
72.0M
  }
498
143M
  if (pos_limit < 0) {
499
64.6M
    pos_limit = 0;
500
64.6M
  }
501
143M
  copies = pos_limit;
502
143M
  pos_limit += pos;
503
  /* Fast path, caller made sure it is safe to write,
504
     we verified that is is safe to read. */
505
259M
  for (; pos < pos_limit; pos++) {
506
115M
    BROTLI_DCHECK(BrotliCheckInputAmount(br));
507
115M
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
508
115M
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
509
115M
  }
510
  /* Do the remainder, caller made sure it is safe to write,
511
     we need to bverify that it is safe to read. */
512
356M
  while (BrotliCheckInputAmount(br) && copies < limit) {
513
213M
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
514
213M
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
515
213M
    pos++;
516
213M
    copies++;
517
213M
  }
518
143M
  return copies;
519
143M
}
520
521
76.0k
static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) {
522
76.0k
  brotli_reg_t result = 0;
523
661k
  while (x) {
524
585k
    x >>= 1;
525
585k
    ++result;
526
585k
  }
527
76.0k
  return result;
528
76.0k
}
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
76.0k
    BrotliDecoderState* s) {
536
  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
537
76.0k
  BrotliBitReader* br = &s->br;
538
76.0k
  BrotliMetablockHeaderArena* h = &s->arena.header;
539
76.0k
  brotli_reg_t max_bits = Log2Floor(alphabet_size_max - 1);
540
76.0k
  brotli_reg_t i = h->sub_loop_counter;
541
76.0k
  brotli_reg_t num_symbols = h->symbol;
542
145k
  while (i <= num_symbols) {
543
94.0k
    brotli_reg_t v;
544
94.0k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
545
24.8k
      h->sub_loop_counter = i;
546
24.8k
      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
547
24.8k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
548
24.8k
    }
549
69.2k
    if (v >= alphabet_size_limit) {
550
24
      return
551
24
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
552
24
    }
553
69.2k
    h->symbols_lists_array[i] = (uint16_t)v;
554
69.2k
    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
555
69.2k
    ++i;
556
69.2k
  }
557
558
69.1k
  for (i = 0; i < num_symbols; ++i) {
559
17.9k
    brotli_reg_t k = i + 1;
560
46.0k
    for (; k <= num_symbols; ++k) {
561
28.1k
      if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) {
562
16
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
563
16
      }
564
28.1k
    }
565
17.9k
  }
566
567
51.1k
  return BROTLI_DECODER_SUCCESS;
568
51.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
345k
    uint16_t* code_length_histo, int* next_symbol) {
580
345k
  *repeat = 0;
581
345k
  if (code_len != 0) {  /* code_len == 1..15 */
582
342k
    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
583
342k
    next_symbol[code_len] = (int)(*symbol);
584
342k
    *prev_code_len = code_len;
585
342k
    *space -= 32768U >> code_len;
586
342k
    code_length_histo[code_len]++;
587
342k
    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
588
342k
        (int)*symbol, (int)code_len));
589
342k
  }
590
345k
  (*symbol)++;
591
345k
}
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.60k
    uint16_t* code_length_histo, int* next_symbol) {
608
5.60k
  brotli_reg_t old_repeat;
609
5.60k
  brotli_reg_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
610
5.60k
  brotli_reg_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
611
5.60k
  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
612
3.64k
    new_len = *prev_code_len;
613
3.64k
    extra_bits = 2;
614
3.64k
  }
615
5.60k
  if (*repeat_code_len != new_len) {
616
1.45k
    *repeat = 0;
617
1.45k
    *repeat_code_len = new_len;
618
1.45k
  }
619
5.60k
  old_repeat = *repeat;
620
5.60k
  if (*repeat > 0) {
621
1.34k
    *repeat -= 2;
622
1.34k
    *repeat <<= extra_bits;
623
1.34k
  }
624
5.60k
  *repeat += repeat_delta + 3U;
625
5.60k
  repeat_delta = *repeat - old_repeat;
626
5.60k
  if (*symbol + repeat_delta > alphabet_size) {
627
109
    BROTLI_DUMP();
628
109
    *symbol = alphabet_size;
629
109
    *space = 0xFFFFF;
630
109
    return;
631
109
  }
632
5.49k
  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
633
5.49k
      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
634
5.49k
  if (*repeat_code_len != 0) {
635
3.60k
    brotli_reg_t last = *symbol + repeat_delta;
636
3.60k
    int next = next_symbol[*repeat_code_len];
637
48.5k
    do {
638
48.5k
      symbol_lists[next] = (uint16_t)*symbol;
639
48.5k
      next = (int)*symbol;
640
48.5k
    } while (++(*symbol) != last);
641
3.60k
    next_symbol[*repeat_code_len] = next;
642
3.60k
    *space -= repeat_delta << (15 - *repeat_code_len);
643
3.60k
    code_length_histo[*repeat_code_len] =
644
3.60k
        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
645
3.60k
  } else {
646
1.88k
    *symbol += repeat_delta;
647
1.88k
  }
648
5.49k
}
649
650
/* Reads and decodes symbol codelengths. */
651
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
652
18.8k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
653
18.8k
  BrotliBitReader* br = &s->br;
654
18.8k
  BrotliMetablockHeaderArena* h = &s->arena.header;
655
18.8k
  brotli_reg_t symbol = h->symbol;
656
18.8k
  brotli_reg_t repeat = h->repeat;
657
18.8k
  brotli_reg_t space = h->space;
658
18.8k
  brotli_reg_t prev_code_len = h->prev_code_len;
659
18.8k
  brotli_reg_t repeat_code_len = h->repeat_code_len;
660
18.8k
  uint16_t* symbol_lists = h->symbol_lists;
661
18.8k
  uint16_t* code_length_histo = h->code_length_histo;
662
18.8k
  int* next_symbol = h->next_symbol;
663
18.8k
  if (!BrotliWarmupBitReader(br)) {
664
659
    return BROTLI_DECODER_NEEDS_MORE_INPUT;
665
659
  }
666
200k
  while (symbol < alphabet_size && space > 0) {
667
196k
    const HuffmanCode* p = h->table;
668
196k
    brotli_reg_t code_len;
669
196k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
670
196k
    if (!BrotliCheckInputAmount(br)) {
671
13.2k
      h->symbol = symbol;
672
13.2k
      h->repeat = repeat;
673
13.2k
      h->prev_code_len = prev_code_len;
674
13.2k
      h->repeat_code_len = repeat_code_len;
675
13.2k
      h->space = space;
676
13.2k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
677
13.2k
    }
678
182k
    BrotliFillBitWindow16(br);
679
182k
    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
680
182k
        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
681
182k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
682
182k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
683
182k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
684
180k
      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
685
180k
          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
686
180k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
687
2.53k
      brotli_reg_t extra_bits =
688
2.53k
          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
689
2.53k
      brotli_reg_t repeat_delta =
690
2.53k
          BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
691
2.53k
      BrotliDropBits(br, extra_bits);
692
2.53k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
693
2.53k
          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
694
2.53k
          symbol_lists, code_length_histo, next_symbol);
695
2.53k
    }
696
182k
  }
697
4.86k
  h->space = space;
698
4.86k
  return BROTLI_DECODER_SUCCESS;
699
18.1k
}
700
701
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
702
13.9k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
703
13.9k
  BrotliBitReader* br = &s->br;
704
13.9k
  BrotliMetablockHeaderArena* h = &s->arena.header;
705
13.9k
  BROTLI_BOOL get_byte = BROTLI_FALSE;
706
201k
  while (h->symbol < alphabet_size && h->space > 0) {
707
195k
    const HuffmanCode* p = h->table;
708
195k
    brotli_reg_t code_len;
709
195k
    brotli_reg_t available_bits;
710
195k
    brotli_reg_t bits = 0;
711
195k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
712
195k
    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
713
187k
    get_byte = BROTLI_FALSE;
714
187k
    available_bits = BrotliGetAvailableBits(br);
715
187k
    if (available_bits != 0) {
716
147k
      bits = (uint32_t)BrotliGetBitsUnmasked(br);
717
147k
    }
718
187k
    BROTLI_HC_ADJUST_TABLE_INDEX(p,
719
187k
        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
720
187k
    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
721
17.2k
      get_byte = BROTLI_TRUE;
722
17.2k
      continue;
723
17.2k
    }
724
169k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
725
169k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
726
165k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
727
165k
      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
728
165k
          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
729
165k
          h->next_symbol);
730
165k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
731
4.59k
      brotli_reg_t extra_bits = code_len - 14U;
732
4.59k
      brotli_reg_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
733
4.59k
          BitMask(extra_bits);
734
4.59k
      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
735
1.52k
        get_byte = BROTLI_TRUE;
736
1.52k
        continue;
737
1.52k
      }
738
3.06k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
739
3.06k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
740
3.06k
          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
741
3.06k
          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
742
3.06k
          h->next_symbol);
743
3.06k
    }
744
169k
  }
745
5.67k
  return BROTLI_DECODER_SUCCESS;
746
13.9k
}
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
17.4k
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
751
17.4k
  BrotliBitReader* br = &s->br;
752
17.4k
  BrotliMetablockHeaderArena* h = &s->arena.header;
753
17.4k
  brotli_reg_t num_codes = h->repeat;
754
17.4k
  brotli_reg_t space = h->space;
755
17.4k
  brotli_reg_t i = h->sub_loop_counter;
756
85.5k
  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
757
84.6k
    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
758
84.6k
    brotli_reg_t ix;
759
84.6k
    brotli_reg_t v;
760
84.6k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
761
11.3k
      brotli_reg_t available_bits = BrotliGetAvailableBits(br);
762
11.3k
      if (available_bits != 0) {
763
6.97k
        ix = BrotliGetBitsUnmasked(br) & 0xF;
764
6.97k
      } else {
765
4.41k
        ix = 0;
766
4.41k
      }
767
11.3k
      if (kCodeLengthPrefixLength[ix] > available_bits) {
768
6.53k
        h->sub_loop_counter = i;
769
6.53k
        h->repeat = num_codes;
770
6.53k
        h->space = space;
771
6.53k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
772
6.53k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
773
6.53k
      }
774
11.3k
    }
775
78.0k
    v = kCodeLengthPrefixValue[ix];
776
78.0k
    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
777
78.0k
    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
778
78.0k
    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
779
78.0k
    if (v != 0) {
780
41.2k
      space = space - (32U >> v);
781
41.2k
      ++num_codes;
782
41.2k
      ++h->code_length_histo[v];
783
41.2k
      if (space - 1U >= 32U) {
784
        /* space is 0 or wrapped around. */
785
10.0k
        break;
786
10.0k
      }
787
41.2k
    }
788
78.0k
  }
789
10.8k
  if (!(num_codes == 1 || space == 0)) {
790
105
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
791
105
  }
792
10.7k
  return BROTLI_DECODER_SUCCESS;
793
10.8k
}
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
112k
                                              BrotliDecoderState* s) {
811
112k
  BrotliBitReader* br = &s->br;
812
112k
  BrotliMetablockHeaderArena* h = &s->arena.header;
813
  /* State machine. */
814
124k
  for (;;) {
815
124k
    switch (h->substate_huffman) {
816
66.5k
      case BROTLI_STATE_HUFFMAN_NONE:
817
66.5k
        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
818
3.97k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
819
3.97k
        }
820
62.5k
        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
62.5k
        if (h->sub_loop_counter != 1) {
825
11.1k
          h->space = 32;
826
11.1k
          h->repeat = 0;  /* num_codes */
827
11.1k
          memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) *
828
11.1k
              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
829
11.1k
          memset(&h->code_length_code_lengths[0], 0,
830
11.1k
              sizeof(h->code_length_code_lengths));
831
11.1k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
832
11.1k
          continue;
833
11.1k
        }
834
      /* Fall through. */
835
836
58.2k
      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
837
        /* Read symbols, codes & code lengths directly. */
838
58.2k
        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
839
6.93k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
840
6.93k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
841
6.93k
        }
842
51.3k
        h->sub_loop_counter = 0;
843
      /* Fall through. */
844
845
76.0k
      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
846
76.0k
        BrotliDecoderErrorCode result =
847
76.0k
            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
848
76.0k
        if (result != BROTLI_DECODER_SUCCESS) {
849
24.8k
          return result;
850
24.8k
        }
851
76.0k
      }
852
      /* Fall through. */
853
854
51.7k
      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
855
51.7k
        brotli_reg_t table_size;
856
51.7k
        if (h->symbol == 3) {
857
3.43k
          brotli_reg_t bits;
858
3.43k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
859
618
            h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
860
618
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
861
618
          }
862
2.81k
          h->symbol += bits;
863
2.81k
        }
864
51.1k
        BROTLI_LOG_UINT(h->symbol);
865
51.1k
        table_size = BrotliBuildSimpleHuffmanTable(table, HUFFMAN_TABLE_BITS,
866
51.1k
                                                   h->symbols_lists_array,
867
51.1k
                                                   (uint32_t)h->symbol);
868
51.1k
        if (opt_table_size) {
869
42.8k
          *opt_table_size = table_size;
870
42.8k
        }
871
51.1k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
872
51.1k
        return BROTLI_DECODER_SUCCESS;
873
51.7k
      }
874
875
      /* Decode Huffman-coded code lengths. */
876
17.4k
      case BROTLI_STATE_HUFFMAN_COMPLEX: {
877
17.4k
        brotli_reg_t i;
878
17.4k
        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
879
17.4k
        if (result != BROTLI_DECODER_SUCCESS) {
880
6.63k
          return result;
881
6.63k
        }
882
10.7k
        BrotliBuildCodeLengthsHuffmanTable(h->table,
883
10.7k
                                           h->code_length_code_lengths,
884
10.7k
                                           h->code_length_histo);
885
10.7k
        memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo));
886
183k
        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
887
172k
          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
888
172k
          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
889
172k
        }
890
891
10.7k
        h->symbol = 0;
892
10.7k
        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
893
10.7k
        h->repeat = 0;
894
10.7k
        h->repeat_code_len = 0;
895
10.7k
        h->space = 32768;
896
10.7k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
897
10.7k
      }
898
      /* Fall through. */
899
900
18.8k
      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
901
18.8k
        brotli_reg_t table_size;
902
18.8k
        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
903
18.8k
            alphabet_size_limit, s);
904
18.8k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
905
13.9k
          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
906
13.9k
        }
907
18.8k
        if (result != BROTLI_DECODER_SUCCESS) {
908
8.27k
          return result;
909
8.27k
        }
910
911
10.5k
        if (h->space != 0) {
912
243
          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
913
243
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
914
243
        }
915
10.3k
        table_size = BrotliBuildHuffmanTable(
916
10.3k
            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
917
10.3k
        if (opt_table_size) {
918
8.97k
          *opt_table_size = table_size;
919
8.97k
        }
920
10.3k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
921
10.3k
        return BROTLI_DECODER_SUCCESS;
922
10.5k
      }
923
924
0
      default:
925
0
        return
926
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
927
124k
    }
928
124k
  }
929
112k
}
930
931
/* Decodes a block length by reading 3..39 bits. */
932
static BROTLI_INLINE brotli_reg_t ReadBlockLength(const HuffmanCode* table,
933
93.3k
                                                  BrotliBitReader* br) {
934
93.3k
  brotli_reg_t code;
935
93.3k
  brotli_reg_t nbits;
936
93.3k
  code = ReadSymbol(table, br);
937
93.3k
  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
938
93.3k
  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
939
93.3k
}
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
96.3k
    BrotliBitReader* br) {
946
96.3k
  brotli_reg_t index;
947
96.3k
  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
948
94.5k
    if (!SafeReadSymbol(table, br, &index)) {
949
5.49k
      return BROTLI_FALSE;
950
5.49k
    }
951
94.5k
  } else {
952
1.78k
    index = s->block_length_index;
953
1.78k
  }
954
90.8k
  {
955
90.8k
    brotli_reg_t bits;
956
90.8k
    brotli_reg_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
957
90.8k
    brotli_reg_t offset = _kBrotliPrefixCodeRanges[index].offset;
958
90.8k
    if (!BrotliSafeReadBits(br, nbits, &bits)) {
959
21.6k
      s->block_length_index = index;
960
21.6k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
961
21.6k
      return BROTLI_FALSE;
962
21.6k
    }
963
69.2k
    *result = offset + bits;
964
69.2k
    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
965
69.2k
    return BROTLI_TRUE;
966
90.8k
  }
967
90.8k
}
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.18k
    uint8_t* v, brotli_reg_t v_len, BrotliDecoderState* state) {
985
  /* Reinitialize elements that could have been changed. */
986
1.18k
  brotli_reg_t i = 1;
987
1.18k
  brotli_reg_t upper_bound = state->mtf_upper_bound;
988
1.18k
  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
989
1.18k
  uint8_t* mtf_u8 = (uint8_t*)mtf;
990
  /* Load endian-aware constant. */
991
1.18k
  const uint8_t b0123[4] = {0, 1, 2, 3};
992
1.18k
  uint32_t pattern;
993
1.18k
  memcpy(&pattern, &b0123, 4);
994
995
  /* Initialize list using 4 consequent values pattern. */
996
1.18k
  mtf[0] = pattern;
997
23.0k
  do {
998
23.0k
    pattern += 0x04040404;  /* Advance all 4 values by 4. */
999
23.0k
    mtf[i] = pattern;
1000
23.0k
    i++;
1001
23.0k
  } while (i <= upper_bound);
1002
1003
  /* Transform the input. */
1004
1.18k
  upper_bound = 0;
1005
127k
  for (i = 0; i < v_len; ++i) {
1006
125k
    int index = v[i];
1007
125k
    uint8_t value = mtf_u8[index];
1008
125k
    upper_bound |= v[i];
1009
125k
    v[i] = value;
1010
125k
    mtf_u8[-1] = value;
1011
844k
    do {
1012
844k
      index--;
1013
844k
      mtf_u8[index + 1] = mtf_u8[index];
1014
844k
    } while (index >= 0);
1015
125k
  }
1016
  /* Remember amount of elements to be reinitialized. */
1017
1.18k
  state->mtf_upper_bound = upper_bound >> 2;
1018
1.18k
}
1019
1020
/* Decodes a series of Huffman table using ReadHuffmanCode function. */
1021
static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
1022
79.8k
    HuffmanTreeGroup* group, BrotliDecoderState* s) {
1023
79.8k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1024
79.8k
  if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
1025
37.9k
    h->next = group->codes;
1026
37.9k
    h->htree_index = 0;
1027
37.9k
    h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
1028
37.9k
  }
1029
131k
  while (h->htree_index < group->num_htrees) {
1030
94.3k
    brotli_reg_t table_size;
1031
94.3k
    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
1032
94.3k
        group->alphabet_size_limit, h->next, &table_size, s);
1033
94.3k
    if (result != BROTLI_DECODER_SUCCESS) return result;
1034
51.8k
    group->htrees[h->htree_index] = h->next;
1035
51.8k
    h->next += table_size;
1036
51.8k
    ++h->htree_index;
1037
51.8k
  }
1038
37.3k
  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
1039
37.3k
  return BROTLI_DECODER_SUCCESS;
1040
79.8k
}
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
33.7k
                                               BrotliDecoderState* s) {
1054
33.7k
  BrotliBitReader* br = &s->br;
1055
33.7k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1056
33.7k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1057
1058
33.7k
  switch ((int)h->substate_context_map) {
1059
29.6k
    case BROTLI_STATE_CONTEXT_MAP_NONE:
1060
29.6k
      result = DecodeVarLenUint8(s, br, num_htrees);
1061
29.6k
      if (result != BROTLI_DECODER_SUCCESS) {
1062
3.55k
        return result;
1063
3.55k
      }
1064
26.1k
      (*num_htrees)++;
1065
26.1k
      h->context_index = 0;
1066
26.1k
      BROTLI_LOG_UINT(context_map_size);
1067
26.1k
      BROTLI_LOG_UINT(*num_htrees);
1068
26.1k
      *context_map_arg =
1069
26.1k
          (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
1070
26.1k
      if (*context_map_arg == 0) {
1071
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
1072
0
      }
1073
26.1k
      if (*num_htrees <= 1) {
1074
24.0k
        memset(*context_map_arg, 0, (size_t)context_map_size);
1075
24.0k
        return BROTLI_DECODER_SUCCESS;
1076
24.0k
      }
1077
2.04k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
1078
    /* Fall through. */
1079
1080
2.83k
    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
1081
2.83k
      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
2.83k
      if (!BrotliSafeGetBits(br, 5, &bits)) {
1085
807
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1086
807
      }
1087
2.02k
      if ((bits & 1) != 0) { /* Use RLE for zeros. */
1088
783
        h->max_run_length_prefix = (bits >> 1) + 1;
1089
783
        BrotliDropBits(br, 5);
1090
1.24k
      } else {
1091
1.24k
        h->max_run_length_prefix = 0;
1092
1.24k
        BrotliDropBits(br, 1);
1093
1.24k
      }
1094
2.02k
      BROTLI_LOG_UINT(h->max_run_length_prefix);
1095
2.02k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
1096
2.02k
    }
1097
    /* Fall through. */
1098
1099
3.38k
    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
1100
3.38k
      brotli_reg_t alphabet_size = *num_htrees + h->max_run_length_prefix;
1101
3.38k
      result = ReadHuffmanCode(alphabet_size, alphabet_size,
1102
3.38k
                               h->context_map_table, NULL, s);
1103
3.38k
      if (result != BROTLI_DECODER_SUCCESS) return result;
1104
1.92k
      h->code = 0xFFFF;
1105
1.92k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
1106
1.92k
    }
1107
    /* Fall through. */
1108
1109
3.16k
    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
1110
3.16k
      brotli_reg_t context_index = h->context_index;
1111
3.16k
      brotli_reg_t max_run_length_prefix = h->max_run_length_prefix;
1112
3.16k
      uint8_t* context_map = *context_map_arg;
1113
3.16k
      brotli_reg_t code = h->code;
1114
3.16k
      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
1115
188k
      while (context_index < context_map_size || skip_preamble) {
1116
186k
        if (!skip_preamble) {
1117
186k
          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
1118
850
            h->code = 0xFFFF;
1119
850
            h->context_index = context_index;
1120
850
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1121
850
          }
1122
185k
          BROTLI_LOG_UINT(code);
1123
1124
185k
          if (code == 0) {
1125
13.3k
            context_map[context_index++] = 0;
1126
13.3k
            continue;
1127
13.3k
          }
1128
172k
          if (code > max_run_length_prefix) {
1129
169k
            context_map[context_index++] =
1130
169k
                (uint8_t)(code - max_run_length_prefix);
1131
169k
            continue;
1132
169k
          }
1133
172k
        } else {
1134
440
          skip_preamble = BROTLI_FALSE;
1135
440
        }
1136
        /* RLE sub-stage. */
1137
2.88k
        {
1138
2.88k
          brotli_reg_t reps;
1139
2.88k
          if (!BrotliSafeReadBits(br, code, &reps)) {
1140
471
            h->code = code;
1141
471
            h->context_index = context_index;
1142
471
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1143
471
          }
1144
2.40k
          reps += (brotli_reg_t)1U << code;
1145
2.40k
          BROTLI_LOG_UINT(reps);
1146
2.40k
          if (context_index + reps > context_map_size) {
1147
34
            return
1148
34
                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
1149
34
          }
1150
26.4k
          do {
1151
26.4k
            context_map[context_index++] = 0;
1152
26.4k
          } while (--reps);
1153
2.37k
        }
1154
2.37k
      }
1155
3.16k
    }
1156
    /* Fall through. */
1157
1158
2.52k
    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1159
2.52k
      brotli_reg_t bits;
1160
2.52k
      if (!BrotliSafeReadBits(br, 1, &bits)) {
1161
725
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
1162
725
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1163
725
      }
1164
1.79k
      if (bits != 0) {
1165
1.18k
        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
1166
1.18k
      }
1167
1.79k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
1168
1.79k
      return BROTLI_DECODER_SUCCESS;
1169
2.52k
    }
1170
1171
0
    default:
1172
0
      return
1173
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1174
33.7k
  }
1175
33.7k
}
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
193k
    int safe, BrotliDecoderState* s, int tree_type) {
1181
193k
  brotli_reg_t max_block_type = s->num_block_types[tree_type];
1182
193k
  const HuffmanCode* type_tree = &s->block_type_trees[
1183
193k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
1184
193k
  const HuffmanCode* len_tree = &s->block_len_trees[
1185
193k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1186
193k
  BrotliBitReader* br = &s->br;
1187
193k
  brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1188
193k
  brotli_reg_t block_type;
1189
193k
  if (max_block_type <= 1) {
1190
1
    return BROTLI_FALSE;
1191
1
  }
1192
1193
  /* Read 0..15 + 3..39 bits. */
1194
193k
  if (!safe) {
1195
93.3k
    block_type = ReadSymbol(type_tree, br);
1196
93.3k
    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1197
100k
  } else {
1198
100k
    BrotliBitReaderState memento;
1199
100k
    BrotliBitReaderSaveState(br, &memento);
1200
100k
    if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE;
1201
89.9k
    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1202
24.4k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1203
24.4k
      BrotliBitReaderRestoreState(br, &memento);
1204
24.4k
      return BROTLI_FALSE;
1205
24.4k
    }
1206
89.9k
  }
1207
1208
158k
  if (block_type == 1) {
1209
52.4k
    block_type = ringbuffer[1] + 1;
1210
106k
  } else if (block_type == 0) {
1211
23.3k
    block_type = ringbuffer[0];
1212
83.0k
  } else {
1213
83.0k
    block_type -= 2;
1214
83.0k
  }
1215
158k
  if (block_type >= max_block_type) {
1216
8.19k
    block_type -= max_block_type;
1217
8.19k
  }
1218
158k
  ringbuffer[0] = ringbuffer[1];
1219
158k
  ringbuffer[1] = block_type;
1220
158k
  return BROTLI_TRUE;
1221
193k
}
1222
1223
static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
1224
13.0k
    BrotliDecoderState* s) {
1225
13.0k
  size_t i;
1226
117k
  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1227
37.7k
  for (i = 0; i < s->num_block_types[0]; i++) {
1228
24.7k
    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1229
24.7k
    size_t error = 0;
1230
24.7k
    size_t sample = s->context_map[offset];
1231
24.7k
    size_t j;
1232
421k
    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1233
      /* NOLINTNEXTLINE(bugprone-macro-repeated-side-effects) */
1234
396k
      BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
1235
396k
    }
1236
24.7k
    if (error == 0) {
1237
22.9k
      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1238
22.9k
    }
1239
24.7k
  }
1240
13.0k
}
1241
1242
50.5k
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1243
50.5k
  uint8_t context_mode;
1244
50.5k
  size_t trivial;
1245
50.5k
  brotli_reg_t block_type = s->block_type_rb[1];
1246
50.5k
  brotli_reg_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1247
50.5k
  s->context_map_slice = s->context_map + context_offset;
1248
50.5k
  trivial = s->trivial_literal_contexts[block_type >> 5];
1249
50.5k
  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1250
50.5k
  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1251
50.5k
  context_mode = s->context_modes[block_type] & 3;
1252
50.5k
  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
1253
50.5k
}
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
49.7k
    int safe, BrotliDecoderState* s) {
1259
49.7k
  if (!DecodeBlockTypeAndLength(safe, s, 0)) {
1260
11.4k
    return BROTLI_FALSE;
1261
11.4k
  }
1262
38.2k
  PrepareLiteralDecoding(s);
1263
38.2k
  return BROTLI_TRUE;
1264
49.7k
}
1265
1266
19.6k
static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1267
19.6k
  DecodeLiteralBlockSwitchInternal(0, s);
1268
19.6k
}
1269
1270
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch(
1271
30.1k
    BrotliDecoderState* s) {
1272
30.1k
  return DecodeLiteralBlockSwitchInternal(1, s);
1273
30.1k
}
1274
1275
/* Block switch for insert/copy length.
1276
   Reads 3..54 bits. */
1277
static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal(
1278
82.8k
    int safe, BrotliDecoderState* s) {
1279
82.8k
  if (!DecodeBlockTypeAndLength(safe, s, 1)) {
1280
16.6k
    return BROTLI_FALSE;
1281
16.6k
  }
1282
66.1k
  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
1283
66.1k
  return BROTLI_TRUE;
1284
82.8k
}
1285
1286
33.8k
static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1287
33.8k
  DecodeCommandBlockSwitchInternal(0, s);
1288
33.8k
}
1289
1290
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch(
1291
48.9k
    BrotliDecoderState* s) {
1292
48.9k
  return DecodeCommandBlockSwitchInternal(1, s);
1293
48.9k
}
1294
1295
/* Block switch for distance codes.
1296
   Reads 3..54 bits. */
1297
static BROTLI_INLINE BROTLI_BOOL DecodeDistanceBlockSwitchInternal(
1298
60.8k
    int safe, BrotliDecoderState* s) {
1299
60.8k
  if (!DecodeBlockTypeAndLength(safe, s, 2)) {
1300
6.41k
    return BROTLI_FALSE;
1301
6.41k
  }
1302
54.4k
  s->dist_context_map_slice = s->dist_context_map +
1303
54.4k
      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
1304
54.4k
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1305
54.4k
  return BROTLI_TRUE;
1306
60.8k
}
1307
1308
39.8k
static void BROTLI_NOINLINE DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
1309
39.8k
  DecodeDistanceBlockSwitchInternal(0, s);
1310
39.8k
}
1311
1312
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
1313
20.9k
    BrotliDecoderState* s) {
1314
20.9k
  return DecodeDistanceBlockSwitchInternal(1, s);
1315
20.9k
}
1316
1317
4.86M
static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
1318
4.86M
  size_t pos = wrap && s->pos > s->ringbuffer_size ?
1319
4.57M
      (size_t)s->ringbuffer_size : (size_t)(s->pos);
1320
4.86M
  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
1321
4.86M
  return partial_pos_rb - s->partial_pos_out;
1322
4.86M
}
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.86M
    size_t* total_out, BROTLI_BOOL force) {
1330
4.86M
  uint8_t* start =
1331
4.86M
      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
1332
4.86M
  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1333
4.86M
  size_t num_written = *available_out;
1334
4.86M
  if (num_written > to_write) {
1335
1.20M
    num_written = to_write;
1336
1.20M
  }
1337
4.86M
  if (s->meta_block_remaining_len < 0) {
1338
257
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
1339
257
  }
1340
4.86M
  if (next_out && !*next_out) {
1341
0
    *next_out = start;
1342
4.86M
  } else {
1343
4.86M
    if (next_out) {
1344
4.86M
      memcpy(*next_out, start, num_written);
1345
4.86M
      *next_out += num_written;
1346
4.86M
    }
1347
4.86M
  }
1348
4.86M
  *available_out -= num_written;
1349
4.86M
  BROTLI_LOG_UINT(to_write);
1350
4.86M
  BROTLI_LOG_UINT(num_written);
1351
4.86M
  s->partial_pos_out += num_written;
1352
4.86M
  if (total_out) {
1353
4.86M
    *total_out = s->partial_pos_out;
1354
4.86M
  }
1355
4.86M
  if (num_written < to_write) {
1356
3.32M
    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
1357
3.32M
      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
1358
3.32M
    } else {
1359
102
      return BROTLI_DECODER_SUCCESS;
1360
102
    }
1361
3.32M
  }
1362
  /* Wrap ring buffer only if it has reached its maximal size. */
1363
1.54M
  if (s->ringbuffer_size == (1 << s->window_bits) &&
1364
1.51M
      s->pos >= s->ringbuffer_size) {
1365
433k
    s->pos -= s->ringbuffer_size;
1366
433k
    s->rb_roundtrips++;
1367
433k
    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1368
433k
  }
1369
1.54M
  return BROTLI_DECODER_SUCCESS;
1370
4.86M
}
1371
1372
431k
static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1373
431k
  if (s->should_wrap_ringbuffer) {
1374
31.9k
    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1375
31.9k
    s->should_wrap_ringbuffer = 0;
1376
31.9k
  }
1377
431k
}
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
207k
    BrotliDecoderState* s) {
1388
207k
  uint8_t* old_ringbuffer = s->ringbuffer;
1389
207k
  if (s->ringbuffer_size == s->new_ringbuffer_size) {
1390
203k
    return BROTLI_TRUE;
1391
203k
  }
1392
1393
3.86k
  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
1394
3.86k
      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
1395
3.86k
  if (s->ringbuffer == 0) {
1396
    /* Restore previous value. */
1397
0
    s->ringbuffer = old_ringbuffer;
1398
0
    return BROTLI_FALSE;
1399
0
  }
1400
3.86k
  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1401
3.86k
  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
1402
1403
3.86k
  if (!!old_ringbuffer) {
1404
348
    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1405
348
    BROTLI_DECODER_FREE(s, old_ringbuffer);
1406
348
  }
1407
1408
3.86k
  s->ringbuffer_size = s->new_ringbuffer_size;
1409
3.86k
  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1410
3.86k
  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1411
1412
3.86k
  return BROTLI_TRUE;
1413
3.86k
}
1414
1415
static BrotliDecoderErrorCode BROTLI_NOINLINE
1416
65.4k
SkipMetadataBlock(BrotliDecoderState* s) {
1417
65.4k
  BrotliBitReader* br = &s->br;
1418
65.4k
  int nbytes;
1419
1420
65.4k
  if (s->meta_block_remaining_len == 0) {
1421
2.35k
    return BROTLI_DECODER_SUCCESS;
1422
2.35k
  }
1423
1424
63.0k
  BROTLI_DCHECK((BrotliGetAvailableBits(br) & 7) == 0);
1425
1426
  /* Drain accumulator. */
1427
63.0k
  if (BrotliGetAvailableBits(br) >= 8) {
1428
653
    uint8_t buffer[8];
1429
653
    nbytes = (int)(BrotliGetAvailableBits(br)) >> 3;
1430
653
    BROTLI_DCHECK(nbytes <= 8);
1431
653
    if (nbytes > s->meta_block_remaining_len) {
1432
357
      nbytes = s->meta_block_remaining_len;
1433
357
    }
1434
653
    BrotliCopyBytes(buffer, br, (size_t)nbytes);
1435
653
    if (s->metadata_chunk_func) {
1436
0
      s->metadata_chunk_func(s->metadata_callback_opaque, buffer,
1437
0
                             (size_t)nbytes);
1438
0
    }
1439
653
    s->meta_block_remaining_len -= nbytes;
1440
653
    if (s->meta_block_remaining_len == 0) {
1441
368
      return BROTLI_DECODER_SUCCESS;
1442
368
    }
1443
653
  }
1444
1445
  /* Direct access to metadata is possible. */
1446
62.6k
  nbytes = (int)BrotliGetRemainingBytes(br);
1447
62.6k
  if (nbytes > s->meta_block_remaining_len) {
1448
732
    nbytes = s->meta_block_remaining_len;
1449
732
  }
1450
62.6k
  if (nbytes > 0) {
1451
62.3k
    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
62.3k
    BrotliDropBytes(br, (size_t)nbytes);
1456
62.3k
    s->meta_block_remaining_len -= nbytes;
1457
62.3k
    if (s->meta_block_remaining_len == 0) {
1458
995
      return BROTLI_DECODER_SUCCESS;
1459
995
    }
1460
62.3k
  }
1461
1462
61.6k
  BROTLI_DCHECK(BrotliGetRemainingBytes(br) == 0);
1463
1464
61.6k
  return BROTLI_DECODER_NEEDS_MORE_INPUT;
1465
62.6k
}
1466
1467
static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1468
    size_t* available_out, uint8_t** next_out, size_t* total_out,
1469
195k
    BrotliDecoderState* s) {
1470
  /* TODO(eustas): avoid allocation for single uncompressed block. */
1471
195k
  if (!BrotliEnsureRingBuffer(s)) {
1472
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
1473
0
  }
1474
1475
  /* State machine */
1476
197k
  for (;;) {
1477
197k
    switch (s->substate_uncompressed) {
1478
161k
      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1479
161k
        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1480
161k
        if (nbytes > s->meta_block_remaining_len) {
1481
2.15k
          nbytes = s->meta_block_remaining_len;
1482
2.15k
        }
1483
161k
        if (s->pos + nbytes > s->ringbuffer_size) {
1484
1.27k
          nbytes = s->ringbuffer_size - s->pos;
1485
1.27k
        }
1486
        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1487
161k
        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1488
161k
        s->pos += nbytes;
1489
161k
        s->meta_block_remaining_len -= nbytes;
1490
161k
        if (s->pos < 1 << s->window_bits) {
1491
159k
          if (s->meta_block_remaining_len == 0) {
1492
2.77k
            return BROTLI_DECODER_SUCCESS;
1493
2.77k
          }
1494
156k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
1495
159k
        }
1496
1.66k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1497
1.66k
      }
1498
      /* Fall through. */
1499
1500
37.3k
      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1501
37.3k
        BrotliDecoderErrorCode result;
1502
37.3k
        result = WriteRingBuffer(
1503
37.3k
            s, available_out, next_out, total_out, BROTLI_FALSE);
1504
37.3k
        if (result != BROTLI_DECODER_SUCCESS) {
1505
35.6k
          return result;
1506
35.6k
        }
1507
1.66k
        if (s->ringbuffer_size == 1 << s->window_bits) {
1508
1.66k
          s->max_distance = s->max_backward_distance;
1509
1.66k
        }
1510
1.66k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1511
1.66k
        break;
1512
37.3k
      }
1513
197k
    }
1514
197k
  }
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
2.36M
static int GetCompoundDictionarySize(BrotliDecoderState* s) {
1579
2.36M
  return s->compound_dictionary ? s->compound_dictionary->total_size : 0;
1580
2.36M
}
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
16.9k
    BrotliDecoderState* s) {
1635
16.9k
  int window_size = 1 << s->window_bits;
1636
16.9k
  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
16.9k
  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
1640
16.9k
  int output_size;
1641
1642
  /* If maximum is already reached, no further extension is retired. */
1643
16.9k
  if (s->ringbuffer_size == window_size) {
1644
6.41k
    return;
1645
6.41k
  }
1646
1647
  /* Metadata blocks does not touch ring buffer. */
1648
10.5k
  if (s->is_metadata) {
1649
0
    return;
1650
0
  }
1651
1652
10.5k
  if (!s->ringbuffer) {
1653
4.90k
    output_size = 0;
1654
5.60k
  } else {
1655
5.60k
    output_size = s->pos;
1656
5.60k
  }
1657
10.5k
  output_size += s->meta_block_remaining_len;
1658
10.5k
  min_size = min_size < output_size ? output_size : min_size;
1659
1660
10.5k
  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
53.1k
    while ((new_ringbuffer_size >> 1) >= min_size) {
1665
42.6k
      new_ringbuffer_size >>= 1;
1666
42.6k
    }
1667
10.5k
  }
1668
1669
10.5k
  s->new_ringbuffer_size = new_ringbuffer_size;
1670
10.5k
}
1671
1672
/* Reads 1..256 2-bit context modes. */
1673
15.0k
static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1674
15.0k
  BrotliBitReader* br = &s->br;
1675
15.0k
  int i = s->loop_counter;
1676
1677
41.6k
  while (i < (int)s->num_block_types[0]) {
1678
28.5k
    brotli_reg_t bits;
1679
28.5k
    if (!BrotliSafeReadBits(br, 2, &bits)) {
1680
1.85k
      s->loop_counter = i;
1681
1.85k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1682
1.85k
    }
1683
26.6k
    s->context_modes[i] = (uint8_t)bits;
1684
26.6k
    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1685
26.6k
    i++;
1686
26.6k
  }
1687
13.1k
  return BROTLI_DECODER_SUCCESS;
1688
15.0k
}
1689
1690
171M
static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1691
171M
  int offset = s->distance_code - 3;
1692
171M
  if (s->distance_code <= 3) {
1693
    /* Compensate double distance-ring-buffer roll for dictionary items. */
1694
78.1M
    s->distance_context = 1 >> s->distance_code;
1695
78.1M
    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
1696
78.1M
    s->dist_rb_idx -= s->distance_context;
1697
93.0M
  } else {
1698
93.0M
    int index_delta = 3;
1699
93.0M
    int delta;
1700
93.0M
    int base = s->distance_code - 10;
1701
93.0M
    if (s->distance_code < 10) {
1702
38.1M
      base = s->distance_code - 4;
1703
54.9M
    } else {
1704
54.9M
      index_delta = 2;
1705
54.9M
    }
1706
    /* Unpack one of six 4-bit values. */
1707
93.0M
    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
1708
93.0M
    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
1709
93.0M
    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
36
      s->distance_code = 0x7FFFFFFF;
1713
36
    }
1714
93.0M
  }
1715
171M
}
1716
1717
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1718
898M
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1719
898M
  if (n_bits != 0) {
1720
101k
    return BrotliSafeReadBits(br, n_bits, val);
1721
898M
  } else {
1722
898M
    *val = 0;
1723
898M
    return BROTLI_TRUE;
1724
898M
  }
1725
898M
}
1726
1727
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
1728
144M
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1729
144M
  if (n_bits != 0) {
1730
14.7k
    return BrotliSafeReadBits32(br, n_bits, val);
1731
144M
  } else {
1732
144M
    *val = 0;
1733
144M
    return BROTLI_TRUE;
1734
144M
  }
1735
144M
}
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
12.2k
static void CalculateDistanceLut(BrotliDecoderState* s) {
1805
12.2k
  BrotliMetablockBodyArena* b = &s->arena.body;
1806
12.2k
  brotli_reg_t npostfix = s->distance_postfix_bits;
1807
12.2k
  brotli_reg_t ndirect = s->num_direct_distance_codes;
1808
12.2k
  brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
1809
12.2k
  brotli_reg_t postfix = (brotli_reg_t)1u << npostfix;
1810
12.2k
  brotli_reg_t j;
1811
12.2k
  brotli_reg_t bits = 1;
1812
12.2k
  brotli_reg_t half = 0;
1813
1814
  /* Skip short codes. */
1815
12.2k
  brotli_reg_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
1816
1817
  /* Fill direct codes. */
1818
387k
  for (j = 0; j < ndirect; ++j) {
1819
374k
    b->dist_extra_bits[i] = 0;
1820
374k
    b->dist_offset[i] = j + 1;
1821
374k
    ++i;
1822
374k
  }
1823
1824
  /* Fill regular distance codes. */
1825
599k
  while (i < alphabet_size_limit) {
1826
587k
    brotli_reg_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
1827
    /* Always fill the complete group. */
1828
2.90M
    for (j = 0; j < postfix; ++j) {
1829
2.31M
      b->dist_extra_bits[i] = (uint8_t)bits;
1830
2.31M
      b->dist_offset[i] = base + j;
1831
2.31M
      ++i;
1832
2.31M
    }
1833
587k
    bits = bits + half;
1834
587k
    half = half ^ 1;
1835
587k
  }
1836
12.2k
}
1837
1838
/* Precondition: s->distance_code < 0. */
1839
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
1840
363M
    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1841
363M
  BrotliMetablockBodyArena* b = &s->arena.body;
1842
363M
  brotli_reg_t code;
1843
363M
  brotli_reg_t bits;
1844
363M
  BrotliBitReaderState memento;
1845
363M
  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1846
363M
  if (!safe) {
1847
67.2M
    code = ReadSymbol(distance_tree, br);
1848
296M
  } else {
1849
296M
    BrotliBitReaderSaveState(br, &memento);
1850
296M
    if (!SafeReadSymbol(distance_tree, br, &code)) {
1851
8.07k
      return BROTLI_FALSE;
1852
8.07k
    }
1853
296M
  }
1854
363M
  --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
363M
  s->distance_context = 0;
1858
363M
  if ((code & ~0xFu) == 0) {
1859
171M
    s->distance_code = (int)code;
1860
171M
    TakeDistanceFromRingBuffer(s);
1861
171M
    return BROTLI_TRUE;
1862
171M
  }
1863
192M
  if (!safe) {
1864
47.9M
    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
1865
144M
  } else {
1866
144M
    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
1867
4.03k
      ++s->block_length[2];
1868
4.03k
      BrotliBitReaderRestoreState(br, &memento);
1869
4.03k
      return BROTLI_FALSE;
1870
4.03k
    }
1871
144M
  }
1872
192M
  s->distance_code =
1873
192M
      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
1874
192M
  return BROTLI_TRUE;
1875
192M
}
1876
1877
static BROTLI_INLINE void ReadDistance(
1878
67.2M
    BrotliDecoderState* s, BrotliBitReader* br) {
1879
67.2M
  ReadDistanceInternal(0, s, br);
1880
67.2M
}
1881
1882
static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
1883
296M
    BrotliDecoderState* s, BrotliBitReader* br) {
1884
296M
  return ReadDistanceInternal(1, s, br);
1885
296M
}
1886
1887
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
1888
620M
    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1889
620M
  brotli_reg_t cmd_code;
1890
620M
  brotli_reg_t insert_len_extra = 0;
1891
620M
  brotli_reg_t copy_length;
1892
620M
  CmdLutElement v;
1893
620M
  BrotliBitReaderState memento;
1894
620M
  if (!safe) {
1895
171M
    cmd_code = ReadSymbol(s->htree_command, br);
1896
449M
  } else {
1897
449M
    BrotliBitReaderSaveState(br, &memento);
1898
449M
    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
1899
15.1k
      return BROTLI_FALSE;
1900
15.1k
    }
1901
449M
  }
1902
620M
  v = kCmdLut[cmd_code];
1903
620M
  s->distance_code = v.distance_code;
1904
620M
  s->distance_context = v.context;
1905
620M
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1906
620M
  *insert_length = v.insert_len_offset;
1907
620M
  if (!safe) {
1908
171M
    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1909
62.1k
      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
1910
62.1k
    }
1911
171M
    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
1912
449M
  } else {
1913
449M
    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1914
449M
        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1915
10.2k
      BrotliBitReaderRestoreState(br, &memento);
1916
10.2k
      return BROTLI_FALSE;
1917
10.2k
    }
1918
449M
  }
1919
620M
  s->copy_length = (int)copy_length + v.copy_len_offset;
1920
620M
  --s->block_length[1];
1921
620M
  *insert_length += (int)insert_len_extra;
1922
620M
  return BROTLI_TRUE;
1923
620M
}
1924
1925
static BROTLI_INLINE void ReadCommand(
1926
171M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1927
171M
  ReadCommandInternal(0, s, br, insert_length);
1928
171M
}
1929
1930
static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
1931
449M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1932
449M
  return ReadCommandInternal(1, s, br, insert_length);
1933
449M
}
1934
1935
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
1936
1.08G
    int safe, BrotliBitReader* const br) {
1937
1.08G
  if (safe) {
1938
776M
    return BROTLI_TRUE;
1939
776M
  }
1940
309M
  return BrotliCheckInputAmount(br);
1941
1.08G
}
1942
1943
#define BROTLI_SAFE(METHOD)                       \
1944
984M
  {                                               \
1945
984M
    if (safe) {                                   \
1946
746M
      if (!Safe##METHOD) {                        \
1947
72.1k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
1948
72.1k
        goto saveStateAndReturn;                  \
1949
72.1k
      }                                           \
1950
746M
    } else {                                      \
1951
238M
      METHOD;                                     \
1952
238M
    }                                             \
1953
984M
  }
1954
1955
static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
1956
2.36M
    int safe, BrotliDecoderState* s) {
1957
2.36M
  int pos = s->pos;
1958
2.36M
  int i = s->loop_counter;
1959
2.36M
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1960
2.36M
  BrotliBitReader* br = &s->br;
1961
2.36M
  int compound_dictionary_size = GetCompoundDictionarySize(s);
1962
1963
2.36M
  if (!CheckInputAmount(safe, br)) {
1964
1.01M
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1965
1.01M
    goto saveStateAndReturn;
1966
1.01M
  }
1967
1.34M
  if (!safe) {
1968
286k
    BROTLI_UNUSED(BrotliWarmupBitReader(br));
1969
286k
  }
1970
1971
  /* Jump into state machine. */
1972
1.34M
  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
1973
102k
    goto CommandBegin;
1974
1.24M
  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
1975
902k
    goto CommandInner;
1976
902k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
1977
38.5k
    goto CommandPostDecodeLiterals;
1978
300k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
1979
300k
    goto CommandPostWrapCopy;
1980
300k
  } else {
1981
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1982
0
  }
1983
1984
620M
CommandBegin:
1985
620M
  if (safe) {
1986
449M
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1987
449M
  }
1988
620M
  if (!CheckInputAmount(safe, br)) {
1989
11.4k
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1990
11.4k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1991
11.4k
    goto saveStateAndReturn;
1992
11.4k
  }
1993
620M
  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
1994
82.8k
    BROTLI_SAFE(DecodeCommandBlockSwitch(s));
1995
66.1k
    goto CommandBegin;
1996
82.8k
  }
1997
  /* Read the insert/copy length in the command. */
1998
620M
  BROTLI_SAFE(ReadCommand(s, br, &i));
1999
620M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
2000
620M
              pos, i, s->copy_length));
2001
620M
  if (i == 0) {
2002
224M
    goto CommandPostDecodeLiterals;
2003
224M
  }
2004
395M
  s->meta_block_remaining_len -= i;
2005
2006
396M
CommandInner:
2007
396M
  if (safe) {
2008
319M
    s->state = BROTLI_STATE_COMMAND_INNER;
2009
319M
  }
2010
  /* Read the literals in the command. */
2011
396M
  if (s->trivial_literal_context) {
2012
332M
    brotli_reg_t bits;
2013
332M
    brotli_reg_t value;
2014
332M
    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
2015
332M
    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
71.7M
      int num_steps = i - 1;
2023
71.7M
      if (num_steps > 0 && ((brotli_reg_t)(num_steps) > s->block_length[0])) {
2024
        // Safe cast, since block_length < steps
2025
12.7k
        num_steps = (int)s->block_length[0];
2026
12.7k
      }
2027
71.7M
      if (s->ringbuffer_size >= pos &&
2028
71.7M
          (s->ringbuffer_size - pos) <= num_steps) {
2029
17.0k
        num_steps = s->ringbuffer_size - pos - 1;
2030
17.0k
      }
2031
71.7M
      if (num_steps < 0) {
2032
0
        num_steps = 0;
2033
0
      }
2034
71.7M
      num_steps = BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits,
2035
71.7M
                                                 &value, s->ringbuffer, pos,
2036
71.7M
                                                 num_steps);
2037
71.7M
      pos += num_steps;
2038
71.7M
      s->block_length[0] -= (brotli_reg_t)num_steps;
2039
71.7M
      i -= num_steps;
2040
71.7M
      do {
2041
71.7M
        if (!CheckInputAmount(safe, br)) {
2042
11.1k
          s->state = BROTLI_STATE_COMMAND_INNER;
2043
11.1k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2044
11.1k
          goto saveStateAndReturn;
2045
11.1k
        }
2046
71.6M
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2047
14.4k
          goto NextLiteralBlock;
2048
14.4k
        }
2049
71.6M
        BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, &value,
2050
71.6M
                                       s->ringbuffer, pos, 1);
2051
71.6M
        --s->block_length[0];
2052
71.6M
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2053
71.6M
        ++pos;
2054
71.6M
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2055
19.9k
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2056
19.9k
          --i;
2057
19.9k
          goto saveStateAndReturn;
2058
19.9k
        }
2059
71.6M
      } while (--i != 0);
2060
260M
    } else { /* safe */
2061
1.26G
      do {
2062
1.26G
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2063
27.7k
          goto NextLiteralBlock;
2064
27.7k
        }
2065
1.26G
        brotli_reg_t literal;
2066
1.26G
        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
2067
788k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2068
788k
          goto saveStateAndReturn;
2069
788k
        }
2070
1.26G
        s->ringbuffer[pos] = (uint8_t)literal;
2071
1.26G
        --s->block_length[0];
2072
1.26G
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2073
1.26G
        ++pos;
2074
1.26G
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2075
43.3k
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2076
43.3k
          --i;
2077
43.3k
          goto saveStateAndReturn;
2078
43.3k
        }
2079
1.26G
      } while (--i != 0);
2080
260M
    }
2081
332M
  } else {
2082
64.2M
    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2083
64.2M
    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2084
391M
    do {
2085
391M
      const HuffmanCode* hc;
2086
391M
      uint8_t context;
2087
391M
      if (!CheckInputAmount(safe, br)) {
2088
18.8k
        s->state = BROTLI_STATE_COMMAND_INNER;
2089
18.8k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2090
18.8k
        goto saveStateAndReturn;
2091
18.8k
      }
2092
391M
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2093
7.57k
        goto NextLiteralBlock;
2094
7.57k
      }
2095
391M
      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
2096
391M
      BROTLI_LOG_UINT(context);
2097
391M
      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
2098
391M
      p2 = p1;
2099
391M
      if (!safe) {
2100
65.4M
        p1 = (uint8_t)ReadSymbol(hc, br);
2101
325M
      } else {
2102
325M
        brotli_reg_t literal;
2103
325M
        if (!SafeReadSymbol(hc, br, &literal)) {
2104
1.16k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2105
1.16k
          goto saveStateAndReturn;
2106
1.16k
        }
2107
325M
        p1 = (uint8_t)literal;
2108
325M
      }
2109
391M
      s->ringbuffer[pos] = p1;
2110
391M
      --s->block_length[0];
2111
391M
      BROTLI_LOG_UINT(s->context_map_slice[context]);
2112
391M
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
2113
391M
      ++pos;
2114
391M
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2115
30.3k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2116
30.3k
        --i;
2117
30.3k
        goto saveStateAndReturn;
2118
30.3k
      }
2119
391M
    } while (--i != 0);
2120
64.2M
  }
2121
395M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2122
395M
  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
2123
4.09k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2124
4.09k
    goto saveStateAndReturn;
2125
4.09k
  }
2126
2127
620M
CommandPostDecodeLiterals:
2128
620M
  if (safe) {
2129
449M
    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2130
449M
  }
2131
620M
  if (s->distance_code >= 0) {
2132
    /* Implicit distance case. */
2133
256M
    s->distance_context = s->distance_code ? 0 : 1;
2134
256M
    --s->dist_rb_idx;
2135
256M
    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
2136
363M
  } else {
2137
    /* Read distance code in the command, unless it was implicitly zero. */
2138
363M
    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
2139
60.8k
      BROTLI_SAFE(DecodeDistanceBlockSwitch(s));
2140
54.4k
    }
2141
363M
    BROTLI_SAFE(ReadDistance(s, br));
2142
363M
  }
2143
620M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
2144
620M
              pos, s->distance_code));
2145
620M
  if (s->max_distance != s->max_backward_distance) {
2146
191M
    s->max_distance =
2147
191M
        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
2148
191M
  }
2149
620M
  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
620M
  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
66.4M
    if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
2157
36
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2158
36
          "len: %d bytes left: %d\n",
2159
36
          pos, s->distance_code, i, s->meta_block_remaining_len));
2160
36
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
2161
36
    }
2162
66.4M
    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
66.4M
    } else if (i >= SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
2174
66.4M
               i <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
2175
66.4M
      uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2176
66.4M
      uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2177
66.4M
      uint8_t dict_id = s->dictionary->context_based ?
2178
0
          s->dictionary->context_map[BROTLI_CONTEXT(p1, p2, s->context_lookup)]
2179
66.4M
          : 0;
2180
66.4M
      const BrotliDictionary* words = s->dictionary->words[dict_id];
2181
66.4M
      const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
2182
66.4M
      int offset = (int)words->offsets_by_length[i];
2183
66.4M
      brotli_reg_t shift = words->size_bits_by_length[i];
2184
66.4M
      int address =
2185
66.4M
          s->distance_code - s->max_distance - 1 - compound_dictionary_size;
2186
66.4M
      int mask = (int)BitMask(shift);
2187
66.4M
      int word_idx = address & mask;
2188
66.4M
      int transform_idx = address >> shift;
2189
      /* Compensate double distance-ring-buffer roll. */
2190
66.4M
      s->dist_rb_idx += s->distance_context;
2191
66.4M
      offset += word_idx * i;
2192
      /* If the distance is out of bound, select a next static dictionary if
2193
         there exist multiple. */
2194
66.4M
      if ((transform_idx >= (int)transforms->num_transforms ||
2195
66.4M
          words->size_bits_by_length[i] == 0) &&
2196
185
          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
66.4M
      if (BROTLI_PREDICT_FALSE(words->size_bits_by_length[i] == 0)) {
2226
84
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2227
84
            "len: %d bytes left: %d\n",
2228
84
            pos, s->distance_code, i, s->meta_block_remaining_len));
2229
84
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2230
84
      }
2231
66.4M
      if (BROTLI_PREDICT_FALSE(!words->data)) {
2232
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
2233
0
      }
2234
66.4M
      if (transform_idx < (int)transforms->num_transforms) {
2235
66.4M
        const uint8_t* word = &words->data[offset];
2236
66.4M
        int len = i;
2237
66.4M
        if (transform_idx == transforms->cutOffTransforms[0]) {
2238
66.2M
          memcpy(&s->ringbuffer[pos], word, (size_t)len);
2239
66.2M
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
2240
66.2M
                      len, word));
2241
66.2M
        } else {
2242
218k
          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
2243
218k
              transforms, transform_idx);
2244
218k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
2245
218k
                      " transform_idx = %d, transformed: [%.*s]\n",
2246
218k
                      i, word, transform_idx, len, &s->ringbuffer[pos]));
2247
218k
          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
218k
        }
2252
66.4M
        pos += len;
2253
66.4M
        s->meta_block_remaining_len -= len;
2254
66.4M
        if (pos >= s->ringbuffer_size) {
2255
37.3k
          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
2256
37.3k
          goto saveStateAndReturn;
2257
37.3k
        }
2258
66.4M
      } else {
2259
101
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2260
101
            "len: %d bytes left: %d\n",
2261
101
            pos, s->distance_code, i, s->meta_block_remaining_len));
2262
101
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
2263
101
      }
2264
66.4M
    } else {
2265
109
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2266
109
          "len: %d bytes left: %d\n",
2267
109
          pos, s->distance_code, i, s->meta_block_remaining_len));
2268
109
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2269
109
    }
2270
554M
  } else {
2271
554M
    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
2272
554M
    uint8_t* copy_dst = &s->ringbuffer[pos];
2273
554M
    uint8_t* copy_src = &s->ringbuffer[src_start];
2274
554M
    int dst_end = pos + i;
2275
554M
    int src_end = src_start + i;
2276
    /* Update the recent distances cache. */
2277
554M
    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
2278
554M
    ++s->dist_rb_idx;
2279
554M
    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
554M
    memmove16(copy_dst, copy_src);
2284
554M
    if (src_end > pos && dst_end > src_start) {
2285
      /* Regions intersect. */
2286
94.4M
      goto CommandPostWrapCopy;
2287
94.4M
    }
2288
459M
    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
2289
      /* At least one region wraps. */
2290
550k
      goto CommandPostWrapCopy;
2291
550k
    }
2292
459M
    pos += i;
2293
459M
    if (i > 16) {
2294
131k
      if (i > 32) {
2295
6.13k
        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
2296
125k
      } else {
2297
        /* This branch covers about 45% cases.
2298
           Fixed size short copy allows more compiler optimizations. */
2299
125k
        memmove16(copy_dst + 16, copy_src + 16);
2300
125k
      }
2301
131k
    }
2302
459M
  }
2303
525M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2304
525M
  if (s->meta_block_remaining_len <= 0) {
2305
    /* Next metablock, if any. */
2306
3.19k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2307
3.19k
    goto saveStateAndReturn;
2308
525M
  } else {
2309
525M
    goto CommandBegin;
2310
525M
  }
2311
95.3M
CommandPostWrapCopy:
2312
95.3M
  {
2313
95.3M
    int wrap_guard = s->ringbuffer_size - pos;
2314
1.70G
    while (--i >= 0) {
2315
1.61G
      s->ringbuffer[pos] =
2316
1.61G
          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
2317
1.61G
      ++pos;
2318
1.61G
      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
2319
301k
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
2320
301k
        goto saveStateAndReturn;
2321
301k
      }
2322
1.61G
    }
2323
95.3M
  }
2324
95.0M
  if (s->meta_block_remaining_len <= 0) {
2325
    /* Next metablock, if any. */
2326
2.21k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2327
2.21k
    goto saveStateAndReturn;
2328
95.0M
  } else {
2329
95.0M
    goto CommandBegin;
2330
95.0M
  }
2331
2332
49.7k
NextLiteralBlock:
2333
49.7k
  BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
2334
38.2k
  goto CommandInner;
2335
2336
2.36M
saveStateAndReturn:
2337
2.36M
  s->pos = pos;
2338
2.36M
  s->loop_counter = i;
2339
2.36M
  return result;
2340
49.7k
}
2341
2342
#undef BROTLI_SAFE
2343
2344
static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
2345
1.30M
    BrotliDecoderState* s) {
2346
1.30M
  return ProcessCommandsInternal(0, s);
2347
1.30M
}
2348
2349
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
2350
1.05M
    BrotliDecoderState* s) {
2351
1.05M
  return ProcessCommandsInternal(1, s);
2352
1.05M
}
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.45M
    size_t* available_out, uint8_t** next_out, size_t* total_out) {
2393
4.45M
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2394
4.45M
  BrotliBitReader* br = &s->br;
2395
4.45M
  size_t input_size = *available_in;
2396
4.45M
#define BROTLI_SAVE_ERROR_CODE(code) \
2397
4.45M
    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.45M
  if (total_out) {
2400
4.45M
    *total_out = s->partial_pos_out;
2401
4.45M
  }
2402
  /* Do not try to process further in a case of unrecoverable error. */
2403
4.45M
  if ((int)s->error_code < 0) {
2404
0
    return BROTLI_DECODER_RESULT_ERROR;
2405
0
  }
2406
4.45M
  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.45M
  if (!*available_out) next_out = 0;
2411
4.45M
  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
2412
4.44M
    BrotliBitReaderSetInput(br, *next_in, *available_in);
2413
4.44M
  } 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
9.07k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2418
9.07k
    BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
2419
9.07k
  }
2420
  /* State machine */
2421
9.92M
  for (;;) {
2422
9.92M
    if (result != BROTLI_DECODER_SUCCESS) {
2423
      /* Error, needs more input/output. */
2424
4.47M
      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2425
1.17M
        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
2426
1.13M
          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
2427
1.13M
              available_out, next_out, total_out, BROTLI_TRUE);
2428
          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
2429
1.13M
          if ((int)intermediate_result < 0) {
2430
42
            result = intermediate_result;
2431
42
            break;
2432
42
          }
2433
1.13M
        }
2434
1.17M
        if (s->buffer_length != 0) {  /* Used with internal buffer. */
2435
17.2k
          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
5.56k
            s->buffer_length = 0;
2440
            /* Switch to input stream and restart. */
2441
5.56k
            result = BROTLI_DECODER_SUCCESS;
2442
5.56k
            BrotliBitReaderSetInput(br, *next_in, *available_in);
2443
5.56k
            continue;
2444
11.6k
          } else if (*available_in != 0) {
2445
            /* Not enough data in buffer, but can take one more byte from
2446
               input stream. */
2447
9.43k
            result = BROTLI_DECODER_SUCCESS;
2448
9.43k
            BROTLI_DCHECK(s->buffer_length < 8);
2449
9.43k
            s->buffer.u8[s->buffer_length] = **next_in;
2450
9.43k
            s->buffer_length++;
2451
9.43k
            BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
2452
9.43k
            (*next_in)++;
2453
9.43k
            (*available_in)--;
2454
            /* Retry with more data in buffer. */
2455
9.43k
            continue;
2456
9.43k
          }
2457
          /* Can't finish reading and no more input. */
2458
2.20k
          break;
2459
1.15M
        } else {  /* Input stream doesn't contain enough input. */
2460
          /* Copy tail to internal buffer and return. */
2461
1.15M
          *next_in = br->next_in;
2462
1.15M
          *available_in = BrotliBitReaderGetAvailIn(br);
2463
1.16M
          while (*available_in) {
2464
7.43k
            s->buffer.u8[s->buffer_length] = **next_in;
2465
7.43k
            s->buffer_length++;
2466
7.43k
            (*next_in)++;
2467
7.43k
            (*available_in)--;
2468
7.43k
          }
2469
1.15M
          break;
2470
1.15M
        }
2471
        /* Unreachable. */
2472
1.17M
      }
2473
2474
      /* Fail or needs more output. */
2475
2476
3.29M
      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.30k
        s->buffer_length = 0;
2480
3.29M
      } 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
3.29M
        BrotliBitReaderUnload(br);
2485
3.29M
        *available_in = BrotliBitReaderGetAvailIn(br);
2486
3.29M
        *next_in = br->next_in;
2487
3.29M
      }
2488
3.29M
      break;
2489
4.47M
    }
2490
5.45M
    switch (s->state) {
2491
5.15k
      case BROTLI_STATE_UNINITED:
2492
        /* Prepare to the first read. */
2493
5.15k
        if (!BrotliWarmupBitReader(br)) {
2494
0
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2495
0
          break;
2496
0
        }
2497
        /* Decode window size. */
2498
5.15k
        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
2499
5.15k
        if (result != BROTLI_DECODER_SUCCESS) {
2500
1
          break;
2501
1
        }
2502
5.15k
        if (s->large_window) {
2503
0
          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
2504
0
          break;
2505
0
        }
2506
5.15k
        s->state = BROTLI_STATE_INITIALIZE;
2507
5.15k
        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
5.15k
      case BROTLI_STATE_INITIALIZE:
2526
5.15k
        BROTLI_LOG_UINT(s->window_bits);
2527
        /* Maximum distance, see section 9.1. of the spec. */
2528
5.15k
        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
5.15k
        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
2532
5.15k
            sizeof(HuffmanCode) * 3 *
2533
5.15k
                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2534
5.15k
        if (s->block_type_trees == 0) {
2535
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES);
2536
0
          break;
2537
0
        }
2538
5.15k
        s->block_len_trees =
2539
5.15k
            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
2540
2541
5.15k
        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2542
      /* Fall through. */
2543
2544
21.2k
      case BROTLI_STATE_METABLOCK_BEGIN:
2545
21.2k
        BrotliDecoderStateMetablockBegin(s);
2546
21.2k
        BROTLI_LOG_UINT(s->pos);
2547
21.2k
        s->state = BROTLI_STATE_METABLOCK_HEADER;
2548
      /* Fall through. */
2549
2550
38.3k
      case BROTLI_STATE_METABLOCK_HEADER:
2551
38.3k
        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
2552
38.3k
        if (result != BROTLI_DECODER_SUCCESS) {
2553
17.3k
          break;
2554
17.3k
        }
2555
20.9k
        BROTLI_LOG_UINT(s->is_last_metablock);
2556
20.9k
        BROTLI_LOG_UINT(s->meta_block_remaining_len);
2557
20.9k
        BROTLI_LOG_UINT(s->is_metadata);
2558
20.9k
        BROTLI_LOG_UINT(s->is_uncompressed);
2559
20.9k
        if (s->is_metadata || s->is_uncompressed) {
2560
6.94k
          if (!BrotliJumpToByteBoundary(br)) {
2561
53
            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
2562
53
            break;
2563
53
          }
2564
6.94k
        }
2565
20.8k
        if (s->is_metadata) {
2566
3.90k
          s->state = BROTLI_STATE_METADATA;
2567
3.90k
          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.90k
          break;
2572
3.90k
        }
2573
16.9k
        if (s->meta_block_remaining_len == 0) {
2574
55
          s->state = BROTLI_STATE_METABLOCK_DONE;
2575
55
          break;
2576
55
        }
2577
16.9k
        BrotliCalculateRingBufferSize(s);
2578
16.9k
        if (s->is_uncompressed) {
2579
2.98k
          s->state = BROTLI_STATE_UNCOMPRESSED;
2580
2.98k
          break;
2581
2.98k
        }
2582
13.9k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER;
2583
      /* Fall through. */
2584
2585
13.9k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: {
2586
13.9k
        BrotliMetablockHeaderArena* h = &s->arena.header;
2587
13.9k
        s->loop_counter = 0;
2588
        /* Initialize compressed metablock header arena. */
2589
13.9k
        h->sub_loop_counter = 0;
2590
        /* Make small negative indexes addressable. */
2591
13.9k
        h->symbol_lists =
2592
13.9k
            &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
2593
13.9k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
2594
13.9k
        h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
2595
13.9k
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
2596
13.9k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2597
13.9k
      }
2598
      /* Fall through. */
2599
2600
55.6k
      case BROTLI_STATE_HUFFMAN_CODE_0:
2601
55.6k
        if (s->loop_counter >= 3) {
2602
13.2k
          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
2603
13.2k
          break;
2604
13.2k
        }
2605
        /* Reads 1..11 bits. */
2606
42.4k
        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
2607
42.4k
        if (result != BROTLI_DECODER_SUCCESS) {
2608
1.64k
          break;
2609
1.64k
        }
2610
40.7k
        s->num_block_types[s->loop_counter]++;
2611
40.7k
        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2612
40.7k
        if (s->num_block_types[s->loop_counter] < 2) {
2613
36.4k
          s->loop_counter++;
2614
36.4k
          break;
2615
36.4k
        }
2616
4.32k
        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2617
      /* Fall through. */
2618
2619
7.50k
      case BROTLI_STATE_HUFFMAN_CODE_1: {
2620
7.50k
        brotli_reg_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
2621
7.50k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2622
7.50k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2623
7.50k
            &s->block_type_trees[tree_offset], NULL, s);
2624
7.50k
        if (result != BROTLI_DECODER_SUCCESS) break;
2625
3.93k
        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2626
3.93k
      }
2627
      /* Fall through. */
2628
2629
7.78k
      case BROTLI_STATE_HUFFMAN_CODE_2: {
2630
7.78k
        brotli_reg_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
2631
7.78k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2632
7.78k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2633
7.78k
            &s->block_len_trees[tree_offset], NULL, s);
2634
7.78k
        if (result != BROTLI_DECODER_SUCCESS) break;
2635
3.76k
        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2636
3.76k
      }
2637
      /* Fall through. */
2638
2639
6.36k
      case BROTLI_STATE_HUFFMAN_CODE_3: {
2640
6.36k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2641
6.36k
        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2642
6.36k
            &s->block_len_trees[tree_offset], br)) {
2643
2.65k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2644
2.65k
          break;
2645
2.65k
        }
2646
3.71k
        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2647
3.71k
        s->loop_counter++;
2648
3.71k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2649
3.71k
        break;
2650
6.36k
      }
2651
2652
195k
      case BROTLI_STATE_UNCOMPRESSED: {
2653
195k
        result = CopyUncompressedBlockToOutput(
2654
195k
            available_out, next_out, total_out, s);
2655
195k
        if (result != BROTLI_DECODER_SUCCESS) {
2656
192k
          break;
2657
192k
        }
2658
2.77k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2659
2.77k
        break;
2660
195k
      }
2661
2662
65.4k
      case BROTLI_STATE_METADATA:
2663
65.4k
        result = SkipMetadataBlock(s);
2664
65.4k
        if (result != BROTLI_DECODER_SUCCESS) {
2665
61.6k
          break;
2666
61.6k
        }
2667
3.71k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2668
3.71k
        break;
2669
2670
18.0k
      case BROTLI_STATE_METABLOCK_HEADER_2: {
2671
18.0k
        brotli_reg_t bits;
2672
18.0k
        if (!BrotliSafeReadBits(br, 6, &bits)) {
2673
4.79k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2674
4.79k
          break;
2675
4.79k
        }
2676
13.2k
        s->distance_postfix_bits = bits & BitMask(2);
2677
13.2k
        bits >>= 2;
2678
13.2k
        s->num_direct_distance_codes = bits << s->distance_postfix_bits;
2679
13.2k
        BROTLI_LOG_UINT(s->num_direct_distance_codes);
2680
13.2k
        BROTLI_LOG_UINT(s->distance_postfix_bits);
2681
13.2k
        s->context_modes =
2682
13.2k
            (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
2683
13.2k
        if (s->context_modes == 0) {
2684
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
2685
0
          break;
2686
0
        }
2687
13.2k
        s->loop_counter = 0;
2688
13.2k
        s->state = BROTLI_STATE_CONTEXT_MODES;
2689
13.2k
      }
2690
      /* Fall through. */
2691
2692
15.0k
      case BROTLI_STATE_CONTEXT_MODES:
2693
15.0k
        result = ReadContextModes(s);
2694
15.0k
        if (result != BROTLI_DECODER_SUCCESS) {
2695
1.85k
          break;
2696
1.85k
        }
2697
13.1k
        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2698
      /* Fall through. */
2699
2700
18.7k
      case BROTLI_STATE_CONTEXT_MAP_1:
2701
18.7k
        result = DecodeContextMap(
2702
18.7k
            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2703
18.7k
            &s->num_literal_htrees, &s->context_map, s);
2704
18.7k
        if (result != BROTLI_DECODER_SUCCESS) {
2705
5.78k
          break;
2706
5.78k
        }
2707
13.0k
        DetectTrivialLiteralBlockTypes(s);
2708
13.0k
        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2709
      /* Fall through. */
2710
2711
14.9k
      case BROTLI_STATE_CONTEXT_MAP_2: {
2712
14.9k
        brotli_reg_t npostfix = s->distance_postfix_bits;
2713
14.9k
        brotli_reg_t ndirect = s->num_direct_distance_codes;
2714
14.9k
        brotli_reg_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2715
14.9k
            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
2716
14.9k
        brotli_reg_t distance_alphabet_size_limit = distance_alphabet_size_max;
2717
14.9k
        BROTLI_BOOL allocation_success = BROTLI_TRUE;
2718
14.9k
        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
14.9k
        result = DecodeContextMap(
2727
14.9k
            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2728
14.9k
            &s->num_dist_htrees, &s->dist_context_map, s);
2729
14.9k
        if (result != BROTLI_DECODER_SUCCESS) {
2730
2.11k
          break;
2731
2.11k
        }
2732
12.8k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2733
12.8k
            s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
2734
12.8k
            BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
2735
12.8k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2736
12.8k
            s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
2737
12.8k
            BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
2738
12.8k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2739
12.8k
            s, &s->distance_hgroup, distance_alphabet_size_max,
2740
12.8k
            distance_alphabet_size_limit, s->num_dist_htrees);
2741
12.8k
        if (!allocation_success) {
2742
0
          return BROTLI_SAVE_ERROR_CODE(
2743
0
              BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
2744
0
        }
2745
12.8k
        s->loop_counter = 0;
2746
12.8k
        s->state = BROTLI_STATE_TREE_GROUP;
2747
12.8k
      }
2748
      /* Fall through. */
2749
2750
79.8k
      case BROTLI_STATE_TREE_GROUP: {
2751
79.8k
        HuffmanTreeGroup* hgroup = NULL;
2752
79.8k
        switch (s->loop_counter) {
2753
23.8k
          case 0: hgroup = &s->literal_hgroup; break;
2754
25.9k
          case 1: hgroup = &s->insert_copy_hgroup; break;
2755
30.0k
          case 2: hgroup = &s->distance_hgroup; break;
2756
0
          default: return BROTLI_SAVE_ERROR_CODE(BROTLI_FAILURE(
2757
79.8k
              BROTLI_DECODER_ERROR_UNREACHABLE));  /* COV_NF_LINE */
2758
79.8k
        }
2759
79.8k
        result = HuffmanTreeGroupDecode(hgroup, s);
2760
79.8k
        if (result != BROTLI_DECODER_SUCCESS) break;
2761
37.3k
        s->loop_counter++;
2762
37.3k
        if (s->loop_counter < 3) {
2763
25.1k
          break;
2764
25.1k
        }
2765
12.2k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY;
2766
12.2k
      }
2767
      /* Fall through. */
2768
2769
12.2k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY:
2770
12.2k
        PrepareLiteralDecoding(s);
2771
12.2k
        s->dist_context_map_slice = s->dist_context_map;
2772
12.2k
        s->htree_command = s->insert_copy_hgroup.htrees[0];
2773
12.2k
        if (!BrotliEnsureRingBuffer(s)) {
2774
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
2775
0
          break;
2776
0
        }
2777
12.2k
        CalculateDistanceLut(s);
2778
12.2k
        s->state = BROTLI_STATE_COMMAND_BEGIN;
2779
      /* Fall through. */
2780
2781
91.0k
      case BROTLI_STATE_COMMAND_BEGIN:
2782
      /* Fall through. */
2783
963k
      case BROTLI_STATE_COMMAND_INNER:
2784
      /* Fall through. */
2785
1.00M
      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2786
      /* Fall through. */
2787
1.30M
      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2788
1.30M
        result = ProcessCommands(s);
2789
1.30M
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2790
1.05M
          result = SafeProcessCommands(s);
2791
1.05M
        }
2792
1.30M
        break;
2793
2794
1.39M
      case BROTLI_STATE_COMMAND_INNER_WRITE:
2795
      /* Fall through. */
2796
1.78M
      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2797
      /* Fall through. */
2798
3.55M
      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2799
3.55M
        result = WriteRingBuffer(
2800
3.55M
            s, available_out, next_out, total_out, BROTLI_FALSE);
2801
3.55M
        if (result != BROTLI_DECODER_SUCCESS) {
2802
3.11M
          break;
2803
3.11M
        }
2804
431k
        WrapRingBuffer(s);
2805
431k
        if (s->ringbuffer_size == 1 << s->window_bits) {
2806
431k
          s->max_distance = s->max_backward_distance;
2807
431k
        }
2808
431k
        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
2809
37.3k
          BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
2810
37.3k
          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
37.3k
          if (s->meta_block_remaining_len == 0) {
2815
            /* Next metablock, if any. */
2816
68
            s->state = BROTLI_STATE_METABLOCK_DONE;
2817
37.2k
          } else {
2818
37.2k
            s->state = BROTLI_STATE_COMMAND_BEGIN;
2819
37.2k
          }
2820
37.3k
          break;
2821
394k
        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2822
300k
          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2823
300k
        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2824
93.5k
          if (s->loop_counter == 0) {
2825
21.1k
            if (s->meta_block_remaining_len == 0) {
2826
586
              s->state = BROTLI_STATE_METABLOCK_DONE;
2827
20.5k
            } else {
2828
20.5k
              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2829
20.5k
            }
2830
21.1k
            break;
2831
21.1k
          }
2832
72.3k
          s->state = BROTLI_STATE_COMMAND_INNER;
2833
72.3k
        }
2834
373k
        break;
2835
2836
373k
      case BROTLI_STATE_METABLOCK_DONE:
2837
16.7k
        if (s->meta_block_remaining_len < 0) {
2838
506
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
2839
506
          break;
2840
506
        }
2841
16.1k
        BrotliDecoderStateCleanupAfterMetablock(s);
2842
16.1k
        if (!s->is_last_metablock) {
2843
16.0k
          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2844
16.0k
          break;
2845
16.0k
        }
2846
142
        if (!BrotliJumpToByteBoundary(br)) {
2847
39
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2848
39
          break;
2849
39
        }
2850
103
        if (s->buffer_length == 0) {
2851
101
          BrotliBitReaderUnload(br);
2852
101
          *available_in = BrotliBitReaderGetAvailIn(br);
2853
101
          *next_in = br->next_in;
2854
101
        }
2855
103
        s->state = BROTLI_STATE_DONE;
2856
      /* Fall through. */
2857
2858
142k
      case BROTLI_STATE_DONE:
2859
142k
        if (s->ringbuffer != 0) {
2860
142k
          result = WriteRingBuffer(
2861
142k
              s, available_out, next_out, total_out, BROTLI_TRUE);
2862
142k
          if (result != BROTLI_DECODER_SUCCESS) {
2863
142k
            break;
2864
142k
          }
2865
142k
        }
2866
103
        return BROTLI_SAVE_ERROR_CODE(result);
2867
5.45M
    }
2868
5.45M
  }
2869
4.45M
  return BROTLI_SAVE_ERROR_CODE(result);
2870
4.45M
#undef BROTLI_SAVE_ERROR_CODE
2871
4.45M
}
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