Coverage Report

Created: 2025-11-24 06:34

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