Coverage Report

Created: 2026-07-30 07:17

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