Coverage Report

Created: 2026-10-14 06:52

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