Coverage Report

Created: 2026-09-28 08:21

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