Coverage Report

Created: 2026-11-10 07:41

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