Coverage Report

Created: 2025-12-28 06:30

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