Coverage Report

Created: 2026-09-24 06:39

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