Coverage Report

Created: 2025-12-31 07:53

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