Coverage Report

Created: 2026-10-28 07:09

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