Coverage Report

Created: 2026-08-25 06:40

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
377
#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
7.09M
#define HUFFMAN_TABLE_BITS 8U
40
7.54k
#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
1.49k
    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
82
1.49k
  BrotliDecoderState* state = 0;
83
1.49k
  if (!BrotliDecoderEnsureStaticInit()) {
84
0
    BROTLI_DUMP();
85
0
    return 0;
86
0
  }
87
1.49k
  if (!alloc_func && !free_func) {
88
1.49k
    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
89
1.49k
  } else if (alloc_func && free_func) {
90
0
    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
91
0
  }
92
1.49k
  if (state == 0) {
93
0
    BROTLI_DUMP();
94
0
    return 0;
95
0
  }
96
1.49k
  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
1.49k
  return state;
106
1.49k
}
107
108
/* Deinitializes and frees BrotliDecoderState instance. */
109
1.49k
void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
110
1.49k
  if (!state) {
111
0
    return;
112
1.49k
  } else {
113
1.49k
    brotli_free_func free_func = state->free_func;
114
1.49k
    void* opaque = state->memory_manager_opaque;
115
1.49k
    BrotliDecoderStateCleanup(state);
116
1.49k
    free_func(opaque, state);
117
1.49k
  }
118
1.49k
}
119
120
/* Saves error code and converts it to BrotliDecoderResult. */
121
static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
122
2.47k
    BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
123
2.47k
  s->error_code = (int)e;
124
2.47k
  s->used_input += consumed_input;
125
2.47k
  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
2.47k
  switch (e) {
130
592
    case BROTLI_DECODER_SUCCESS:
131
592
      return BROTLI_DECODER_RESULT_SUCCESS;
132
133
491
    case BROTLI_DECODER_NEEDS_MORE_INPUT:
134
491
      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
135
136
1.01k
    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
137
1.01k
      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
138
139
377
    default:
140
377
      return BROTLI_DECODER_RESULT_ERROR;
141
2.47k
  }
142
2.47k
}
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
1.49k
                                               BrotliBitReader* br) {
148
1.49k
  brotli_reg_t n;
149
1.49k
  BROTLI_BOOL large_window = s->large_window;
150
1.49k
  s->large_window = BROTLI_FALSE;
151
1.49k
  BrotliTakeBits(br, 1, &n);
152
1.49k
  if (n == 0) {
153
161
    s->window_bits = 16;
154
161
    return BROTLI_DECODER_SUCCESS;
155
161
  }
156
1.33k
  BrotliTakeBits(br, 3, &n);
157
1.33k
  if (n != 0) {
158
1.31k
    s->window_bits = (17u + n) & 63u;
159
1.31k
    return BROTLI_DECODER_SUCCESS;
160
1.31k
  }
161
23
  BrotliTakeBits(br, 3, &n);
162
23
  if (n == 1) {
163
4
    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
4
    } else {
171
4
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
172
4
    }
173
4
  }
174
19
  if (n != 0) {
175
19
    s->window_bits = (8u + n) & 63u;
176
19
    return BROTLI_DECODER_SUCCESS;
177
19
  }
178
0
  s->window_bits = 17;
179
0
  return BROTLI_DECODER_SUCCESS;
180
19
}
181
182
1.41M
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
1.41M
  uint32_t buffer[4];
187
1.41M
  memcpy(buffer, src, 16);
188
1.41M
  memcpy(dst, buffer, 16);
189
1.41M
#endif
190
1.41M
}
191
192
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
193
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
194
6.84k
    BrotliDecoderState* s, BrotliBitReader* br, brotli_reg_t* value) {
195
6.84k
  brotli_reg_t bits;
196
6.84k
  switch (s->substate_decode_uint8) {
197
6.84k
    case BROTLI_STATE_DECODE_UINT8_NONE:
198
6.84k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
199
0
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
200
0
      }
201
6.84k
      if (bits == 0) {
202
4.79k
        *value = 0;
203
4.79k
        return BROTLI_DECODER_SUCCESS;
204
4.79k
      }
205
    /* Fall through. */
206
207
2.04k
    case BROTLI_STATE_DECODE_UINT8_SHORT:
208
2.04k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
209
0
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
210
0
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
211
0
      }
212
2.04k
      if (bits == 0) {
213
643
        *value = 1;
214
643
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
215
643
        return BROTLI_DECODER_SUCCESS;
216
643
      }
217
      /* Use output value as a temporary storage. It MUST be persisted. */
218
1.40k
      *value = bits;
219
    /* Fall through. */
220
221
1.40k
    case BROTLI_STATE_DECODE_UINT8_LONG:
222
1.40k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
223
0
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
224
0
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
225
0
      }
226
1.40k
      *value = ((brotli_reg_t)1U << *value) + bits;
227
1.40k
      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
228
1.40k
      return BROTLI_DECODER_SUCCESS;
229
230
0
    default:
231
0
      return
232
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
233
6.84k
  }
234
6.84k
}
235
236
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
237
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
238
6.77k
    BrotliDecoderState* s, BrotliBitReader* br) {
239
6.77k
  brotli_reg_t bits;
240
6.77k
  int i;
241
15.1k
  for (;;) {
242
15.1k
    switch (s->substate_metablock_header) {
243
6.77k
      case BROTLI_STATE_METABLOCK_HEADER_NONE:
244
6.77k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
245
4
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
246
4
        }
247
6.77k
        s->is_last_metablock = bits ? 1 : 0;
248
6.77k
        s->meta_block_remaining_len = 0;
249
6.77k
        s->is_uncompressed = 0;
250
6.77k
        s->is_metadata = 0;
251
6.77k
        if (!s->is_last_metablock) {
252
5.50k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
253
5.50k
          break;
254
5.50k
        }
255
1.27k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
256
      /* Fall through. */
257
258
1.27k
      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
259
1.27k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
260
0
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
261
0
        }
262
1.27k
        if (bits) {
263
25
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
264
25
          return BROTLI_DECODER_SUCCESS;
265
25
        }
266
1.24k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
267
      /* Fall through. */
268
269
6.74k
      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
270
6.74k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
271
0
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
272
0
        }
273
6.74k
        s->size_nibbles = (uint8_t)(bits + 4);
274
6.74k
        s->loop_counter = 0;
275
6.74k
        if (bits == 3) {
276
2.87k
          s->is_metadata = 1;
277
2.87k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
278
2.87k
          break;
279
2.87k
        }
280
3.87k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
281
      /* Fall through. */
282
283
3.87k
      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
284
3.87k
        i = s->loop_counter;
285
19.6k
        for (; i < (int)s->size_nibbles; ++i) {
286
15.8k
          if (!BrotliSafeReadBits(br, 4, &bits)) {
287
0
            s->loop_counter = i;
288
0
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
289
0
          }
290
15.8k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
291
202
              bits == 0) {
292
5
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
293
5
          }
294
15.8k
          s->meta_block_remaining_len |= (int)(bits << (i * 4));
295
15.8k
        }
296
3.86k
        s->substate_metablock_header =
297
3.86k
            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
298
      /* Fall through. */
299
300
3.86k
      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
301
3.86k
        if (!s->is_last_metablock) {
302
2.64k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
303
0
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
304
0
          }
305
2.64k
          s->is_uncompressed = bits ? 1 : 0;
306
2.64k
        }
307
3.86k
        ++s->meta_block_remaining_len;
308
3.86k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
309
3.86k
        return BROTLI_DECODER_SUCCESS;
310
311
2.87k
      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
312
2.87k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
313
0
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
314
0
        }
315
2.87k
        if (bits != 0) {
316
4
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
317
4
        }
318
2.87k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
319
      /* Fall through. */
320
321
2.87k
      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
322
2.87k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
323
0
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
324
0
        }
325
2.87k
        if (bits == 0) {
326
2.65k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
327
2.65k
          return BROTLI_DECODER_SUCCESS;
328
2.65k
        }
329
217
        s->size_nibbles = (uint8_t)bits;
330
217
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
331
      /* Fall through. */
332
333
217
      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
334
217
        i = s->loop_counter;
335
455
        for (; i < (int)s->size_nibbles; ++i) {
336
238
          if (!BrotliSafeReadBits(br, 8, &bits)) {
337
0
            s->loop_counter = i;
338
0
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
339
0
          }
340
238
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
341
12
              bits == 0) {
342
0
            return BROTLI_FAILURE(
343
0
                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
344
0
          }
345
238
          s->meta_block_remaining_len |= (int)(bits << (i * 8));
346
238
        }
347
217
        ++s->meta_block_remaining_len;
348
217
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
349
217
        return BROTLI_DECODER_SUCCESS;
350
351
0
      default:
352
0
        return
353
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
354
15.1k
    }
355
15.1k
  }
356
6.77k
}
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
6.91M
                                               BrotliBitReader* br) {
365
6.91M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
366
6.91M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
367
6.91M
  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
368
71.1k
    brotli_reg_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
369
71.1k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
370
71.1k
    BROTLI_HC_ADJUST_TABLE_INDEX(table,
371
71.1k
        BROTLI_HC_FAST_LOAD_VALUE(table) +
372
71.1k
        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
373
71.1k
  }
374
6.91M
  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
375
6.91M
  return BROTLI_HC_FAST_LOAD_VALUE(table);
376
6.91M
}
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
6.68M
                                             BrotliBitReader* br) {
382
6.68M
  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
383
6.68M
}
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
5.60k
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
389
5.60k
  brotli_reg_t val;
390
5.60k
  brotli_reg_t available_bits = BrotliGetAvailableBits(br);
391
5.60k
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
392
5.60k
  if (available_bits == 0) {
393
481
    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
394
320
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
395
320
      return BROTLI_TRUE;
396
320
    }
397
161
    return BROTLI_FALSE;  /* No valid bits at all. */
398
481
  }
399
5.12k
  val = BrotliGetBitsUnmasked(br);
400
5.12k
  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
401
5.12k
  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
402
5.06k
    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
403
4.97k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
404
4.97k
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
405
4.97k
      return BROTLI_TRUE;
406
4.97k
    } else {
407
93
      return BROTLI_FALSE;  /* Not enough bits for the first level. */
408
93
    }
409
5.06k
  }
410
51
  if (available_bits <= HUFFMAN_TABLE_BITS) {
411
17
    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
412
17
  }
413
414
  /* Speculatively drop HUFFMAN_TABLE_BITS. */
415
34
  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
416
34
  available_bits -= HUFFMAN_TABLE_BITS;
417
34
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
418
34
  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
419
6
    return BROTLI_FALSE;  /* Not enough bits for the second level. */
420
6
  }
421
422
28
  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
423
28
  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
424
28
  return BROTLI_TRUE;
425
34
}
426
427
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
428
235k
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
429
235k
  brotli_reg_t val;
430
235k
  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
431
229k
    *result = DecodeSymbol(val, table, br);
432
229k
    return BROTLI_TRUE;
433
229k
  }
434
5.60k
  return SafeDecodeSymbol(table, br, result);
435
235k
}
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
29.5M
                                        brotli_reg_t* value) {
443
29.5M
  if (safe) {
444
9.39k
    return;
445
9.39k
  }
446
29.5M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
447
29.5M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
448
29.5M
  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
449
29.5M
  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
450
29.5M
}
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
26.9M
                                                  brotli_reg_t* value) {
458
26.9M
  brotli_reg_t result = *value;
459
26.9M
  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
460
7.54k
    brotli_reg_t val = BrotliGet16BitsUnmasked(br);
461
7.54k
    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
462
7.54k
    brotli_reg_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
463
7.54k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
464
7.54k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
465
7.54k
    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
466
7.54k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
467
7.54k
    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
468
26.9M
  } else {
469
26.9M
    BrotliDropBits(br, *bits);
470
26.9M
  }
471
26.9M
  PreloadSymbol(0, table, br, bits, value);
472
26.9M
  return result;
473
26.9M
}
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.38M
                                                        const int limit) {
485
3.38M
  const int kMaximalOverread = 4;
486
3.38M
  int pos_limit = limit;
487
3.38M
  int copies = 0;
488
  /* Calculate range where CheckInputAmount is always true.
489
     Start with the number of bytes we can read. */
490
3.38M
  int64_t new_lim = br->guard_in - br->next_in;
491
  /* Convert to bits, since symbols use variable number of bits. */
492
3.38M
  new_lim *= 8;
493
  /* At most 15 bits per symbol, so this is safe. */
494
3.38M
  new_lim /= 15;
495
3.38M
  if ((new_lim - kMaximalOverread) <= limit) {
496
    // Safe cast, since new_lim is already < num_steps
497
6.66k
    pos_limit = (int)(new_lim - kMaximalOverread);
498
6.66k
  }
499
3.38M
  if (pos_limit < 0) {
500
3.63k
    pos_limit = 0;
501
3.63k
  }
502
3.38M
  copies = pos_limit;
503
3.38M
  pos_limit += pos;
504
  /* Fast path, caller made sure it is safe to write,
505
     we verified that is is safe to read. */
506
29.3M
  for (; pos < pos_limit; pos++) {
507
26.0M
    BROTLI_DCHECK(BrotliCheckInputAmount(br));
508
26.0M
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
509
26.0M
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
510
26.0M
  }
511
  /* Do the remainder, caller made sure it is safe to write,
512
     we need to bverify that it is safe to read. */
513
4.31M
  while (BrotliCheckInputAmount(br) && copies < limit) {
514
925k
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
515
925k
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
516
925k
    pos++;
517
925k
    copies++;
518
925k
  }
519
3.38M
  return copies;
520
3.38M
}
521
522
4.29k
static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) {
523
4.29k
  brotli_reg_t result = 0;
524
35.2k
  while (x) {
525
30.9k
    x >>= 1;
526
30.9k
    ++result;
527
30.9k
  }
528
4.29k
  return result;
529
4.29k
}
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
4.29k
    BrotliDecoderState* s) {
537
  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
538
4.29k
  BrotliBitReader* br = &s->br;
539
4.29k
  BrotliMetablockHeaderArena* h = &s->arena.header;
540
4.29k
  brotli_reg_t max_bits = Log2Floor(alphabet_size_max - 1);
541
4.29k
  brotli_reg_t i = h->sub_loop_counter;
542
4.29k
  brotli_reg_t num_symbols = h->symbol;
543
13.6k
  while (i <= num_symbols) {
544
9.31k
    brotli_reg_t v;
545
9.31k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
546
3
      h->sub_loop_counter = i;
547
3
      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
548
3
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
549
3
    }
550
9.31k
    if (v >= alphabet_size_limit) {
551
7
      return
552
7
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
553
7
    }
554
9.30k
    h->symbols_lists_array[i] = (uint16_t)v;
555
9.30k
    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
556
9.30k
    ++i;
557
9.30k
  }
558
559
9.29k
  for (i = 0; i < num_symbols; ++i) {
560
5.01k
    brotli_reg_t k = i + 1;
561
13.4k
    for (; k <= num_symbols; ++k) {
562
8.44k
      if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) {
563
5
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
564
5
      }
565
8.44k
    }
566
5.01k
  }
567
568
4.28k
  return BROTLI_DECODER_SUCCESS;
569
4.28k
}
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
81.7k
    uint16_t* code_length_histo, int* next_symbol) {
581
81.7k
  *repeat = 0;
582
81.7k
  if (code_len != 0) {  /* code_len == 1..15 */
583
72.7k
    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
584
72.7k
    next_symbol[code_len] = (int)(*symbol);
585
72.7k
    *prev_code_len = code_len;
586
72.7k
    *space -= 32768U >> code_len;
587
72.7k
    code_length_histo[code_len]++;
588
72.7k
    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
589
72.7k
        (int)*symbol, (int)code_len));
590
72.7k
  }
591
81.7k
  (*symbol)++;
592
81.7k
}
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
54.1k
    uint16_t* code_length_histo, int* next_symbol) {
609
54.1k
  brotli_reg_t old_repeat;
610
54.1k
  brotli_reg_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
611
54.1k
  brotli_reg_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
612
54.1k
  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
613
16.8k
    new_len = *prev_code_len;
614
16.8k
    extra_bits = 2;
615
16.8k
  }
616
54.1k
  if (*repeat_code_len != new_len) {
617
19.5k
    *repeat = 0;
618
19.5k
    *repeat_code_len = new_len;
619
19.5k
  }
620
54.1k
  old_repeat = *repeat;
621
54.1k
  if (*repeat > 0) {
622
16.7k
    *repeat -= 2;
623
16.7k
    *repeat <<= extra_bits;
624
16.7k
  }
625
54.1k
  *repeat += repeat_delta + 3U;
626
54.1k
  repeat_delta = *repeat - old_repeat;
627
54.1k
  if (*symbol + repeat_delta > alphabet_size) {
628
18
    BROTLI_DUMP();
629
18
    *symbol = alphabet_size;
630
18
    *space = 0xFFFFF;
631
18
    return;
632
18
  }
633
54.1k
  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
634
54.1k
      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
635
54.1k
  if (*repeat_code_len != 0) {
636
16.8k
    brotli_reg_t last = *symbol + repeat_delta;
637
16.8k
    int next = next_symbol[*repeat_code_len];
638
141k
    do {
639
141k
      symbol_lists[next] = (uint16_t)*symbol;
640
141k
      next = (int)*symbol;
641
141k
    } while (++(*symbol) != last);
642
16.8k
    next_symbol[*repeat_code_len] = next;
643
16.8k
    *space -= repeat_delta << (15 - *repeat_code_len);
644
16.8k
    code_length_histo[*repeat_code_len] =
645
16.8k
        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
646
37.3k
  } else {
647
37.3k
    *symbol += repeat_delta;
648
37.3k
  }
649
54.1k
}
650
651
/* Reads and decodes symbol codelengths. */
652
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
653
5.68k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
654
5.68k
  BrotliBitReader* br = &s->br;
655
5.68k
  BrotliMetablockHeaderArena* h = &s->arena.header;
656
5.68k
  brotli_reg_t symbol = h->symbol;
657
5.68k
  brotli_reg_t repeat = h->repeat;
658
5.68k
  brotli_reg_t space = h->space;
659
5.68k
  brotli_reg_t prev_code_len = h->prev_code_len;
660
5.68k
  brotli_reg_t repeat_code_len = h->repeat_code_len;
661
5.68k
  uint16_t* symbol_lists = h->symbol_lists;
662
5.68k
  uint16_t* code_length_histo = h->code_length_histo;
663
5.68k
  int* next_symbol = h->next_symbol;
664
5.68k
  if (!BrotliWarmupBitReader(br)) {
665
3
    return BROTLI_DECODER_NEEDS_MORE_INPUT;
666
3
  }
667
140k
  while (symbol < alphabet_size && space > 0) {
668
134k
    const HuffmanCode* p = h->table;
669
134k
    brotli_reg_t code_len;
670
134k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
671
134k
    if (!BrotliCheckInputAmount(br)) {
672
65
      h->symbol = symbol;
673
65
      h->repeat = repeat;
674
65
      h->prev_code_len = prev_code_len;
675
65
      h->repeat_code_len = repeat_code_len;
676
65
      h->space = space;
677
65
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
678
65
    }
679
134k
    BrotliFillBitWindow16(br);
680
134k
    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
681
134k
        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
682
134k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
683
134k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
684
134k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
685
80.9k
      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
686
80.9k
          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
687
80.9k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
688
53.4k
      brotli_reg_t extra_bits =
689
53.4k
          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
690
53.4k
      brotli_reg_t repeat_delta =
691
53.4k
          BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
692
53.4k
      BrotliDropBits(br, extra_bits);
693
53.4k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
694
53.4k
          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
695
53.4k
          symbol_lists, code_length_histo, next_symbol);
696
53.4k
    }
697
134k
  }
698
5.62k
  h->space = space;
699
5.62k
  return BROTLI_DECODER_SUCCESS;
700
5.68k
}
701
702
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
703
68
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
704
68
  BrotliBitReader* br = &s->br;
705
68
  BrotliMetablockHeaderArena* h = &s->arena.header;
706
68
  BROTLI_BOOL get_byte = BROTLI_FALSE;
707
2.09k
  while (h->symbol < alphabet_size && h->space > 0) {
708
2.04k
    const HuffmanCode* p = h->table;
709
2.04k
    brotli_reg_t code_len;
710
2.04k
    brotli_reg_t available_bits;
711
2.04k
    brotli_reg_t bits = 0;
712
2.04k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
713
2.04k
    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
714
2.02k
    get_byte = BROTLI_FALSE;
715
2.02k
    available_bits = BrotliGetAvailableBits(br);
716
2.02k
    if (available_bits != 0) {
717
1.83k
      bits = (uint32_t)BrotliGetBitsUnmasked(br);
718
1.83k
    }
719
2.02k
    BROTLI_HC_ADJUST_TABLE_INDEX(p,
720
2.02k
        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
721
2.02k
    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
722
232
      get_byte = BROTLI_TRUE;
723
232
      continue;
724
232
    }
725
1.79k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
726
1.79k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
727
821
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
728
821
      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
729
821
          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
730
821
          h->next_symbol);
731
975
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
732
975
      brotli_reg_t extra_bits = code_len - 14U;
733
975
      brotli_reg_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
734
975
          BitMask(extra_bits);
735
975
      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
736
274
        get_byte = BROTLI_TRUE;
737
274
        continue;
738
274
      }
739
701
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
740
701
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
741
701
          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
742
701
          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
743
701
          h->next_symbol);
744
701
    }
745
1.79k
  }
746
49
  return BROTLI_DECODER_SUCCESS;
747
68
}
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.79k
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
752
5.79k
  BrotliBitReader* br = &s->br;
753
5.79k
  BrotliMetablockHeaderArena* h = &s->arena.header;
754
5.79k
  brotli_reg_t num_codes = h->repeat;
755
5.79k
  brotli_reg_t space = h->space;
756
5.79k
  brotli_reg_t i = h->sub_loop_counter;
757
45.5k
  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
758
45.5k
    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
759
45.5k
    brotli_reg_t ix;
760
45.5k
    brotli_reg_t v;
761
45.5k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
762
13
      brotli_reg_t available_bits = BrotliGetAvailableBits(br);
763
13
      if (available_bits != 0) {
764
9
        ix = BrotliGetBitsUnmasked(br) & 0xF;
765
9
      } else {
766
4
        ix = 0;
767
4
      }
768
13
      if (kCodeLengthPrefixLength[ix] > available_bits) {
769
6
        h->sub_loop_counter = i;
770
6
        h->repeat = num_codes;
771
6
        h->space = space;
772
6
        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
773
6
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
774
6
      }
775
13
    }
776
45.4k
    v = kCodeLengthPrefixValue[ix];
777
45.4k
    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
778
45.4k
    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
779
45.4k
    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
780
45.4k
    if (v != 0) {
781
31.2k
      space = space - (32U >> v);
782
31.2k
      ++num_codes;
783
31.2k
      ++h->code_length_histo[v];
784
31.2k
      if (space - 1U >= 32U) {
785
        /* space is 0 or wrapped around. */
786
5.71k
        break;
787
5.71k
      }
788
31.2k
    }
789
45.4k
  }
790
5.79k
  if (!(num_codes == 1 || space == 0)) {
791
101
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
792
101
  }
793
5.68k
  return BROTLI_DECODER_SUCCESS;
794
5.79k
}
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
10.0k
                                              BrotliDecoderState* s) {
812
10.0k
  BrotliBitReader* br = &s->br;
813
10.0k
  BrotliMetablockHeaderArena* h = &s->arena.header;
814
  /* State machine. */
815
15.8k
  for (;;) {
816
15.8k
    switch (h->substate_huffman) {
817
10.0k
      case BROTLI_STATE_HUFFMAN_NONE:
818
10.0k
        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
819
5
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
820
5
        }
821
10.0k
        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
10.0k
        if (h->sub_loop_counter != 1) {
826
5.79k
          h->space = 32;
827
5.79k
          h->repeat = 0;  /* num_codes */
828
5.79k
          memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) *
829
5.79k
              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
830
5.79k
          memset(&h->code_length_code_lengths[0], 0,
831
5.79k
              sizeof(h->code_length_code_lengths));
832
5.79k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
833
5.79k
          continue;
834
5.79k
        }
835
      /* Fall through. */
836
837
4.29k
      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
838
        /* Read symbols, codes & code lengths directly. */
839
4.29k
        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
840
0
          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
841
0
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
842
0
        }
843
4.29k
        h->sub_loop_counter = 0;
844
      /* Fall through. */
845
846
4.29k
      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
847
4.29k
        BrotliDecoderErrorCode result =
848
4.29k
            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
849
4.29k
        if (result != BROTLI_DECODER_SUCCESS) {
850
15
          return result;
851
15
        }
852
4.29k
      }
853
      /* Fall through. */
854
855
4.28k
      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
856
4.28k
        brotli_reg_t table_size;
857
4.28k
        if (h->symbol == 3) {
858
1.06k
          brotli_reg_t bits;
859
1.06k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
860
3
            h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
861
3
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
862
3
          }
863
1.06k
          h->symbol += bits;
864
1.06k
        }
865
4.27k
        BROTLI_LOG_UINT(h->symbol);
866
4.27k
        table_size = BrotliBuildSimpleHuffmanTable(table, HUFFMAN_TABLE_BITS,
867
4.27k
                                                   h->symbols_lists_array,
868
4.27k
                                                   (uint32_t)h->symbol);
869
4.27k
        if (opt_table_size) {
870
3.14k
          *opt_table_size = table_size;
871
3.14k
        }
872
4.27k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
873
4.27k
        return BROTLI_DECODER_SUCCESS;
874
4.28k
      }
875
876
      /* Decode Huffman-coded code lengths. */
877
5.79k
      case BROTLI_STATE_HUFFMAN_COMPLEX: {
878
5.79k
        brotli_reg_t i;
879
5.79k
        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
880
5.79k
        if (result != BROTLI_DECODER_SUCCESS) {
881
107
          return result;
882
107
        }
883
5.68k
        BrotliBuildCodeLengthsHuffmanTable(h->table,
884
5.68k
                                           h->code_length_code_lengths,
885
5.68k
                                           h->code_length_histo);
886
5.68k
        memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo));
887
96.7k
        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
888
91.0k
          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
889
91.0k
          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
890
91.0k
        }
891
892
5.68k
        h->symbol = 0;
893
5.68k
        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
894
5.68k
        h->repeat = 0;
895
5.68k
        h->repeat_code_len = 0;
896
5.68k
        h->space = 32768;
897
5.68k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
898
5.68k
      }
899
      /* Fall through. */
900
901
5.68k
      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
902
5.68k
        brotli_reg_t table_size;
903
5.68k
        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
904
5.68k
            alphabet_size_limit, s);
905
5.68k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
906
68
          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
907
68
        }
908
5.68k
        if (result != BROTLI_DECODER_SUCCESS) {
909
19
          return result;
910
19
        }
911
912
5.67k
        if (h->space != 0) {
913
43
          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
914
43
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
915
43
        }
916
5.62k
        table_size = BrotliBuildHuffmanTable(
917
5.62k
            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
918
5.62k
        if (opt_table_size) {
919
3.71k
          *opt_table_size = table_size;
920
3.71k
        }
921
5.62k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
922
5.62k
        return BROTLI_DECODER_SUCCESS;
923
5.67k
      }
924
925
0
      default:
926
0
        return
927
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
928
15.8k
    }
929
15.8k
  }
930
10.0k
}
931
932
/* Decodes a block length by reading 3..39 bits. */
933
static BROTLI_INLINE brotli_reg_t ReadBlockLength(const HuffmanCode* table,
934
1.93M
                                                  BrotliBitReader* br) {
935
1.93M
  brotli_reg_t code;
936
1.93M
  brotli_reg_t nbits;
937
1.93M
  code = ReadSymbol(table, br);
938
1.93M
  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
939
1.93M
  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
940
1.93M
}
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
8.25k
    BrotliBitReader* br) {
947
8.25k
  brotli_reg_t index;
948
8.25k
  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
949
8.25k
    if (!SafeReadSymbol(table, br, &index)) {
950
30
      return BROTLI_FALSE;
951
30
    }
952
8.25k
  } else {
953
0
    index = s->block_length_index;
954
0
  }
955
8.22k
  {
956
8.22k
    brotli_reg_t bits;
957
8.22k
    brotli_reg_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
958
8.22k
    brotli_reg_t offset = _kBrotliPrefixCodeRanges[index].offset;
959
8.22k
    if (!BrotliSafeReadBits(br, nbits, &bits)) {
960
57
      s->block_length_index = index;
961
57
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
962
57
      return BROTLI_FALSE;
963
57
    }
964
8.16k
    *result = offset + bits;
965
8.16k
    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
966
8.16k
    return BROTLI_TRUE;
967
8.22k
  }
968
8.22k
}
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
886
    uint8_t* v, brotli_reg_t v_len, BrotliDecoderState* state) {
986
  /* Reinitialize elements that could have been changed. */
987
886
  brotli_reg_t i = 1;
988
886
  brotli_reg_t upper_bound = state->mtf_upper_bound;
989
886
  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
990
886
  uint8_t* mtf_u8 = (uint8_t*)mtf;
991
  /* Load endian-aware constant. */
992
886
  const uint8_t b0123[4] = {0, 1, 2, 3};
993
886
  uint32_t pattern;
994
886
  memcpy(&pattern, &b0123, 4);
995
996
  /* Initialize list using 4 consequent values pattern. */
997
886
  mtf[0] = pattern;
998
55.5k
  do {
999
55.5k
    pattern += 0x04040404;  /* Advance all 4 values by 4. */
1000
55.5k
    mtf[i] = pattern;
1001
55.5k
    i++;
1002
55.5k
  } while (i <= upper_bound);
1003
1004
  /* Transform the input. */
1005
886
  upper_bound = 0;
1006
77.1k
  for (i = 0; i < v_len; ++i) {
1007
76.3k
    int index = v[i];
1008
76.3k
    uint8_t value = mtf_u8[index];
1009
76.3k
    upper_bound |= v[i];
1010
76.3k
    v[i] = value;
1011
76.3k
    mtf_u8[-1] = value;
1012
441k
    do {
1013
441k
      index--;
1014
441k
      mtf_u8[index + 1] = mtf_u8[index];
1015
441k
    } while (index >= 0);
1016
76.3k
  }
1017
  /* Remember amount of elements to be reinitialized. */
1018
886
  state->mtf_upper_bound = upper_bound >> 2;
1019
886
}
1020
1021
/* Decodes a series of Huffman table using ReadHuffmanCode function. */
1022
static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
1023
3.74k
    HuffmanTreeGroup* group, BrotliDecoderState* s) {
1024
3.74k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1025
3.74k
  if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
1026
3.74k
    h->next = group->codes;
1027
3.74k
    h->htree_index = 0;
1028
3.74k
    h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
1029
3.74k
  }
1030
10.6k
  while (h->htree_index < group->num_htrees) {
1031
7.00k
    brotli_reg_t table_size;
1032
7.00k
    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
1033
7.00k
        group->alphabet_size_limit, h->next, &table_size, s);
1034
7.00k
    if (result != BROTLI_DECODER_SUCCESS) return result;
1035
6.85k
    group->htrees[h->htree_index] = h->next;
1036
6.85k
    h->next += table_size;
1037
6.85k
    ++h->htree_index;
1038
6.85k
  }
1039
3.60k
  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
1040
3.60k
  return BROTLI_DECODER_SUCCESS;
1041
3.74k
}
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
2.71k
                                               BrotliDecoderState* s) {
1055
2.71k
  BrotliBitReader* br = &s->br;
1056
2.71k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1057
2.71k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1058
1059
2.71k
  switch ((int)h->substate_context_map) {
1060
2.71k
    case BROTLI_STATE_CONTEXT_MAP_NONE:
1061
2.71k
      result = DecodeVarLenUint8(s, br, num_htrees);
1062
2.71k
      if (result != BROTLI_DECODER_SUCCESS) {
1063
0
        return result;
1064
0
      }
1065
2.71k
      (*num_htrees)++;
1066
2.71k
      h->context_index = 0;
1067
2.71k
      BROTLI_LOG_UINT(context_map_size);
1068
2.71k
      BROTLI_LOG_UINT(*num_htrees);
1069
2.71k
      *context_map_arg =
1070
2.71k
          (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
1071
2.71k
      if (*context_map_arg == 0) {
1072
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
1073
0
      }
1074
2.71k
      if (*num_htrees <= 1) {
1075
1.73k
        memset(*context_map_arg, 0, (size_t)context_map_size);
1076
1.73k
        return BROTLI_DECODER_SUCCESS;
1077
1.73k
      }
1078
984
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
1079
    /* Fall through. */
1080
1081
984
    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
1082
984
      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
984
      if (!BrotliSafeGetBits(br, 5, &bits)) {
1086
2
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1087
2
      }
1088
982
      if ((bits & 1) != 0) { /* Use RLE for zeros. */
1089
925
        h->max_run_length_prefix = (bits >> 1) + 1;
1090
925
        BrotliDropBits(br, 5);
1091
925
      } else {
1092
57
        h->max_run_length_prefix = 0;
1093
57
        BrotliDropBits(br, 1);
1094
57
      }
1095
982
      BROTLI_LOG_UINT(h->max_run_length_prefix);
1096
982
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
1097
982
    }
1098
    /* Fall through. */
1099
1100
982
    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
1101
982
      brotli_reg_t alphabet_size = *num_htrees + h->max_run_length_prefix;
1102
982
      result = ReadHuffmanCode(alphabet_size, alphabet_size,
1103
982
                               h->context_map_table, NULL, s);
1104
982
      if (result != BROTLI_DECODER_SUCCESS) return result;
1105
957
      h->code = 0xFFFF;
1106
957
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
1107
957
    }
1108
    /* Fall through. */
1109
1110
957
    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
1111
957
      brotli_reg_t context_index = h->context_index;
1112
957
      brotli_reg_t max_run_length_prefix = h->max_run_length_prefix;
1113
957
      uint8_t* context_map = *context_map_arg;
1114
957
      brotli_reg_t code = h->code;
1115
957
      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
1116
86.6k
      while (context_index < context_map_size || skip_preamble) {
1117
85.6k
        if (!skip_preamble) {
1118
85.6k
          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
1119
0
            h->code = 0xFFFF;
1120
0
            h->context_index = context_index;
1121
0
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1122
0
          }
1123
85.6k
          BROTLI_LOG_UINT(code);
1124
1125
85.6k
          if (code == 0) {
1126
1.85k
            context_map[context_index++] = 0;
1127
1.85k
            continue;
1128
1.85k
          }
1129
83.8k
          if (code > max_run_length_prefix) {
1130
79.3k
            context_map[context_index++] =
1131
79.3k
                (uint8_t)(code - max_run_length_prefix);
1132
79.3k
            continue;
1133
79.3k
          }
1134
83.8k
        } else {
1135
0
          skip_preamble = BROTLI_FALSE;
1136
0
        }
1137
        /* RLE sub-stage. */
1138
4.44k
        {
1139
4.44k
          brotli_reg_t reps;
1140
4.44k
          if (!BrotliSafeReadBits(br, code, &reps)) {
1141
2
            h->code = code;
1142
2
            h->context_index = context_index;
1143
2
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1144
2
          }
1145
4.44k
          reps += (brotli_reg_t)1U << code;
1146
4.44k
          BROTLI_LOG_UINT(reps);
1147
4.44k
          if (context_index + reps > context_map_size) {
1148
12
            return
1149
12
                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
1150
12
          }
1151
50.4k
          do {
1152
50.4k
            context_map[context_index++] = 0;
1153
50.4k
          } while (--reps);
1154
4.43k
        }
1155
4.43k
      }
1156
957
    }
1157
    /* Fall through. */
1158
1159
943
    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1160
943
      brotli_reg_t bits;
1161
943
      if (!BrotliSafeReadBits(br, 1, &bits)) {
1162
4
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
1163
4
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1164
4
      }
1165
939
      if (bits != 0) {
1166
886
        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
1167
886
      }
1168
939
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
1169
939
      return BROTLI_DECODER_SUCCESS;
1170
943
    }
1171
1172
0
    default:
1173
0
      return
1174
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1175
2.71k
  }
1176
2.71k
}
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
1.94M
    int safe, BrotliDecoderState* s, int tree_type) {
1182
1.94M
  brotli_reg_t max_block_type = s->num_block_types[tree_type];
1183
1.94M
  const HuffmanCode* type_tree = &s->block_type_trees[
1184
1.94M
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
1185
1.94M
  const HuffmanCode* len_tree = &s->block_len_trees[
1186
1.94M
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1187
1.94M
  BrotliBitReader* br = &s->br;
1188
1.94M
  brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1189
1.94M
  brotli_reg_t block_type;
1190
1.94M
  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
1.94M
  if (!safe) {
1196
1.93M
    block_type = ReadSymbol(type_tree, br);
1197
1.93M
    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1198
1.93M
  } else {
1199
7.24k
    BrotliBitReaderState memento;
1200
7.24k
    BrotliBitReaderSaveState(br, &memento);
1201
7.24k
    if (!SafeReadSymbol(type_tree, br, &block_type)) {
1202
38
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1203
38
    }
1204
7.21k
    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1205
87
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1206
87
      BrotliBitReaderRestoreState(br, &memento);
1207
87
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1208
87
    }
1209
7.21k
  }
1210
1211
1.94M
  if (block_type == 1) {
1212
1.81M
    block_type = ringbuffer[1] + 1;
1213
1.81M
  } else if (block_type == 0) {
1214
116k
    block_type = ringbuffer[0];
1215
116k
  } else {
1216
8.12k
    block_type -= 2;
1217
8.12k
  }
1218
1.94M
  if (block_type >= max_block_type) {
1219
375k
    block_type -= max_block_type;
1220
375k
  }
1221
1.94M
  ringbuffer[0] = ringbuffer[1];
1222
1.94M
  ringbuffer[1] = block_type;
1223
1.94M
  return BROTLI_DECODER_SUCCESS;
1224
1.94M
}
1225
1226
static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
1227
1.35k
    BrotliDecoderState* s) {
1228
1.35k
  size_t i;
1229
12.1k
  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1230
4.51k
  for (i = 0; i < s->num_block_types[0]; i++) {
1231
3.16k
    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1232
3.16k
    size_t error = 0;
1233
3.16k
    size_t sample = s->context_map[offset];
1234
3.16k
    size_t j;
1235
53.8k
    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1236
      /* NOLINTNEXTLINE(bugprone-macro-repeated-side-effects) */
1237
50.6k
      BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
1238
50.6k
    }
1239
3.16k
    if (error == 0) {
1240
1.40k
      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1241
1.40k
    }
1242
3.16k
  }
1243
1.35k
}
1244
1245
1.87M
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1246
1.87M
  uint8_t context_mode;
1247
1.87M
  size_t trivial;
1248
1.87M
  brotli_reg_t block_type = s->block_type_rb[1];
1249
1.87M
  brotli_reg_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1250
1.87M
  s->context_map_slice = s->context_map + context_offset;
1251
1.87M
  trivial = s->trivial_literal_contexts[block_type >> 5];
1252
1.87M
  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1253
1.87M
  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1254
1.87M
  context_mode = s->context_modes[block_type] & 3;
1255
1.87M
  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
1256
1.87M
}
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
1.87M
    int safe, BrotliDecoderState* s) {
1262
1.87M
  BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 0);
1263
1.87M
  if (result != BROTLI_DECODER_SUCCESS) {
1264
46
    return result;
1265
46
  }
1266
1.87M
  PrepareLiteralDecoding(s);
1267
1.87M
  return BROTLI_DECODER_SUCCESS;
1268
1.87M
}
1269
1270
static BROTLI_NOINLINE BrotliDecoderErrorCode
1271
1.87M
DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1272
1.87M
  return DecodeLiteralBlockSwitchInternal(0, s);
1273
1.87M
}
1274
1275
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeDecodeLiteralBlockSwitch(
1276
4.22k
    BrotliDecoderState* s) {
1277
4.22k
  return DecodeLiteralBlockSwitchInternal(1, s);
1278
4.22k
}
1279
1280
/* Block switch for insert/copy length.
1281
   Reads 3..54 bits. */
1282
static BROTLI_INLINE BrotliDecoderErrorCode DecodeCommandBlockSwitchInternal(
1283
51.8k
    int safe, BrotliDecoderState* s) {
1284
51.8k
  BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 1);
1285
51.8k
  if (result != BROTLI_DECODER_SUCCESS) {
1286
44
    return result;
1287
44
  }
1288
51.8k
  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
1289
51.8k
  return BROTLI_DECODER_SUCCESS;
1290
51.8k
}
1291
1292
static BROTLI_NOINLINE BrotliDecoderErrorCode
1293
49.7k
DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1294
49.7k
  return DecodeCommandBlockSwitchInternal(0, s);
1295
49.7k
}
1296
1297
static BROTLI_NOINLINE BrotliDecoderErrorCode
1298
2.15k
SafeDecodeCommandBlockSwitch(BrotliDecoderState* s) {
1299
2.15k
  return DecodeCommandBlockSwitchInternal(1, s);
1300
2.15k
}
1301
1302
/* Block switch for distance codes.
1303
   Reads 3..54 bits. */
1304
static BROTLI_INLINE BrotliDecoderErrorCode DecodeDistanceBlockSwitchInternal(
1305
16.2k
    int safe, BrotliDecoderState* s) {
1306
16.2k
  BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 2);
1307
16.2k
  if (result != BROTLI_DECODER_SUCCESS) {
1308
35
    return result;
1309
35
  }
1310
16.1k
  s->dist_context_map_slice = s->dist_context_map +
1311
16.1k
      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
1312
16.1k
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1313
16.1k
  return BROTLI_DECODER_SUCCESS;
1314
16.2k
}
1315
1316
static BROTLI_NOINLINE BrotliDecoderErrorCode
1317
15.3k
DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
1318
15.3k
  return DecodeDistanceBlockSwitchInternal(0, s);
1319
15.3k
}
1320
1321
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
1322
867
    BrotliDecoderState* s) {
1323
867
  return DecodeDistanceBlockSwitchInternal(1, s);
1324
867
}
1325
1326
2.34k
static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
1327
2.34k
  size_t pos = wrap && s->pos > s->ringbuffer_size ?
1328
2.32k
      (size_t)s->ringbuffer_size : (size_t)(s->pos);
1329
2.34k
  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
1330
2.34k
  return partial_pos_rb - s->partial_pos_out;
1331
2.34k
}
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
2.34k
    size_t* total_out, BROTLI_BOOL force) {
1339
2.34k
  uint8_t* start =
1340
2.34k
      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
1341
2.34k
  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1342
2.34k
  size_t num_written = *available_out;
1343
2.34k
  if (num_written > to_write) {
1344
901
    num_written = to_write;
1345
901
  }
1346
2.34k
  if (s->meta_block_remaining_len < 0) {
1347
45
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
1348
45
  }
1349
2.30k
  if (next_out && !*next_out) {
1350
0
    *next_out = start;
1351
2.30k
  } else {
1352
2.30k
    if (next_out) {
1353
2.30k
      memcpy(*next_out, start, num_written);
1354
2.30k
      *next_out += num_written;
1355
2.30k
    }
1356
2.30k
  }
1357
2.30k
  *available_out -= num_written;
1358
2.30k
  BROTLI_LOG_UINT(to_write);
1359
2.30k
  BROTLI_LOG_UINT(num_written);
1360
2.30k
  s->partial_pos_out += num_written;
1361
2.30k
  if (total_out) {
1362
2.30k
    *total_out = s->partial_pos_out;
1363
2.30k
  }
1364
2.30k
  if (num_written < to_write) {
1365
1.38k
    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
1366
1.38k
      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
1367
1.38k
    } else {
1368
0
      return BROTLI_DECODER_SUCCESS;
1369
0
    }
1370
1.38k
  }
1371
  /* Wrap ring buffer only if it has reached its maximal size. */
1372
915
  if (s->ringbuffer_size == (1 << s->window_bits) &&
1373
308
      s->pos >= s->ringbuffer_size) {
1374
275
    s->pos -= s->ringbuffer_size;
1375
275
    s->rb_roundtrips++;
1376
275
    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1377
275
  }
1378
915
  return BROTLI_DECODER_SUCCESS;
1379
2.30k
}
1380
1381
132
static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1382
132
  if (s->should_wrap_ringbuffer) {
1383
6
    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1384
6
    s->should_wrap_ringbuffer = 0;
1385
6
  }
1386
132
}
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
3.65k
    BrotliDecoderState* s) {
1397
3.65k
  uint8_t* old_ringbuffer = s->ringbuffer;
1398
3.65k
  if (s->ringbuffer_size == s->new_ringbuffer_size) {
1399
2.14k
    return BROTLI_TRUE;
1400
2.14k
  }
1401
1402
1.50k
  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
1403
1.50k
      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
1404
1.50k
  if (s->ringbuffer == 0) {
1405
    /* Restore previous value. */
1406
0
    s->ringbuffer = old_ringbuffer;
1407
0
    return BROTLI_FALSE;
1408
0
  }
1409
1.50k
  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1410
1.50k
  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
1411
1412
1.50k
  if (!!old_ringbuffer) {
1413
210
    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1414
210
    BROTLI_DECODER_FREE(s, old_ringbuffer);
1415
210
  }
1416
1417
1.50k
  s->ringbuffer_size = s->new_ringbuffer_size;
1418
1.50k
  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1419
1.50k
  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1420
1421
1.50k
  return BROTLI_TRUE;
1422
1.50k
}
1423
1424
static BrotliDecoderErrorCode BROTLI_NOINLINE
1425
2.86k
SkipMetadataBlock(BrotliDecoderState* s) {
1426
2.86k
  BrotliBitReader* br = &s->br;
1427
2.86k
  int nbytes;
1428
1429
2.86k
  if (s->meta_block_remaining_len == 0) {
1430
2.65k
    return BROTLI_DECODER_SUCCESS;
1431
2.65k
  }
1432
1433
217
  BROTLI_DCHECK((BrotliGetAvailableBits(br) & 7) == 0);
1434
1435
  /* Drain accumulator. */
1436
217
  if (BrotliGetAvailableBits(br) >= 8) {
1437
0
    uint8_t buffer[8];
1438
0
    nbytes = (int)(BrotliGetAvailableBits(br)) >> 3;
1439
0
    BROTLI_DCHECK(nbytes <= 8);
1440
0
    if (nbytes > s->meta_block_remaining_len) {
1441
0
      nbytes = s->meta_block_remaining_len;
1442
0
    }
1443
0
    BrotliCopyBytes(buffer, br, (size_t)nbytes);
1444
0
    if (s->metadata_chunk_func) {
1445
0
      s->metadata_chunk_func(s->metadata_callback_opaque, buffer,
1446
0
                             (size_t)nbytes);
1447
0
    }
1448
0
    s->meta_block_remaining_len -= nbytes;
1449
0
    if (s->meta_block_remaining_len == 0) {
1450
0
      return BROTLI_DECODER_SUCCESS;
1451
0
    }
1452
0
  }
1453
1454
  /* Direct access to metadata is possible. */
1455
217
  nbytes = (int)BrotliGetRemainingBytes(br);
1456
217
  if (nbytes > s->meta_block_remaining_len) {
1457
205
    nbytes = s->meta_block_remaining_len;
1458
205
  }
1459
217
  if (nbytes > 0) {
1460
217
    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
217
    BrotliDropBytes(br, (size_t)nbytes);
1465
217
    s->meta_block_remaining_len -= nbytes;
1466
217
    if (s->meta_block_remaining_len == 0) {
1467
205
      return BROTLI_DECODER_SUCCESS;
1468
205
    }
1469
217
  }
1470
1471
12
  BROTLI_DCHECK(BrotliGetRemainingBytes(br) == 0);
1472
1473
12
  return BROTLI_DECODER_NEEDS_MORE_INPUT;
1474
217
}
1475
1476
static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1477
    size_t* available_out, uint8_t** next_out, size_t* total_out,
1478
2.47k
    BrotliDecoderState* s) {
1479
  /* TODO(eustas): avoid allocation for single uncompressed block. */
1480
2.47k
  if (!BrotliEnsureRingBuffer(s)) {
1481
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
1482
0
  }
1483
1484
  /* State machine */
1485
2.61k
  for (;;) {
1486
2.61k
    switch (s->substate_uncompressed) {
1487
2.61k
      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1488
2.61k
        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1489
2.61k
        if (nbytes > s->meta_block_remaining_len) {
1490
2.44k
          nbytes = s->meta_block_remaining_len;
1491
2.44k
        }
1492
2.61k
        if (s->pos + nbytes > s->ringbuffer_size) {
1493
140
          nbytes = s->ringbuffer_size - s->pos;
1494
140
        }
1495
        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1496
2.61k
        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1497
2.61k
        s->pos += nbytes;
1498
2.61k
        s->meta_block_remaining_len -= nbytes;
1499
2.61k
        if (s->pos < 1 << s->window_bits) {
1500
2.47k
          if (s->meta_block_remaining_len == 0) {
1501
2.43k
            return BROTLI_DECODER_SUCCESS;
1502
2.43k
          }
1503
43
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
1504
2.47k
        }
1505
143
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1506
143
      }
1507
      /* Fall through. */
1508
1509
143
      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1510
143
        BrotliDecoderErrorCode result;
1511
143
        result = WriteRingBuffer(
1512
143
            s, available_out, next_out, total_out, BROTLI_FALSE);
1513
143
        if (result != BROTLI_DECODER_SUCCESS) {
1514
0
          return result;
1515
0
        }
1516
143
        if (s->ringbuffer_size == 1 << s->window_bits) {
1517
143
          s->max_distance = s->max_backward_distance;
1518
143
        }
1519
143
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1520
143
        break;
1521
143
      }
1522
2.61k
    }
1523
2.61k
  }
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
2.28k
static uint32_t GetCompoundDictionarySize(BrotliDecoderState* s) {
1609
2.28k
  return s->compound_dictionary ? s->compound_dictionary->total_size : 0u;
1610
2.28k
}
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.86k
    BrotliDecoderState* s) {
1666
3.86k
  int window_size = 1 << s->window_bits;
1667
3.86k
  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.86k
  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
1671
3.86k
  int output_size;
1672
1673
  /* If maximum is already reached, no further extension is retired. */
1674
3.86k
  if (s->ringbuffer_size == window_size) {
1675
290
    return;
1676
290
  }
1677
1678
  /* Metadata blocks does not touch ring buffer. */
1679
3.57k
  if (s->is_metadata) {
1680
0
    return;
1681
0
  }
1682
1683
3.57k
  if (!s->ringbuffer) {
1684
1.46k
    output_size = 0;
1685
2.11k
  } else {
1686
2.11k
    output_size = s->pos;
1687
2.11k
  }
1688
3.57k
  output_size += s->meta_block_remaining_len;
1689
3.57k
  min_size = min_size < output_size ? output_size : min_size;
1690
1691
3.57k
  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
20.5k
    while ((new_ringbuffer_size >> 1) >= min_size) {
1696
16.9k
      new_ringbuffer_size >>= 1;
1697
16.9k
    }
1698
3.57k
  }
1699
1700
3.57k
  s->new_ringbuffer_size = new_ringbuffer_size;
1701
3.57k
}
1702
1703
/* Reads 1..256 2-bit context modes. */
1704
1.36k
static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1705
1.36k
  BrotliBitReader* br = &s->br;
1706
1.36k
  int i = s->loop_counter;
1707
1708
4.72k
  while (i < (int)s->num_block_types[0]) {
1709
3.35k
    brotli_reg_t bits;
1710
3.35k
    if (!BrotliSafeReadBits(br, 2, &bits)) {
1711
0
      s->loop_counter = i;
1712
0
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1713
0
    }
1714
3.35k
    s->context_modes[i] = (uint8_t)bits;
1715
3.35k
    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1716
3.35k
    i++;
1717
3.35k
  }
1718
1.36k
  return BROTLI_DECODER_SUCCESS;
1719
1.36k
}
1720
1721
289k
static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1722
289k
  int offset = s->distance_code - 3;
1723
289k
  if (s->distance_code <= 3) {
1724
    /* Compensate double distance-ring-buffer roll for dictionary items. */
1725
65.1k
    s->distance_context = 1 >> s->distance_code;
1726
65.1k
    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
1727
65.1k
    s->dist_rb_idx -= s->distance_context;
1728
224k
  } else {
1729
224k
    int index_delta = 3;
1730
224k
    int delta;
1731
224k
    int base = s->distance_code - 10;
1732
224k
    if (s->distance_code < 10) {
1733
209k
      base = s->distance_code - 4;
1734
209k
    } else {
1735
15.2k
      index_delta = 2;
1736
15.2k
    }
1737
    /* Unpack one of six 4-bit values. */
1738
224k
    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
1739
224k
    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
1740
224k
    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
8
      s->distance_code = 0x7FFFFFFF;
1744
8
    }
1745
224k
  }
1746
289k
}
1747
1748
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1749
24.0k
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1750
24.0k
  if (n_bits != 0) {
1751
5.48k
    return BrotliSafeReadBits(br, n_bits, val);
1752
18.5k
  } else {
1753
18.5k
    *val = 0;
1754
18.5k
    return BROTLI_TRUE;
1755
18.5k
  }
1756
24.0k
}
1757
1758
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
1759
3.20k
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1760
3.20k
  if (n_bits != 0) {
1761
3.19k
    return BrotliSafeReadBits32(br, n_bits, val);
1762
3.19k
  } else {
1763
11
    *val = 0;
1764
11
    return BROTLI_TRUE;
1765
11
  }
1766
3.20k
}
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
1.17k
static void CalculateDistanceLut(BrotliDecoderState* s) {
1836
1.17k
  BrotliMetablockBodyArena* b = &s->arena.body;
1837
1.17k
  brotli_reg_t npostfix = s->distance_postfix_bits;
1838
1.17k
  brotli_reg_t ndirect = s->num_direct_distance_codes;
1839
1.17k
  brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
1840
1.17k
  brotli_reg_t postfix = (brotli_reg_t)1u << npostfix;
1841
1.17k
  brotli_reg_t j;
1842
1.17k
  brotli_reg_t bits = 1;
1843
1.17k
  brotli_reg_t half = 0;
1844
1845
  /* Skip short codes. */
1846
1.17k
  brotli_reg_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
1847
1848
  /* Fill direct codes. */
1849
4.77k
  for (j = 0; j < ndirect; ++j) {
1850
3.60k
    b->dist_extra_bits[i] = 0;
1851
3.60k
    b->dist_offset[i] = j + 1;
1852
3.60k
    ++i;
1853
3.60k
  }
1854
1855
  /* Fill regular distance codes. */
1856
57.6k
  while (i < alphabet_size_limit) {
1857
56.4k
    brotli_reg_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
1858
    /* Always fill the complete group. */
1859
136k
    for (j = 0; j < postfix; ++j) {
1860
79.6k
      b->dist_extra_bits[i] = (uint8_t)bits;
1861
79.6k
      b->dist_offset[i] = base + j;
1862
79.6k
      ++i;
1863
79.6k
    }
1864
56.4k
    bits = bits + half;
1865
56.4k
    half = half ^ 1;
1866
56.4k
  }
1867
1.17k
}
1868
1869
/* Precondition: s->distance_code < 0. */
1870
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
1871
934k
    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1872
934k
  BrotliMetablockBodyArena* b = &s->arena.body;
1873
934k
  brotli_reg_t code;
1874
934k
  brotli_reg_t bits;
1875
934k
  BrotliBitReaderState memento;
1876
934k
  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1877
934k
  if (!safe) {
1878
928k
    code = ReadSymbol(distance_tree, br);
1879
928k
  } else {
1880
5.78k
    BrotliBitReaderSaveState(br, &memento);
1881
5.78k
    if (!SafeReadSymbol(distance_tree, br, &code)) {
1882
14
      return BROTLI_FALSE;
1883
14
    }
1884
5.78k
  }
1885
934k
  --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
934k
  s->distance_context = 0;
1889
934k
  if ((code & ~0xFu) == 0) {
1890
289k
    s->distance_code = (int)code;
1891
289k
    TakeDistanceFromRingBuffer(s);
1892
289k
    return BROTLI_TRUE;
1893
289k
  }
1894
644k
  if (!safe) {
1895
640k
    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
1896
640k
  } else {
1897
3.20k
    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
1898
27
      ++s->block_length[2];
1899
27
      BrotliBitReaderRestoreState(br, &memento);
1900
27
      return BROTLI_FALSE;
1901
27
    }
1902
3.20k
  }
1903
644k
  s->distance_code =
1904
644k
      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
1905
644k
  return BROTLI_TRUE;
1906
644k
}
1907
1908
static BROTLI_INLINE void ReadDistance(
1909
928k
    BrotliDecoderState* s, BrotliBitReader* br) {
1910
928k
  ReadDistanceInternal(0, s, br);
1911
928k
}
1912
1913
static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
1914
5.78k
    BrotliDecoderState* s, BrotliBitReader* br) {
1915
5.78k
  return ReadDistanceInternal(1, s, br);
1916
5.78k
}
1917
1918
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
1919
1.50M
    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1920
1.50M
  brotli_reg_t cmd_code;
1921
1.50M
  brotli_reg_t insert_len_extra = 0;
1922
1.50M
  brotli_reg_t copy_length;
1923
1.50M
  CmdLutElement v;
1924
1.50M
  BrotliBitReaderState memento;
1925
1.50M
  if (!safe) {
1926
1.49M
    cmd_code = ReadSymbol(s->htree_command, br);
1927
1.49M
  } else {
1928
12.0k
    BrotliBitReaderSaveState(br, &memento);
1929
12.0k
    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
1930
29
      return BROTLI_FALSE;
1931
29
    }
1932
12.0k
  }
1933
1.50M
  v = kCmdLut[cmd_code];
1934
1.50M
  s->distance_code = v.distance_code;
1935
1.50M
  s->distance_context = v.context;
1936
1.50M
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1937
1.50M
  *insert_length = v.insert_len_offset;
1938
1.50M
  if (!safe) {
1939
1.49M
    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1940
583k
      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
1941
583k
    }
1942
1.49M
    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
1943
1.49M
  } else {
1944
12.0k
    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1945
12.0k
        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1946
51
      BrotliBitReaderRestoreState(br, &memento);
1947
51
      return BROTLI_FALSE;
1948
51
    }
1949
12.0k
  }
1950
1.50M
  s->copy_length = (int)copy_length + v.copy_len_offset;
1951
1.50M
  --s->block_length[1];
1952
1.50M
  *insert_length += (int)insert_len_extra;
1953
1.50M
  return BROTLI_TRUE;
1954
1.50M
}
1955
1956
static BROTLI_INLINE void ReadCommand(
1957
1.49M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1958
1.49M
  ReadCommandInternal(0, s, br, insert_length);
1959
1.49M
}
1960
1961
static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
1962
12.0k
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1963
12.0k
  return ReadCommandInternal(1, s, br, insert_length);
1964
12.0k
}
1965
1966
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
1967
4.60M
    int safe, BrotliBitReader* const br) {
1968
4.60M
  if (safe) {
1969
36.6k
    return BROTLI_TRUE;
1970
36.6k
  }
1971
4.56M
  return BrotliCheckInputAmount(br);
1972
4.60M
}
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
2.44M
  {                                               \
1979
2.44M
    if (safe) {                                   \
1980
17.8k
      if (!Safe##METHOD) {                        \
1981
121
        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
1982
121
        goto saveStateAndReturn;                  \
1983
121
      }                                           \
1984
2.42M
    } else {                                      \
1985
2.42M
      METHOD;                                     \
1986
2.42M
    }                                             \
1987
2.44M
  }
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
1.94M
  {                                             \
1993
1.94M
    BrotliDecoderErrorCode status;              \
1994
1.94M
    if (safe) {                                 \
1995
7.24k
      status = Safe##METHOD;                    \
1996
1.93M
    } else {                                    \
1997
1.93M
      status = METHOD;                          \
1998
1.93M
    }                                           \
1999
1.94M
    if (status != BROTLI_DECODER_SUCCESS) {     \
2000
125
      result = status;                          \
2001
125
      goto saveStateAndReturn;                  \
2002
125
    }                                           \
2003
1.94M
  }
2004
2005
static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
2006
2.28k
    int safe, BrotliDecoderState* s) {
2007
2.28k
  int pos = s->pos;
2008
2.28k
  int i = s->loop_counter;
2009
2.28k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2010
2.28k
  BrotliBitReader* br = &s->br;
2011
2.28k
  uint32_t compound_dictionary_size = GetCompoundDictionarySize(s);
2012
2013
2.28k
  if (!CheckInputAmount(safe, br)) {
2014
4
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2015
4
    goto saveStateAndReturn;
2016
4
  }
2017
2.27k
  if (!safe) {
2018
1.30k
    BROTLI_UNUSED(BrotliWarmupBitReader(br));
2019
1.30k
  }
2020
2021
  /* Jump into state machine. */
2022
2.27k
  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
2023
1.51k
    goto CommandBegin;
2024
1.51k
  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
2025
702
    goto CommandInner;
2026
702
  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
2027
4
    goto CommandPostDecodeLiterals;
2028
54
  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
2029
54
    goto CommandPostWrapCopy;
2030
54
  } else {
2031
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
2032
0
  }
2033
2034
1.56M
CommandBegin:
2035
1.56M
  if (safe) {
2036
14.2k
    s->state = BROTLI_STATE_COMMAND_BEGIN;
2037
14.2k
  }
2038
1.56M
  if (!CheckInputAmount(safe, br)) {
2039
331
    s->state = BROTLI_STATE_COMMAND_BEGIN;
2040
331
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2041
331
    goto saveStateAndReturn;
2042
331
  }
2043
1.56M
  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
2044
51.8k
    BROTLI_SAFE_WITH_STATUS(DecodeCommandBlockSwitch(s));
2045
51.8k
    goto CommandBegin;
2046
51.8k
  }
2047
  /* Read the insert/copy length in the command. */
2048
1.50M
  BROTLI_SAFE(ReadCommand(s, br, &i));
2049
1.50M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
2050
1.50M
              pos, i, s->copy_length));
2051
1.50M
  if (i == 0) {
2052
696k
    goto CommandPostDecodeLiterals;
2053
696k
  }
2054
813k
  s->meta_block_remaining_len -= i;
2055
2056
2.68M
CommandInner:
2057
2.68M
  if (safe) {
2058
12.2k
    s->state = BROTLI_STATE_COMMAND_INNER;
2059
12.2k
  }
2060
  /* Read the literals in the command. */
2061
2.68M
  if (s->trivial_literal_context) {
2062
2.63M
    brotli_reg_t bits;
2063
2.63M
    brotli_reg_t value;
2064
2.63M
    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
2065
2.63M
    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
2.62M
      int num_steps = i - 1;
2073
2.62M
      if (num_steps > 0 && ((brotli_reg_t)(num_steps) > s->block_length[0])) {
2074
        // Safe cast, since block_length < steps
2075
1.79M
        num_steps = (int)s->block_length[0];
2076
1.79M
      }
2077
2.62M
      if (s->ringbuffer_size >= pos &&
2078
2.62M
          (s->ringbuffer_size - pos) <= num_steps) {
2079
77
        num_steps = s->ringbuffer_size - pos - 1;
2080
77
      }
2081
2.62M
      if (num_steps < 0) {
2082
0
        num_steps = 0;
2083
0
      }
2084
2.62M
      num_steps = BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits,
2085
2.62M
                                                 &value, s->ringbuffer, pos,
2086
2.62M
                                                 num_steps);
2087
2.62M
      pos += num_steps;
2088
2.62M
      s->block_length[0] -= (brotli_reg_t)num_steps;
2089
2.62M
      i -= num_steps;
2090
2.62M
      do {
2091
2.62M
        if (!CheckInputAmount(safe, br)) {
2092
237
          s->state = BROTLI_STATE_COMMAND_INNER;
2093
237
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2094
237
          goto saveStateAndReturn;
2095
237
        }
2096
2.62M
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2097
1.87M
          goto NextLiteralBlock;
2098
1.87M
        }
2099
757k
        BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, &value,
2100
757k
                                       s->ringbuffer, pos, 1);
2101
757k
        --s->block_length[0];
2102
757k
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2103
757k
        ++pos;
2104
757k
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2105
84
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2106
84
          --i;
2107
84
          goto saveStateAndReturn;
2108
84
        }
2109
757k
      } while (--i != 0);
2110
2.62M
    } else { /* safe */
2111
98.9k
      do {
2112
98.9k
        brotli_reg_t literal;
2113
98.9k
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2114
4.22k
          goto NextLiteralBlock;
2115
4.22k
        }
2116
94.7k
        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
2117
114
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2118
114
          goto saveStateAndReturn;
2119
114
        }
2120
94.6k
        s->ringbuffer[pos] = (uint8_t)literal;
2121
94.6k
        --s->block_length[0];
2122
94.6k
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2123
94.6k
        ++pos;
2124
94.6k
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2125
0
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2126
0
          --i;
2127
0
          goto saveStateAndReturn;
2128
0
        }
2129
94.6k
      } while (--i != 0);
2130
9.39k
    }
2131
2.63M
  } else {
2132
50.9k
    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2133
50.9k
    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2134
412k
    do {
2135
412k
      const HuffmanCode* hc;
2136
412k
      uint8_t context;
2137
412k
      if (!CheckInputAmount(safe, br)) {
2138
401
        s->state = BROTLI_STATE_COMMAND_INNER;
2139
401
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2140
401
        goto saveStateAndReturn;
2141
401
      }
2142
412k
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2143
0
        goto NextLiteralBlock;
2144
0
      }
2145
412k
      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
2146
412k
      BROTLI_LOG_UINT(context);
2147
412k
      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
2148
412k
      p2 = p1;
2149
412k
      if (!safe) {
2150
390k
        p1 = (uint8_t)ReadSymbol(hc, br);
2151
390k
      } else {
2152
21.4k
        brotli_reg_t literal;
2153
21.4k
        if (!SafeReadSymbol(hc, br, &literal)) {
2154
52
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2155
52
          goto saveStateAndReturn;
2156
52
        }
2157
21.3k
        p1 = (uint8_t)literal;
2158
21.3k
      }
2159
412k
      s->ringbuffer[pos] = p1;
2160
412k
      --s->block_length[0];
2161
412k
      BROTLI_LOG_UINT(s->context_map_slice[context]);
2162
412k
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
2163
412k
      ++pos;
2164
412k
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2165
20
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2166
20
        --i;
2167
20
        goto saveStateAndReturn;
2168
20
      }
2169
412k
    } while (--i != 0);
2170
50.9k
  }
2171
812k
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2172
812k
  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
2173
264
    s->state = BROTLI_STATE_METABLOCK_DONE;
2174
264
    goto saveStateAndReturn;
2175
264
  }
2176
2177
1.50M
CommandPostDecodeLiterals:
2178
1.50M
  if (safe) {
2179
12.1k
    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2180
12.1k
  }
2181
1.50M
  if (s->distance_code >= 0) {
2182
    /* Implicit distance case. */
2183
575k
    s->distance_context = s->distance_code ? 0 : 1;
2184
575k
    --s->dist_rb_idx;
2185
575k
    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
2186
934k
  } else {
2187
    /* Read distance code in the command, unless it was implicitly zero. */
2188
934k
    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
2189
16.2k
      BROTLI_SAFE_WITH_STATUS(DecodeDistanceBlockSwitch(s));
2190
16.1k
    }
2191
934k
    BROTLI_SAFE(ReadDistance(s, br));
2192
934k
  }
2193
1.50M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
2194
1.50M
              pos, s->distance_code));
2195
1.50M
  if (s->max_distance != s->max_backward_distance) {
2196
965k
    s->max_distance =
2197
965k
        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
2198
965k
  }
2199
1.50M
  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
1.50M
  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
121k
    if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
2207
8
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2208
8
          "len: %d bytes left: %d\n",
2209
8
          pos, s->distance_code, i, s->meta_block_remaining_len));
2210
8
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
2211
8
    }
2212
    /* Check that LZ77-dictionary address is non-negative. */
2213
121k
    if ((uint32_t)(s->distance_code - s->max_distance) - 1u <
2214
121k
        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
121k
    } else if (i >= SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
2231
121k
               i <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
2232
121k
      uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2233
121k
      uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2234
121k
      uint8_t dict_id = s->dictionary->context_based ?
2235
0
          s->dictionary->context_map[BROTLI_CONTEXT(p1, p2, s->context_lookup)]
2236
121k
          : 0;
2237
121k
      const BrotliDictionary* words = s->dictionary->words[dict_id];
2238
121k
      const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
2239
121k
      int offset = (int)words->offsets_by_length[i];
2240
121k
      brotli_reg_t shift = words->size_bits_by_length[i];
2241
121k
      int address = s->distance_code - s->max_distance - 1 -
2242
121k
                    (int)compound_dictionary_size;
2243
121k
      int mask = (int)BitMask(shift);
2244
121k
      int word_idx = address & mask;
2245
121k
      int transform_idx = address >> shift;
2246
      /* Compensate double distance-ring-buffer roll. */
2247
121k
      s->dist_rb_idx += s->distance_context;
2248
121k
      offset += word_idx * i;
2249
      /* If the distance is out of bound, select a next static dictionary if
2250
         there exist multiple. */
2251
121k
      if ((transform_idx >= (int)transforms->num_transforms ||
2252
121k
          words->size_bits_by_length[i] == 0) &&
2253
36
          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
121k
      if (BROTLI_PREDICT_FALSE(words->size_bits_by_length[i] == 0)) {
2283
11
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2284
11
            "len: %d bytes left: %d\n",
2285
11
            pos, s->distance_code, i, s->meta_block_remaining_len));
2286
11
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2287
11
      }
2288
121k
      if (BROTLI_PREDICT_FALSE(!words->data)) {
2289
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
2290
0
      }
2291
121k
      if (transform_idx < (int)transforms->num_transforms) {
2292
121k
        const uint8_t* word = &words->data[offset];
2293
121k
        int len = i;
2294
121k
        if (transform_idx == transforms->cutOffTransforms[0]) {
2295
71.0k
          memcpy(&s->ringbuffer[pos], word, (size_t)len);
2296
71.0k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
2297
71.0k
                      len, word));
2298
71.0k
        } else {
2299
50.6k
          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
2300
50.6k
              transforms, transform_idx);
2301
50.6k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
2302
50.6k
                      " transform_idx = %d, transformed: [%.*s]\n",
2303
50.6k
                      i, word, transform_idx, len, &s->ringbuffer[pos]));
2304
50.6k
          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
50.6k
        }
2309
121k
        pos += len;
2310
121k
        s->meta_block_remaining_len -= len;
2311
121k
        if (pos >= s->ringbuffer_size) {
2312
14
          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
2313
14
          goto saveStateAndReturn;
2314
14
        }
2315
121k
      } else {
2316
25
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2317
25
            "len: %d bytes left: %d\n",
2318
25
            pos, s->distance_code, i, s->meta_block_remaining_len));
2319
25
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
2320
25
      }
2321
121k
    } else {
2322
26
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2323
26
          "len: %d bytes left: %d\n",
2324
26
          pos, s->distance_code, i, s->meta_block_remaining_len));
2325
26
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2326
26
    }
2327
1.38M
  } else {
2328
1.38M
    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
2329
1.38M
    uint8_t* copy_dst = &s->ringbuffer[pos];
2330
1.38M
    uint8_t* copy_src = &s->ringbuffer[src_start];
2331
1.38M
    int dst_end = pos + i;
2332
1.38M
    int src_end = src_start + i;
2333
    /* Update the recent distances cache. */
2334
1.38M
    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
2335
1.38M
    ++s->dist_rb_idx;
2336
1.38M
    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
1.38M
    memmove16(copy_dst, copy_src);
2341
1.38M
    if (src_end > pos && dst_end > src_start) {
2342
      /* Regions intersect. */
2343
335k
      goto CommandPostWrapCopy;
2344
335k
    }
2345
1.05M
    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
2346
      /* At least one region wraps. */
2347
31
      goto CommandPostWrapCopy;
2348
31
    }
2349
1.05M
    pos += i;
2350
1.05M
    if (i > 16) {
2351
35.3k
      if (i > 32) {
2352
3.20k
        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
2353
32.0k
      } else {
2354
        /* This branch covers about 45% cases.
2355
           Fixed size short copy allows more compiler optimizations. */
2356
32.0k
        memmove16(copy_dst + 16, copy_src + 16);
2357
32.0k
      }
2358
35.3k
    }
2359
1.05M
  }
2360
1.17M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2361
1.17M
  if (s->meta_block_remaining_len <= 0) {
2362
    /* Next metablock, if any. */
2363
332
    s->state = BROTLI_STATE_METABLOCK_DONE;
2364
332
    goto saveStateAndReturn;
2365
1.17M
  } else {
2366
1.17M
    goto CommandBegin;
2367
1.17M
  }
2368
336k
CommandPostWrapCopy:
2369
336k
  {
2370
336k
    int wrap_guard = s->ringbuffer_size - pos;
2371
10.0M
    while (--i >= 0) {
2372
9.68M
      s->ringbuffer[pos] =
2373
9.68M
          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
2374
9.68M
      ++pos;
2375
9.68M
      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
2376
71
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
2377
71
        goto saveStateAndReturn;
2378
71
      }
2379
9.68M
    }
2380
336k
  }
2381
335k
  if (s->meta_block_remaining_len <= 0) {
2382
    /* Next metablock, if any. */
2383
42
    s->state = BROTLI_STATE_METABLOCK_DONE;
2384
42
    goto saveStateAndReturn;
2385
335k
  } else {
2386
335k
    goto CommandBegin;
2387
335k
  }
2388
2389
1.87M
NextLiteralBlock:
2390
1.87M
  BROTLI_SAFE_WITH_STATUS(DecodeLiteralBlockSwitch(s));
2391
1.87M
  goto CommandInner;
2392
2393
2.21k
saveStateAndReturn:
2394
2.21k
  s->pos = pos;
2395
2.21k
  s->loop_counter = i;
2396
2.21k
  return result;
2397
1.87M
}
2398
2399
#undef BROTLI_SAFE
2400
2401
static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
2402
1.30k
    BrotliDecoderState* s) {
2403
1.30k
  return ProcessCommandsInternal(0, s);
2404
1.30k
}
2405
2406
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
2407
973
    BrotliDecoderState* s) {
2408
973
  return ProcessCommandsInternal(1, s);
2409
973
}
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
2.47k
    size_t* available_out, uint8_t** next_out, size_t* total_out) {
2450
2.47k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2451
2.47k
  BrotliBitReader* br = &s->br;
2452
2.47k
  size_t input_size = *available_in;
2453
2.47k
#define BROTLI_SAVE_ERROR_CODE(code) \
2454
2.47k
    SaveErrorCode(s, (code), input_size - *available_in)
2455
  /* Ensure that |total_out| is set, even if no data will ever be pushed out. */
2456
2.47k
  if (total_out) {
2457
2.47k
    *total_out = s->partial_pos_out;
2458
2.47k
  }
2459
  /* Do not try to process further in a case of unrecoverable error. */
2460
2.47k
  if ((int)s->error_code < 0) {
2461
0
    return BROTLI_DECODER_RESULT_ERROR;
2462
0
  }
2463
2.47k
  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
2.47k
  if (!*available_out) next_out = 0;
2468
2.47k
  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
2469
2.47k
    BrotliBitReaderSetInput(br, *next_in, *available_in);
2470
2.47k
  } 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
30.6k
  for (;;) {
2479
30.6k
    if (result != BROTLI_DECODER_SUCCESS) {
2480
      /* Error, needs more input/output. */
2481
1.88k
      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2482
515
        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
2483
469
          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
2484
469
              available_out, next_out, total_out, BROTLI_TRUE);
2485
          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
2486
469
          if ((int)intermediate_result < 0) {
2487
24
            result = intermediate_result;
2488
24
            break;
2489
24
          }
2490
469
        }
2491
491
        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
491
        } else {  /* Input stream doesn't contain enough input. */
2517
          /* Copy tail to internal buffer and return. */
2518
491
          *next_in = br->next_in;
2519
491
          *available_in = BrotliBitReaderGetAvailIn(br);
2520
498
          while (*available_in) {
2521
7
            s->buffer.u8[s->buffer_length] = **next_in;
2522
7
            s->buffer_length++;
2523
7
            (*next_in)++;
2524
7
            (*available_in)--;
2525
7
          }
2526
491
          break;
2527
491
        }
2528
        /* Unreachable. */
2529
491
      }
2530
2531
      /* Fail or needs more output. */
2532
2533
1.36k
      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
1.36k
      } 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
1.36k
        BrotliBitReaderUnload(br);
2542
1.36k
        *available_in = BrotliBitReaderGetAvailIn(br);
2543
1.36k
        *next_in = br->next_in;
2544
1.36k
      }
2545
1.36k
      break;
2546
1.88k
    }
2547
28.7k
    switch (s->state) {
2548
1.49k
      case BROTLI_STATE_UNINITED:
2549
        /* Prepare to the first read. */
2550
1.49k
        if (!BrotliWarmupBitReader(br)) {
2551
0
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2552
0
          break;
2553
0
        }
2554
        /* Decode window size. */
2555
1.49k
        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
2556
1.49k
        if (result != BROTLI_DECODER_SUCCESS) {
2557
4
          break;
2558
4
        }
2559
1.49k
        if (s->large_window) {
2560
0
          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
2561
0
          break;
2562
0
        }
2563
1.49k
        s->state = BROTLI_STATE_INITIALIZE;
2564
1.49k
        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
1.49k
      case BROTLI_STATE_INITIALIZE:
2583
1.49k
        BROTLI_LOG_UINT(s->window_bits);
2584
        /* Maximum distance, see section 9.1. of the spec. */
2585
1.49k
        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
1.49k
        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
2589
1.49k
            sizeof(HuffmanCode) * 3 *
2590
1.49k
                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2591
1.49k
        if (s->block_type_trees == 0) {
2592
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES);
2593
0
          break;
2594
0
        }
2595
1.49k
        s->block_len_trees =
2596
1.49k
            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
2597
2598
1.49k
        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2599
      /* Fall through. */
2600
2601
6.77k
      case BROTLI_STATE_METABLOCK_BEGIN:
2602
6.77k
        BrotliDecoderStateMetablockBegin(s);
2603
6.77k
        BROTLI_LOG_UINT(s->pos);
2604
6.77k
        s->state = BROTLI_STATE_METABLOCK_HEADER;
2605
      /* Fall through. */
2606
2607
6.77k
      case BROTLI_STATE_METABLOCK_HEADER:
2608
6.77k
        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
2609
6.77k
        if (result != BROTLI_DECODER_SUCCESS) {
2610
13
          break;
2611
13
        }
2612
6.76k
        BROTLI_DCHECK(s->meta_block_remaining_len <=
2613
6.76k
                      (int)BROTLI_BLOCK_SIZE_CAP);
2614
6.76k
        BROTLI_LOG_UINT(s->is_last_metablock);
2615
6.76k
        BROTLI_LOG_UINT(s->meta_block_remaining_len);
2616
6.76k
        BROTLI_LOG_UINT(s->is_metadata);
2617
6.76k
        BROTLI_LOG_UINT(s->is_uncompressed);
2618
6.76k
        if (s->is_metadata || s->is_uncompressed) {
2619
5.35k
          if (!BrotliJumpToByteBoundary(br)) {
2620
8
            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
2621
8
            break;
2622
8
          }
2623
5.35k
        }
2624
6.75k
        if (s->is_metadata) {
2625
2.86k
          s->state = BROTLI_STATE_METADATA;
2626
2.86k
          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
2.86k
          break;
2631
2.86k
        }
2632
3.88k
        if (s->meta_block_remaining_len == 0) {
2633
25
          s->state = BROTLI_STATE_METABLOCK_DONE;
2634
25
          break;
2635
25
        }
2636
3.86k
        BrotliCalculateRingBufferSize(s);
2637
3.86k
        if (s->is_uncompressed) {
2638
2.47k
          s->state = BROTLI_STATE_UNCOMPRESSED;
2639
2.47k
          break;
2640
2.47k
        }
2641
1.38k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER;
2642
      /* Fall through. */
2643
2644
1.38k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: {
2645
1.38k
        BrotliMetablockHeaderArena* h = &s->arena.header;
2646
1.38k
        s->loop_counter = 0;
2647
        /* Initialize compressed metablock header arena. */
2648
1.38k
        h->sub_loop_counter = 0;
2649
        /* Make small negative indexes addressable. */
2650
1.38k
        h->symbol_lists =
2651
1.38k
            &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
2652
1.38k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
2653
1.38k
        h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
2654
1.38k
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
2655
1.38k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2656
1.38k
      }
2657
      /* Fall through. */
2658
2659
5.49k
      case BROTLI_STATE_HUFFMAN_CODE_0:
2660
5.49k
        if (s->loop_counter >= 3) {
2661
1.36k
          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
2662
1.36k
          break;
2663
1.36k
        }
2664
        /* Reads 1..11 bits. */
2665
4.12k
        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
2666
4.12k
        if (result != BROTLI_DECODER_SUCCESS) {
2667
0
          break;
2668
0
        }
2669
4.12k
        s->num_block_types[s->loop_counter]++;
2670
4.12k
        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2671
4.12k
        if (s->num_block_types[s->loop_counter] < 2) {
2672
3.06k
          s->loop_counter++;
2673
3.06k
          break;
2674
3.06k
        }
2675
1.06k
        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2676
      /* Fall through. */
2677
2678
1.06k
      case BROTLI_STATE_HUFFMAN_CODE_1: {
2679
1.06k
        brotli_reg_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
2680
1.06k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2681
1.06k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2682
1.06k
            &s->block_type_trees[tree_offset], NULL, s);
2683
1.06k
        if (result != BROTLI_DECODER_SUCCESS) break;
2684
1.04k
        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2685
1.04k
      }
2686
      /* Fall through. */
2687
2688
1.04k
      case BROTLI_STATE_HUFFMAN_CODE_2: {
2689
1.04k
        brotli_reg_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
2690
1.04k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2691
1.04k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2692
1.04k
            &s->block_len_trees[tree_offset], NULL, s);
2693
1.04k
        if (result != BROTLI_DECODER_SUCCESS) break;
2694
1.04k
        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2695
1.04k
      }
2696
      /* Fall through. */
2697
2698
1.04k
      case BROTLI_STATE_HUFFMAN_CODE_3: {
2699
1.04k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2700
1.04k
        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2701
1.04k
            &s->block_len_trees[tree_offset], br)) {
2702
0
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2703
0
          break;
2704
0
        }
2705
1.04k
        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2706
1.04k
        s->loop_counter++;
2707
1.04k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2708
1.04k
        break;
2709
1.04k
      }
2710
2711
2.47k
      case BROTLI_STATE_UNCOMPRESSED: {
2712
2.47k
        result = CopyUncompressedBlockToOutput(
2713
2.47k
            available_out, next_out, total_out, s);
2714
2.47k
        if (result != BROTLI_DECODER_SUCCESS) {
2715
43
          break;
2716
43
        }
2717
2.43k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2718
2.43k
        break;
2719
2.47k
      }
2720
2721
2.86k
      case BROTLI_STATE_METADATA:
2722
2.86k
        result = SkipMetadataBlock(s);
2723
2.86k
        if (result != BROTLI_DECODER_SUCCESS) {
2724
12
          break;
2725
12
        }
2726
2.85k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2727
2.85k
        break;
2728
2729
1.36k
      case BROTLI_STATE_METABLOCK_HEADER_2: {
2730
1.36k
        brotli_reg_t bits;
2731
1.36k
        if (!BrotliSafeReadBits(br, 6, &bits)) {
2732
0
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2733
0
          break;
2734
0
        }
2735
1.36k
        s->distance_postfix_bits = bits & BitMask(2);
2736
1.36k
        bits >>= 2;
2737
1.36k
        s->num_direct_distance_codes = bits << s->distance_postfix_bits;
2738
1.36k
        BROTLI_LOG_UINT(s->num_direct_distance_codes);
2739
1.36k
        BROTLI_LOG_UINT(s->distance_postfix_bits);
2740
1.36k
        s->context_modes =
2741
1.36k
            (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
2742
1.36k
        if (s->context_modes == 0) {
2743
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
2744
0
          break;
2745
0
        }
2746
1.36k
        s->loop_counter = 0;
2747
1.36k
        s->state = BROTLI_STATE_CONTEXT_MODES;
2748
1.36k
      }
2749
      /* Fall through. */
2750
2751
1.36k
      case BROTLI_STATE_CONTEXT_MODES:
2752
1.36k
        result = ReadContextModes(s);
2753
1.36k
        if (result != BROTLI_DECODER_SUCCESS) {
2754
0
          break;
2755
0
        }
2756
1.36k
        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2757
      /* Fall through. */
2758
2759
1.36k
      case BROTLI_STATE_CONTEXT_MAP_1:
2760
1.36k
        result = DecodeContextMap(
2761
1.36k
            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2762
1.36k
            &s->num_literal_htrees, &s->context_map, s);
2763
1.36k
        if (result != BROTLI_DECODER_SUCCESS) {
2764
13
          break;
2765
13
        }
2766
1.35k
        DetectTrivialLiteralBlockTypes(s);
2767
1.35k
        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2768
      /* Fall through. */
2769
2770
1.35k
      case BROTLI_STATE_CONTEXT_MAP_2: {
2771
1.35k
        brotli_reg_t npostfix = s->distance_postfix_bits;
2772
1.35k
        brotli_reg_t ndirect = s->num_direct_distance_codes;
2773
1.35k
        brotli_reg_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2774
1.35k
            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
2775
1.35k
        brotli_reg_t distance_alphabet_size_limit = distance_alphabet_size_max;
2776
1.35k
        BROTLI_BOOL allocation_success = BROTLI_TRUE;
2777
1.35k
        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
1.35k
        result = DecodeContextMap(
2786
1.35k
            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2787
1.35k
            &s->num_dist_htrees, &s->dist_context_map, s);
2788
1.35k
        if (result != BROTLI_DECODER_SUCCESS) {
2789
32
          break;
2790
32
        }
2791
1.31k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2792
1.31k
            s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
2793
1.31k
            BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
2794
1.31k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2795
1.31k
            s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
2796
1.31k
            BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
2797
1.31k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2798
1.31k
            s, &s->distance_hgroup, distance_alphabet_size_max,
2799
1.31k
            distance_alphabet_size_limit, s->num_dist_htrees);
2800
1.31k
        if (!allocation_success) {
2801
0
          return BROTLI_SAVE_ERROR_CODE(
2802
0
              BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
2803
0
        }
2804
1.31k
        s->loop_counter = 0;
2805
1.31k
        s->state = BROTLI_STATE_TREE_GROUP;
2806
1.31k
      }
2807
      /* Fall through. */
2808
2809
3.74k
      case BROTLI_STATE_TREE_GROUP: {
2810
3.74k
        HuffmanTreeGroup* hgroup = NULL;
2811
3.74k
        switch (s->loop_counter) {
2812
1.31k
          case 0: hgroup = &s->literal_hgroup; break;
2813
1.22k
          case 1: hgroup = &s->insert_copy_hgroup; break;
2814
1.20k
          case 2: hgroup = &s->distance_hgroup; break;
2815
0
          default: return BROTLI_SAVE_ERROR_CODE(BROTLI_FAILURE(
2816
3.74k
              BROTLI_DECODER_ERROR_UNREACHABLE));  /* COV_NF_LINE */
2817
3.74k
        }
2818
3.74k
        result = HuffmanTreeGroupDecode(hgroup, s);
2819
3.74k
        if (result != BROTLI_DECODER_SUCCESS) break;
2820
3.60k
        s->loop_counter++;
2821
3.60k
        if (s->loop_counter < 3) {
2822
2.43k
          break;
2823
2.43k
        }
2824
1.17k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY;
2825
1.17k
      }
2826
      /* Fall through. */
2827
2828
1.17k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY:
2829
1.17k
        PrepareLiteralDecoding(s);
2830
1.17k
        s->dist_context_map_slice = s->dist_context_map;
2831
1.17k
        s->htree_command = s->insert_copy_hgroup.htrees[0];
2832
1.17k
        if (!BrotliEnsureRingBuffer(s)) {
2833
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
2834
0
          break;
2835
0
        }
2836
1.17k
        CalculateDistanceLut(s);
2837
1.17k
        s->state = BROTLI_STATE_COMMAND_BEGIN;
2838
      /* Fall through. */
2839
2840
1.18k
      case BROTLI_STATE_COMMAND_BEGIN:
2841
      /* Fall through. */
2842
1.25k
      case BROTLI_STATE_COMMAND_INNER:
2843
      /* Fall through. */
2844
1.25k
      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2845
      /* Fall through. */
2846
1.30k
      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2847
1.30k
        result = ProcessCommands(s);
2848
1.30k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2849
973
          result = SafeProcessCommands(s);
2850
973
        }
2851
1.30k
        break;
2852
2853
152
      case BROTLI_STATE_COMMAND_INNER_WRITE:
2854
      /* Fall through. */
2855
186
      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2856
      /* Fall through. */
2857
389
      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2858
389
        result = WriteRingBuffer(
2859
389
            s, available_out, next_out, total_out, BROTLI_FALSE);
2860
389
        if (result != BROTLI_DECODER_SUCCESS) {
2861
257
          break;
2862
257
        }
2863
132
        WrapRingBuffer(s);
2864
132
        if (s->ringbuffer_size == 1 << s->window_bits) {
2865
132
          s->max_distance = s->max_backward_distance;
2866
132
        }
2867
132
        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
2868
10
          BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
2869
10
          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
10
          if (s->meta_block_remaining_len == 0) {
2874
            /* Next metablock, if any. */
2875
0
            s->state = BROTLI_STATE_METABLOCK_DONE;
2876
10
          } else {
2877
10
            s->state = BROTLI_STATE_COMMAND_BEGIN;
2878
10
          }
2879
10
          break;
2880
122
        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2881
54
          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2882
68
        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2883
68
          if (s->loop_counter == 0) {
2884
4
            if (s->meta_block_remaining_len == 0) {
2885
0
              s->state = BROTLI_STATE_METABLOCK_DONE;
2886
4
            } else {
2887
4
              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2888
4
            }
2889
4
            break;
2890
4
          }
2891
64
          s->state = BROTLI_STATE_COMMAND_INNER;
2892
64
        }
2893
118
        break;
2894
2895
5.95k
      case BROTLI_STATE_METABLOCK_DONE:
2896
5.95k
        if (s->meta_block_remaining_len < 0) {
2897
61
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
2898
61
          break;
2899
61
        }
2900
5.88k
        BrotliDecoderStateCleanupAfterMetablock(s);
2901
5.88k
        if (!s->is_last_metablock) {
2902
5.28k
          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2903
5.28k
          break;
2904
5.28k
        }
2905
604
        if (!BrotliJumpToByteBoundary(br)) {
2906
12
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2907
12
          break;
2908
12
        }
2909
592
        if (s->buffer_length == 0) {
2910
592
          BrotliBitReaderUnload(br);
2911
592
          *available_in = BrotliBitReaderGetAvailIn(br);
2912
592
          *next_in = br->next_in;
2913
592
        }
2914
592
        s->state = BROTLI_STATE_DONE;
2915
      /* Fall through. */
2916
2917
1.37k
      case BROTLI_STATE_DONE:
2918
1.37k
        if (s->ringbuffer != 0) {
2919
1.34k
          result = WriteRingBuffer(
2920
1.34k
              s, available_out, next_out, total_out, BROTLI_TRUE);
2921
1.34k
          if (result != BROTLI_DECODER_SUCCESS) {
2922
779
            break;
2923
779
          }
2924
1.34k
        }
2925
592
        return BROTLI_SAVE_ERROR_CODE(result);
2926
28.7k
    }
2927
28.7k
  }
2928
1.88k
  return BROTLI_SAVE_ERROR_CODE(result);
2929
2.47k
#undef BROTLI_SAVE_ERROR_CODE
2930
2.47k
}
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
377
BrotliDecoderErrorCode BrotliDecoderGetErrorCode(const BrotliDecoderState* s) {
2977
377
  return (BrotliDecoderErrorCode)s->error_code;
2978
377
}
2979
2980
377
const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c) {
2981
377
  switch (c) {
2982
0
#define BROTLI_ERROR_CODE_CASE_(PREFIX, NAME, CODE) \
2983
377
    case BROTLI_DECODER ## PREFIX ## NAME: return #PREFIX #NAME;
2984
0
#define BROTLI_NOTHING_
2985
377
    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
377
  }
2990
377
}
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