Coverage Report

Created: 2025-11-09 06:58

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.57k
#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.57G
#define HUFFMAN_TABLE_BITS 8U
40
1.00k
#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
7.14k
    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
79
7.14k
  BrotliDecoderState* state = 0;
80
7.14k
  if (!alloc_func && !free_func) {
81
7.14k
    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
82
7.14k
  } else if (alloc_func && free_func) {
83
0
    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
84
0
  }
85
7.14k
  if (state == 0) {
86
0
    BROTLI_DUMP();
87
0
    return 0;
88
0
  }
89
7.14k
  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
7.14k
  return state;
99
7.14k
}
100
101
/* Deinitializes and frees BrotliDecoderState instance. */
102
7.14k
void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
103
7.14k
  if (!state) {
104
0
    return;
105
7.14k
  } else {
106
7.14k
    brotli_free_func free_func = state->free_func;
107
7.14k
    void* opaque = state->memory_manager_opaque;
108
7.14k
    BrotliDecoderStateCleanup(state);
109
7.14k
    free_func(opaque, state);
110
7.14k
  }
111
7.14k
}
112
113
/* Saves error code and converts it to BrotliDecoderResult. */
114
static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
115
531k
    BrotliDecoderState* s, BrotliDecoderErrorCode e) {
116
531k
  s->error_code = (int)e;
117
531k
  switch (e) {
118
354
    case BROTLI_DECODER_SUCCESS:
119
354
      return BROTLI_DECODER_RESULT_SUCCESS;
120
121
294k
    case BROTLI_DECODER_NEEDS_MORE_INPUT:
122
294k
      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
123
124
235k
    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
125
235k
      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
126
127
1.57k
    default:
128
1.57k
      return BROTLI_DECODER_RESULT_ERROR;
129
531k
  }
130
531k
}
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.80k
                                               BrotliBitReader* br) {
136
6.80k
  uint32_t n;
137
6.80k
  BROTLI_BOOL large_window = s->large_window;
138
6.80k
  s->large_window = BROTLI_FALSE;
139
6.80k
  BrotliTakeBits(br, 1, &n);
140
6.80k
  if (n == 0) {
141
4.61k
    s->window_bits = 16;
142
4.61k
    return BROTLI_DECODER_SUCCESS;
143
4.61k
  }
144
2.19k
  BrotliTakeBits(br, 3, &n);
145
2.19k
  if (n != 0) {
146
1.28k
    s->window_bits = 17 + n;
147
1.28k
    return BROTLI_DECODER_SUCCESS;
148
1.28k
  }
149
909
  BrotliTakeBits(br, 3, &n);
150
909
  if (n == 1) {
151
2
    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
2
    } else {
159
2
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
160
2
    }
161
2
  }
162
907
  if (n != 0) {
163
829
    s->window_bits = 8 + n;
164
829
    return BROTLI_DECODER_SUCCESS;
165
829
  }
166
78
  s->window_bits = 17;
167
78
  return BROTLI_DECODER_SUCCESS;
168
907
}
169
170
803M
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
803M
  uint32_t buffer[4];
175
803M
  memcpy(buffer, src, 16);
176
803M
  memcpy(dst, buffer, 16);
177
803M
#endif
178
803M
}
179
180
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
181
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
182
89.8k
    BrotliDecoderState* s, BrotliBitReader* br, uint32_t* value) {
183
89.8k
  uint32_t bits;
184
89.8k
  switch (s->substate_decode_uint8) {
185
86.9k
    case BROTLI_STATE_DECODE_UINT8_NONE:
186
86.9k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
187
6.12k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
188
6.12k
      }
189
80.8k
      if (bits == 0) {
190
73.2k
        *value = 0;
191
73.2k
        return BROTLI_DECODER_SUCCESS;
192
73.2k
      }
193
    /* Fall through. */
194
195
9.32k
    case BROTLI_STATE_DECODE_UINT8_SHORT:
196
9.32k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
197
1.78k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
198
1.78k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
199
1.78k
      }
200
7.53k
      if (bits == 0) {
201
3.70k
        *value = 1;
202
3.70k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
203
3.70k
        return BROTLI_DECODER_SUCCESS;
204
3.70k
      }
205
      /* Use output value as a temporary storage. It MUST be persisted. */
206
3.83k
      *value = bits;
207
    /* Fall through. */
208
209
4.97k
    case BROTLI_STATE_DECODE_UINT8_LONG:
210
4.97k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
211
1.19k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
212
1.19k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
213
1.19k
      }
214
3.78k
      *value = (1U << *value) + bits;
215
3.78k
      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
216
3.78k
      return BROTLI_DECODER_SUCCESS;
217
218
0
    default:
219
0
      return
220
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
221
89.8k
  }
222
89.8k
}
223
224
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
225
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
226
54.0k
    BrotliDecoderState* s, BrotliBitReader* br) {
227
54.0k
  uint32_t bits;
228
54.0k
  int i;
229
82.9k
  for (;;) {
230
82.9k
    switch (s->substate_metablock_header) {
231
28.3k
      case BROTLI_STATE_METABLOCK_HEADER_NONE:
232
28.3k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
233
2.80k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
234
2.80k
        }
235
25.5k
        s->is_last_metablock = bits ? 1 : 0;
236
25.5k
        s->meta_block_remaining_len = 0;
237
25.5k
        s->is_uncompressed = 0;
238
25.5k
        s->is_metadata = 0;
239
25.5k
        if (!s->is_last_metablock) {
240
23.6k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
241
23.6k
          break;
242
23.6k
        }
243
1.90k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
244
      /* Fall through. */
245
246
1.90k
      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
247
1.90k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
248
20
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
249
20
        }
250
1.88k
        if (bits) {
251
314
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
252
314
          return BROTLI_DECODER_SUCCESS;
253
314
        }
254
1.57k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
255
      /* Fall through. */
256
257
27.5k
      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
258
27.5k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
259
2.38k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
260
2.38k
        }
261
25.1k
        s->size_nibbles = (uint8_t)(bits + 4);
262
25.1k
        s->loop_counter = 0;
263
25.1k
        if (bits == 3) {
264
5.27k
          s->is_metadata = 1;
265
5.27k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
266
5.27k
          break;
267
5.27k
        }
268
19.8k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
269
      /* Fall through. */
270
271
41.1k
      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
272
41.1k
        i = s->loop_counter;
273
123k
        for (; i < (int)s->size_nibbles; ++i) {
274
104k
          if (!BrotliSafeReadBits(br, 4, &bits)) {
275
21.3k
            s->loop_counter = i;
276
21.3k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
277
21.3k
          }
278
82.7k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
279
2.19k
              bits == 0) {
280
7
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
281
7
          }
282
82.7k
          s->meta_block_remaining_len |= (int)(bits << (i * 4));
283
82.7k
        }
284
19.7k
        s->substate_metablock_header =
285
19.7k
            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
286
      /* Fall through. */
287
288
19.8k
      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
289
19.8k
        if (!s->is_last_metablock) {
290
18.4k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
291
129
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
292
129
          }
293
18.3k
          s->is_uncompressed = bits ? 1 : 0;
294
18.3k
        }
295
19.7k
        ++s->meta_block_remaining_len;
296
19.7k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
297
19.7k
        return BROTLI_DECODER_SUCCESS;
298
299
6.37k
      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
300
6.37k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
301
1.10k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
302
1.10k
        }
303
5.26k
        if (bits != 0) {
304
8
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
305
8
        }
306
5.26k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
307
      /* Fall through. */
308
309
5.56k
      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
310
5.56k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
311
315
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
312
315
        }
313
5.24k
        if (bits == 0) {
314
3.83k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
315
3.83k
          return BROTLI_DECODER_SUCCESS;
316
3.83k
        }
317
1.41k
        s->size_nibbles = (uint8_t)bits;
318
1.41k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
319
      /* Fall through. */
320
321
2.01k
      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
322
2.01k
        i = s->loop_counter;
323
3.75k
        for (; i < (int)s->size_nibbles; ++i) {
324
2.37k
          if (!BrotliSafeReadBits(br, 8, &bits)) {
325
628
            s->loop_counter = i;
326
628
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
327
628
          }
328
1.74k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
329
297
              bits == 0) {
330
4
            return BROTLI_FAILURE(
331
4
                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
332
4
          }
333
1.73k
          s->meta_block_remaining_len |= (int)(bits << (i * 8));
334
1.73k
        }
335
1.38k
        ++s->meta_block_remaining_len;
336
1.38k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
337
1.38k
        return BROTLI_DECODER_SUCCESS;
338
339
0
      default:
340
0
        return
341
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
342
82.9k
    }
343
82.9k
  }
344
54.0k
}
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
802M
                                           BrotliBitReader* br) {
353
802M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
354
802M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
355
802M
  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
356
13.3k
    uint32_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
357
13.3k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
358
13.3k
    BROTLI_HC_ADJUST_TABLE_INDEX(table,
359
13.3k
        BROTLI_HC_FAST_LOAD_VALUE(table) +
360
13.3k
        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
361
13.3k
  }
362
802M
  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
363
802M
  return BROTLI_HC_FAST_LOAD_VALUE(table);
364
802M
}
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
98.2M
                                         BrotliBitReader* br) {
370
98.2M
  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
371
98.2M
}
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.90G
    const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
377
2.90G
  uint32_t val;
378
2.90G
  uint32_t available_bits = BrotliGetAvailableBits(br);
379
2.90G
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
380
2.90G
  if (available_bits == 0) {
381
126M
    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
382
126M
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
383
126M
      return BROTLI_TRUE;
384
126M
    }
385
14.8k
    return BROTLI_FALSE;  /* No valid bits at all. */
386
126M
  }
387
2.77G
  val = (uint32_t)BrotliGetBitsUnmasked(br);
388
2.77G
  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
389
2.77G
  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
390
2.77G
    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
391
2.77G
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
392
2.77G
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
393
2.77G
      return BROTLI_TRUE;
394
2.77G
    } else {
395
15.5k
      return BROTLI_FALSE;  /* Not enough bits for the first level. */
396
15.5k
    }
397
2.77G
  }
398
3.64k
  if (available_bits <= HUFFMAN_TABLE_BITS) {
399
2.19k
    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
400
2.19k
  }
401
402
  /* Speculatively drop HUFFMAN_TABLE_BITS. */
403
1.45k
  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
404
1.45k
  available_bits -= HUFFMAN_TABLE_BITS;
405
1.45k
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
406
1.45k
  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
407
381
    return BROTLI_FALSE;  /* Not enough bits for the second level. */
408
381
  }
409
410
1.07k
  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
411
1.07k
  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
412
1.07k
  return BROTLI_TRUE;
413
1.45k
}
414
415
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
416
3.60G
    const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
417
3.60G
  uint32_t val;
418
3.60G
  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
419
704M
    *result = DecodeSymbol(val, table, br);
420
704M
    return BROTLI_TRUE;
421
704M
  }
422
2.90G
  return SafeDecodeSymbol(table, br, result);
423
3.60G
}
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.12G
                                        uint32_t* value) {
431
1.12G
  if (safe) {
432
697M
    return;
433
697M
  }
434
428M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
435
428M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
436
428M
  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
437
428M
  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
438
428M
}
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
368M
                                                  uint32_t* value) {
446
368M
  uint32_t result = *value;
447
368M
  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
448
1.00k
    uint32_t val = BrotliGet16BitsUnmasked(br);
449
1.00k
    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
450
1.00k
    uint32_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
451
1.00k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
452
1.00k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
453
1.00k
    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
454
1.00k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
455
1.00k
    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
456
368M
  } else {
457
368M
    BrotliDropBits(br, *bits);
458
368M
  }
459
368M
  PreloadSymbol(0, table, br, bits, value);
460
368M
  return result;
461
368M
}
462
463
109k
static BROTLI_INLINE uint32_t Log2Floor(uint32_t x) {
464
109k
  uint32_t result = 0;
465
970k
  while (x) {
466
861k
    x >>= 1;
467
861k
    ++result;
468
861k
  }
469
109k
  return result;
470
109k
}
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
109k
    BrotliDecoderState* s) {
478
  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
479
109k
  BrotliBitReader* br = &s->br;
480
109k
  BrotliMetablockHeaderArena* h = &s->arena.header;
481
109k
  uint32_t max_bits = Log2Floor(alphabet_size_max - 1);
482
109k
  uint32_t i = h->sub_loop_counter;
483
109k
  uint32_t num_symbols = h->symbol;
484
207k
  while (i <= num_symbols) {
485
143k
    uint32_t v;
486
143k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
487
44.8k
      h->sub_loop_counter = i;
488
44.8k
      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
489
44.8k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
490
44.8k
    }
491
98.2k
    if (v >= alphabet_size_limit) {
492
34
      return
493
34
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
494
34
    }
495
98.2k
    h->symbols_lists_array[i] = (uint16_t)v;
496
98.2k
    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
497
98.2k
    ++i;
498
98.2k
  }
499
500
98.1k
  for (i = 0; i < num_symbols; ++i) {
501
33.4k
    uint32_t k = i + 1;
502
87.9k
    for (; k <= num_symbols; ++k) {
503
54.5k
      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
54.5k
    }
507
33.4k
  }
508
509
64.7k
  return BROTLI_DECODER_SUCCESS;
510
64.7k
}
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
227k
    uint16_t* code_length_histo, int* next_symbol) {
522
227k
  *repeat = 0;
523
227k
  if (code_len != 0) {  /* code_len == 1..15 */
524
221k
    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
525
221k
    next_symbol[code_len] = (int)(*symbol);
526
221k
    *prev_code_len = code_len;
527
221k
    *space -= 32768U >> code_len;
528
221k
    code_length_histo[code_len]++;
529
221k
    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
530
221k
        (int)*symbol, (int)code_len));
531
221k
  }
532
227k
  (*symbol)++;
533
227k
}
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
6.45k
    uint16_t* code_length_histo, int* next_symbol) {
550
6.45k
  uint32_t old_repeat;
551
6.45k
  uint32_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
552
6.45k
  uint32_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
553
6.45k
  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
554
4.50k
    new_len = *prev_code_len;
555
4.50k
    extra_bits = 2;
556
4.50k
  }
557
6.45k
  if (*repeat_code_len != new_len) {
558
1.76k
    *repeat = 0;
559
1.76k
    *repeat_code_len = new_len;
560
1.76k
  }
561
6.45k
  old_repeat = *repeat;
562
6.45k
  if (*repeat > 0) {
563
1.20k
    *repeat -= 2;
564
1.20k
    *repeat <<= extra_bits;
565
1.20k
  }
566
6.45k
  *repeat += repeat_delta + 3U;
567
6.45k
  repeat_delta = *repeat - old_repeat;
568
6.45k
  if (*symbol + repeat_delta > alphabet_size) {
569
125
    BROTLI_DUMP();
570
125
    *symbol = alphabet_size;
571
125
    *space = 0xFFFFF;
572
125
    return;
573
125
  }
574
6.33k
  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
575
6.33k
      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
576
6.33k
  if (*repeat_code_len != 0) {
577
4.44k
    unsigned last = *symbol + repeat_delta;
578
4.44k
    int next = next_symbol[*repeat_code_len];
579
47.8k
    do {
580
47.8k
      symbol_lists[next] = (uint16_t)*symbol;
581
47.8k
      next = (int)*symbol;
582
47.8k
    } while (++(*symbol) != last);
583
4.44k
    next_symbol[*repeat_code_len] = next;
584
4.44k
    *space -= repeat_delta << (15 - *repeat_code_len);
585
4.44k
    code_length_histo[*repeat_code_len] =
586
4.44k
        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
587
4.44k
  } else {
588
1.89k
    *symbol += repeat_delta;
589
1.89k
  }
590
6.33k
}
591
592
/* Reads and decodes symbol codelengths. */
593
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
594
23.0k
    uint32_t alphabet_size, BrotliDecoderState* s) {
595
23.0k
  BrotliBitReader* br = &s->br;
596
23.0k
  BrotliMetablockHeaderArena* h = &s->arena.header;
597
23.0k
  uint32_t symbol = h->symbol;
598
23.0k
  uint32_t repeat = h->repeat;
599
23.0k
  uint32_t space = h->space;
600
23.0k
  uint32_t prev_code_len = h->prev_code_len;
601
23.0k
  uint32_t repeat_code_len = h->repeat_code_len;
602
23.0k
  uint16_t* symbol_lists = h->symbol_lists;
603
23.0k
  uint16_t* code_length_histo = h->code_length_histo;
604
23.0k
  int* next_symbol = h->next_symbol;
605
23.0k
  if (!BrotliWarmupBitReader(br)) {
606
2.18k
    return BROTLI_DECODER_NEEDS_MORE_INPUT;
607
2.18k
  }
608
138k
  while (symbol < alphabet_size && space > 0) {
609
134k
    const HuffmanCode* p = h->table;
610
134k
    uint32_t code_len;
611
134k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
612
134k
    if (!BrotliCheckInputAmount(br, BROTLI_SHORT_FILL_BIT_WINDOW_READ)) {
613
16.7k
      h->symbol = symbol;
614
16.7k
      h->repeat = repeat;
615
16.7k
      h->prev_code_len = prev_code_len;
616
16.7k
      h->repeat_code_len = repeat_code_len;
617
16.7k
      h->space = space;
618
16.7k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
619
16.7k
    }
620
117k
    BrotliFillBitWindow16(br);
621
117k
    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
622
117k
        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
623
117k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
624
117k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
625
117k
    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
2.63k
      uint32_t extra_bits =
630
2.63k
          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
631
2.63k
      uint32_t repeat_delta =
632
2.63k
          (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
633
2.63k
      BrotliDropBits(br, extra_bits);
634
2.63k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
635
2.63k
          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
636
2.63k
          symbol_lists, code_length_histo, next_symbol);
637
2.63k
    }
638
117k
  }
639
4.15k
  h->space = space;
640
4.15k
  return BROTLI_DECODER_SUCCESS;
641
20.8k
}
642
643
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
644
18.9k
    uint32_t alphabet_size, BrotliDecoderState* s) {
645
18.9k
  BrotliBitReader* br = &s->br;
646
18.9k
  BrotliMetablockHeaderArena* h = &s->arena.header;
647
18.9k
  BROTLI_BOOL get_byte = BROTLI_FALSE;
648
156k
  while (h->symbol < alphabet_size && h->space > 0) {
649
150k
    const HuffmanCode* p = h->table;
650
150k
    uint32_t code_len;
651
150k
    uint32_t available_bits;
652
150k
    uint32_t bits = 0;
653
150k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
654
150k
    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
655
137k
    get_byte = BROTLI_FALSE;
656
137k
    available_bits = BrotliGetAvailableBits(br);
657
137k
    if (available_bits != 0) {
658
114k
      bits = (uint32_t)BrotliGetBitsUnmasked(br);
659
114k
    }
660
137k
    BROTLI_HC_ADJUST_TABLE_INDEX(p,
661
137k
        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
662
137k
    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
663
19.3k
      get_byte = BROTLI_TRUE;
664
19.3k
      continue;
665
19.3k
    }
666
117k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
667
117k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
668
112k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
669
112k
      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
670
112k
          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
671
112k
          h->next_symbol);
672
112k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
673
5.23k
      uint32_t extra_bits = code_len - 14U;
674
5.23k
      uint32_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
675
5.23k
          BitMask(extra_bits);
676
5.23k
      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
677
1.40k
        get_byte = BROTLI_TRUE;
678
1.40k
        continue;
679
1.40k
      }
680
3.82k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
681
3.82k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
682
3.82k
          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
683
3.82k
          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
684
3.82k
          h->next_symbol);
685
3.82k
    }
686
117k
  }
687
5.08k
  return BROTLI_DECODER_SUCCESS;
688
18.9k
}
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
22.0k
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
693
22.0k
  BrotliBitReader* br = &s->br;
694
22.0k
  BrotliMetablockHeaderArena* h = &s->arena.header;
695
22.0k
  uint32_t num_codes = h->repeat;
696
22.0k
  unsigned space = h->space;
697
22.0k
  uint32_t i = h->sub_loop_counter;
698
99.3k
  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
699
98.7k
    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
700
98.7k
    uint32_t ix;
701
98.7k
    uint32_t v;
702
98.7k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
703
22.0k
      uint32_t available_bits = BrotliGetAvailableBits(br);
704
22.0k
      if (available_bits != 0) {
705
13.1k
        ix = BrotliGetBitsUnmasked(br) & 0xF;
706
13.1k
      } else {
707
8.92k
        ix = 0;
708
8.92k
      }
709
22.0k
      if (kCodeLengthPrefixLength[ix] > available_bits) {
710
12.2k
        h->sub_loop_counter = i;
711
12.2k
        h->repeat = num_codes;
712
12.2k
        h->space = space;
713
12.2k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
714
12.2k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
715
12.2k
      }
716
22.0k
    }
717
86.5k
    v = kCodeLengthPrefixValue[ix];
718
86.5k
    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
719
86.5k
    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
720
86.5k
    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
721
86.5k
    if (v != 0) {
722
48.5k
      space = space - (32U >> v);
723
48.5k
      ++num_codes;
724
48.5k
      ++h->code_length_histo[v];
725
48.5k
      if (space - 1U >= 32U) {
726
        /* space is 0 or wrapped around. */
727
9.16k
        break;
728
9.16k
      }
729
48.5k
    }
730
86.5k
  }
731
9.75k
  if (!(num_codes == 1 || space == 0)) {
732
169
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
733
169
  }
734
9.58k
  return BROTLI_DECODER_SUCCESS;
735
9.75k
}
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
160k
                                              BrotliDecoderState* s) {
753
160k
  BrotliBitReader* br = &s->br;
754
160k
  BrotliMetablockHeaderArena* h = &s->arena.header;
755
  /* State machine. */
756
170k
  for (;;) {
757
170k
    switch (h->substate_huffman) {
758
82.8k
      case BROTLI_STATE_HUFFMAN_NONE:
759
82.8k
        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
760
7.59k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
761
7.59k
        }
762
75.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
75.2k
        if (h->sub_loop_counter != 1) {
767
10.2k
          h->space = 32;
768
10.2k
          h->repeat = 0;  /* num_codes */
769
10.2k
          memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) *
770
10.2k
              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
771
10.2k
          memset(&h->code_length_code_lengths[0], 0,
772
10.2k
              sizeof(h->code_length_code_lengths));
773
10.2k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
774
10.2k
          continue;
775
10.2k
        }
776
      /* Fall through. */
777
778
72.2k
      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
779
        /* Read symbols, codes & code lengths directly. */
780
72.2k
        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
781
7.27k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
782
7.27k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
783
7.27k
        }
784
64.9k
        h->sub_loop_counter = 0;
785
      /* Fall through. */
786
787
109k
      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
788
109k
        BrotliDecoderErrorCode result =
789
109k
            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
790
109k
        if (result != BROTLI_DECODER_SUCCESS) {
791
44.8k
          return result;
792
44.8k
        }
793
109k
      }
794
      /* Fall through. */
795
796
65.1k
      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
797
65.1k
        uint32_t table_size;
798
65.1k
        if (h->symbol == 3) {
799
6.49k
          uint32_t bits;
800
6.49k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
801
480
            h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
802
480
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
803
480
          }
804
6.01k
          h->symbol += bits;
805
6.01k
        }
806
64.6k
        BROTLI_LOG_UINT(h->symbol);
807
64.6k
        table_size = BrotliBuildSimpleHuffmanTable(
808
64.6k
            table, HUFFMAN_TABLE_BITS, h->symbols_lists_array, h->symbol);
809
64.6k
        if (opt_table_size) {
810
55.4k
          *opt_table_size = table_size;
811
55.4k
        }
812
64.6k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
813
64.6k
        return BROTLI_DECODER_SUCCESS;
814
65.1k
      }
815
816
      /* Decode Huffman-coded code lengths. */
817
22.0k
      case BROTLI_STATE_HUFFMAN_COMPLEX: {
818
22.0k
        uint32_t i;
819
22.0k
        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
820
22.0k
        if (result != BROTLI_DECODER_SUCCESS) {
821
12.4k
          return result;
822
12.4k
        }
823
9.58k
        BrotliBuildCodeLengthsHuffmanTable(h->table,
824
9.58k
                                           h->code_length_code_lengths,
825
9.58k
                                           h->code_length_histo);
826
9.58k
        memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo));
827
162k
        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
828
153k
          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
829
153k
          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
830
153k
        }
831
832
9.58k
        h->symbol = 0;
833
9.58k
        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
834
9.58k
        h->repeat = 0;
835
9.58k
        h->repeat_code_len = 0;
836
9.58k
        h->space = 32768;
837
9.58k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
838
9.58k
      }
839
      /* Fall through. */
840
841
23.0k
      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
842
23.0k
        uint32_t table_size;
843
23.0k
        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
844
23.0k
            alphabet_size_limit, s);
845
23.0k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
846
18.9k
          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
847
18.9k
        }
848
23.0k
        if (result != BROTLI_DECODER_SUCCESS) {
849
13.8k
          return result;
850
13.8k
        }
851
852
9.24k
        if (h->space != 0) {
853
279
          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
854
279
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
855
279
        }
856
8.96k
        table_size = BrotliBuildHuffmanTable(
857
8.96k
            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
858
8.96k
        if (opt_table_size) {
859
7.23k
          *opt_table_size = table_size;
860
7.23k
        }
861
8.96k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
862
8.96k
        return BROTLI_DECODER_SUCCESS;
863
9.24k
      }
864
865
0
      default:
866
0
        return
867
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
868
170k
    }
869
170k
  }
870
160k
}
871
872
/* Decodes a block length by reading 3..39 bits. */
873
static BROTLI_INLINE uint32_t ReadBlockLength(const HuffmanCode* table,
874
33.3k
                                              BrotliBitReader* br) {
875
33.3k
  uint32_t code;
876
33.3k
  uint32_t nbits;
877
33.3k
  code = ReadSymbol(table, br);
878
33.3k
  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
879
33.3k
  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
880
33.3k
}
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
92.6k
    BrotliBitReader* br) {
887
92.6k
  uint32_t index;
888
92.6k
  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
889
91.4k
    if (!SafeReadSymbol(table, br, &index)) {
890
15.9k
      return BROTLI_FALSE;
891
15.9k
    }
892
91.4k
  } else {
893
1.19k
    index = s->block_length_index;
894
1.19k
  }
895
76.6k
  {
896
76.6k
    uint32_t bits;
897
76.6k
    uint32_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
898
76.6k
    uint32_t offset = _kBrotliPrefixCodeRanges[index].offset;
899
76.6k
    if (!BrotliSafeReadBits(br, nbits, &bits)) {
900
20.6k
      s->block_length_index = index;
901
20.6k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
902
20.6k
      return BROTLI_FALSE;
903
20.6k
    }
904
56.0k
    *result = offset + bits;
905
56.0k
    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
906
56.0k
    return BROTLI_TRUE;
907
76.6k
  }
908
76.6k
}
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.31k
    uint8_t* v, uint32_t v_len, BrotliDecoderState* state) {
926
  /* Reinitialize elements that could have been changed. */
927
1.31k
  uint32_t i = 1;
928
1.31k
  uint32_t upper_bound = state->mtf_upper_bound;
929
1.31k
  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
930
1.31k
  uint8_t* mtf_u8 = (uint8_t*)mtf;
931
  /* Load endian-aware constant. */
932
1.31k
  const uint8_t b0123[4] = {0, 1, 2, 3};
933
1.31k
  uint32_t pattern;
934
1.31k
  memcpy(&pattern, &b0123, 4);
935
936
  /* Initialize list using 4 consequent values pattern. */
937
1.31k
  mtf[0] = pattern;
938
31.1k
  do {
939
31.1k
    pattern += 0x04040404;  /* Advance all 4 values by 4. */
940
31.1k
    mtf[i] = pattern;
941
31.1k
    i++;
942
31.1k
  } while (i <= upper_bound);
943
944
  /* Transform the input. */
945
1.31k
  upper_bound = 0;
946
223k
  for (i = 0; i < v_len; ++i) {
947
221k
    int index = v[i];
948
221k
    uint8_t value = mtf_u8[index];
949
221k
    upper_bound |= v[i];
950
221k
    v[i] = value;
951
221k
    mtf_u8[-1] = value;
952
5.34M
    do {
953
5.34M
      index--;
954
5.34M
      mtf_u8[index + 1] = mtf_u8[index];
955
5.34M
    } while (index >= 0);
956
221k
  }
957
  /* Remember amount of elements to be reinitialized. */
958
1.31k
  state->mtf_upper_bound = upper_bound >> 2;
959
1.31k
}
960
961
/* Decodes a series of Huffman table using ReadHuffmanCode function. */
962
static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
963
113k
    HuffmanTreeGroup* group, BrotliDecoderState* s) {
964
113k
  BrotliMetablockHeaderArena* h = &s->arena.header;
965
113k
  if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
966
44.8k
    h->next = group->codes;
967
44.8k
    h->htree_index = 0;
968
44.8k
    h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
969
44.8k
  }
970
175k
  while (h->htree_index < group->num_htrees) {
971
131k
    uint32_t table_size;
972
131k
    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
973
131k
        group->alphabet_size_limit, h->next, &table_size, s);
974
131k
    if (result != BROTLI_DECODER_SUCCESS) return result;
975
62.6k
    group->htrees[h->htree_index] = h->next;
976
62.6k
    h->next += table_size;
977
62.6k
    ++h->htree_index;
978
62.6k
  }
979
43.8k
  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
980
43.8k
  return BROTLI_DECODER_SUCCESS;
981
113k
}
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
45.1k
                                               BrotliDecoderState* s) {
995
45.1k
  BrotliBitReader* br = &s->br;
996
45.1k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
997
45.1k
  BrotliMetablockHeaderArena* h = &s->arena.header;
998
999
45.1k
  switch ((int)h->substate_context_map) {
1000
37.1k
    case BROTLI_STATE_CONTEXT_MAP_NONE:
1001
37.1k
      result = DecodeVarLenUint8(s, br, num_htrees);
1002
37.1k
      if (result != BROTLI_DECODER_SUCCESS) {
1003
5.73k
        return result;
1004
5.73k
      }
1005
31.4k
      (*num_htrees)++;
1006
31.4k
      h->context_index = 0;
1007
31.4k
      BROTLI_LOG_UINT(context_map_size);
1008
31.4k
      BROTLI_LOG_UINT(*num_htrees);
1009
31.4k
      *context_map_arg =
1010
31.4k
          (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
1011
31.4k
      if (*context_map_arg == 0) {
1012
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
1013
0
      }
1014
31.4k
      if (*num_htrees <= 1) {
1015
28.6k
        memset(*context_map_arg, 0, (size_t)context_map_size);
1016
28.6k
        return BROTLI_DECODER_SUCCESS;
1017
28.6k
      }
1018
2.74k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
1019
    /* Fall through. */
1020
1021
3.62k
    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
1022
3.62k
      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.62k
      if (!BrotliSafeGetBits(br, 5, &bits)) {
1026
917
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1027
917
      }
1028
2.70k
      if ((bits & 1) != 0) { /* Use RLE for zeros. */
1029
403
        h->max_run_length_prefix = (bits >> 1) + 1;
1030
403
        BrotliDropBits(br, 5);
1031
2.30k
      } else {
1032
2.30k
        h->max_run_length_prefix = 0;
1033
2.30k
        BrotliDropBits(br, 1);
1034
2.30k
      }
1035
2.70k
      BROTLI_LOG_UINT(h->max_run_length_prefix);
1036
2.70k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
1037
2.70k
    }
1038
    /* Fall through. */
1039
1040
5.67k
    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
1041
5.67k
      uint32_t alphabet_size = *num_htrees + h->max_run_length_prefix;
1042
5.67k
      result = ReadHuffmanCode(alphabet_size, alphabet_size,
1043
5.67k
                               h->context_map_table, NULL, s);
1044
5.67k
      if (result != BROTLI_DECODER_SUCCESS) return result;
1045
2.56k
      h->code = 0xFFFF;
1046
2.56k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
1047
2.56k
    }
1048
    /* Fall through. */
1049
1050
6.54k
    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
1051
6.54k
      uint32_t context_index = h->context_index;
1052
6.54k
      uint32_t max_run_length_prefix = h->max_run_length_prefix;
1053
6.54k
      uint8_t* context_map = *context_map_arg;
1054
6.54k
      uint32_t code = h->code;
1055
6.54k
      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
1056
334k
      while (context_index < context_map_size || skip_preamble) {
1057
332k
        if (!skip_preamble) {
1058
331k
          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
1059
3.27k
            h->code = 0xFFFF;
1060
3.27k
            h->context_index = context_index;
1061
3.27k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1062
3.27k
          }
1063
328k
          BROTLI_LOG_UINT(code);
1064
1065
328k
          if (code == 0) {
1066
31.2k
            context_map[context_index++] = 0;
1067
31.2k
            continue;
1068
31.2k
          }
1069
297k
          if (code > max_run_length_prefix) {
1070
293k
            context_map[context_index++] =
1071
293k
                (uint8_t)(code - max_run_length_prefix);
1072
293k
            continue;
1073
293k
          }
1074
297k
        } else {
1075
814
          skip_preamble = BROTLI_FALSE;
1076
814
        }
1077
        /* RLE sub-stage. */
1078
4.77k
        {
1079
4.77k
          uint32_t reps;
1080
4.77k
          if (!BrotliSafeReadBits(br, code, &reps)) {
1081
937
            h->code = code;
1082
937
            h->context_index = context_index;
1083
937
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1084
937
          }
1085
3.83k
          reps += 1U << code;
1086
3.83k
          BROTLI_LOG_UINT(reps);
1087
3.83k
          if (context_index + reps > context_map_size) {
1088
57
            return
1089
57
                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
1090
57
          }
1091
287k
          do {
1092
287k
            context_map[context_index++] = 0;
1093
287k
          } while (--reps);
1094
3.77k
        }
1095
3.77k
      }
1096
6.54k
    }
1097
    /* Fall through. */
1098
1099
2.43k
    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1100
2.43k
      uint32_t bits;
1101
2.43k
      if (!BrotliSafeReadBits(br, 1, &bits)) {
1102
178
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
1103
178
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1104
178
      }
1105
2.26k
      if (bits != 0) {
1106
1.31k
        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
1107
1.31k
      }
1108
2.26k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
1109
2.26k
      return BROTLI_DECODER_SUCCESS;
1110
2.43k
    }
1111
1112
0
    default:
1113
0
      return
1114
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
1115
45.1k
  }
1116
45.1k
}
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
123k
    int safe, BrotliDecoderState* s, int tree_type) {
1122
123k
  uint32_t max_block_type = s->num_block_types[tree_type];
1123
123k
  const HuffmanCode* type_tree = &s->block_type_trees[
1124
123k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
1125
123k
  const HuffmanCode* len_tree = &s->block_len_trees[
1126
123k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1127
123k
  BrotliBitReader* br = &s->br;
1128
123k
  uint32_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1129
123k
  uint32_t block_type;
1130
123k
  if (max_block_type <= 1) {
1131
4
    return BROTLI_FALSE;
1132
4
  }
1133
1134
  /* Read 0..15 + 3..39 bits. */
1135
123k
  if (!safe) {
1136
33.3k
    block_type = ReadSymbol(type_tree, br);
1137
33.3k
    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1138
89.7k
  } else {
1139
89.7k
    BrotliBitReaderState memento;
1140
89.7k
    BrotliBitReaderSaveState(br, &memento);
1141
89.7k
    if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE;
1142
87.1k
    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1143
35.1k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1144
35.1k
      BrotliBitReaderRestoreState(br, &memento);
1145
35.1k
      return BROTLI_FALSE;
1146
35.1k
    }
1147
87.1k
  }
1148
1149
85.3k
  if (block_type == 1) {
1150
25.8k
    block_type = ringbuffer[1] + 1;
1151
59.4k
  } else if (block_type == 0) {
1152
14.4k
    block_type = ringbuffer[0];
1153
45.0k
  } else {
1154
45.0k
    block_type -= 2;
1155
45.0k
  }
1156
85.3k
  if (block_type >= max_block_type) {
1157
11.3k
    block_type -= max_block_type;
1158
11.3k
  }
1159
85.3k
  ringbuffer[0] = ringbuffer[1];
1160
85.3k
  ringbuffer[1] = block_type;
1161
85.3k
  return BROTLI_TRUE;
1162
123k
}
1163
1164
static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
1165
15.6k
    BrotliDecoderState* s) {
1166
15.6k
  size_t i;
1167
140k
  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1168
43.8k
  for (i = 0; i < s->num_block_types[0]; i++) {
1169
28.2k
    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1170
28.2k
    size_t error = 0;
1171
28.2k
    size_t sample = s->context_map[offset];
1172
28.2k
    size_t j;
1173
479k
    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1174
451k
      BROTLI_REPEAT(4, error |= s->context_map[offset + j++] ^ sample;)
1175
451k
    }
1176
28.2k
    if (error == 0) {
1177
24.1k
      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1178
24.1k
    }
1179
28.2k
  }
1180
15.6k
}
1181
1182
49.9k
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1183
49.9k
  uint8_t context_mode;
1184
49.9k
  size_t trivial;
1185
49.9k
  uint32_t block_type = s->block_type_rb[1];
1186
49.9k
  uint32_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1187
49.9k
  s->context_map_slice = s->context_map + context_offset;
1188
49.9k
  trivial = s->trivial_literal_contexts[block_type >> 5];
1189
49.9k
  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1190
49.9k
  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1191
49.9k
  context_mode = s->context_modes[block_type] & 3;
1192
49.9k
  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
1193
49.9k
}
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
44.3k
    int safe, BrotliDecoderState* s) {
1199
44.3k
  if (!DecodeBlockTypeAndLength(safe, s, 0)) {
1200
8.72k
    return BROTLI_FALSE;
1201
8.72k
  }
1202
35.6k
  PrepareLiteralDecoding(s);
1203
35.6k
  return BROTLI_TRUE;
1204
44.3k
}
1205
1206
18.5k
static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1207
18.5k
  DecodeLiteralBlockSwitchInternal(0, s);
1208
18.5k
}
1209
1210
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch(
1211
25.7k
    BrotliDecoderState* s) {
1212
25.7k
  return DecodeLiteralBlockSwitchInternal(1, s);
1213
25.7k
}
1214
1215
/* Block switch for insert/copy length.
1216
   Reads 3..54 bits. */
1217
static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal(
1218
55.6k
    int safe, BrotliDecoderState* s) {
1219
55.6k
  if (!DecodeBlockTypeAndLength(safe, s, 1)) {
1220
21.9k
    return BROTLI_FALSE;
1221
21.9k
  }
1222
33.7k
  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
1223
33.7k
  return BROTLI_TRUE;
1224
55.6k
}
1225
1226
10.0k
static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1227
10.0k
  DecodeCommandBlockSwitchInternal(0, s);
1228
10.0k
}
1229
1230
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch(
1231
45.6k
    BrotliDecoderState* s) {
1232
45.6k
  return DecodeCommandBlockSwitchInternal(1, s);
1233
45.6k
}
1234
1235
/* Block switch for distance codes.
1236
   Reads 3..54 bits. */
1237
static BROTLI_INLINE BROTLI_BOOL DecodeDistanceBlockSwitchInternal(
1238
23.0k
    int safe, BrotliDecoderState* s) {
1239
23.0k
  if (!DecodeBlockTypeAndLength(safe, s, 2)) {
1240
7.01k
    return BROTLI_FALSE;
1241
7.01k
  }
1242
16.0k
  s->dist_context_map_slice = s->dist_context_map +
1243
16.0k
      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
1244
16.0k
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1245
16.0k
  return BROTLI_TRUE;
1246
23.0k
}
1247
1248
4.75k
static void BROTLI_NOINLINE DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
1249
4.75k
  DecodeDistanceBlockSwitchInternal(0, s);
1250
4.75k
}
1251
1252
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
1253
18.2k
    BrotliDecoderState* s) {
1254
18.2k
  return DecodeDistanceBlockSwitchInternal(1, s);
1255
18.2k
}
1256
1257
1.15M
static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
1258
1.15M
  size_t pos = wrap && s->pos > s->ringbuffer_size ?
1259
1.09M
      (size_t)s->ringbuffer_size : (size_t)(s->pos);
1260
1.15M
  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
1261
1.15M
  return partial_pos_rb - s->partial_pos_out;
1262
1.15M
}
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.15M
    size_t* total_out, BROTLI_BOOL force) {
1270
1.15M
  uint8_t* start =
1271
1.15M
      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
1272
1.15M
  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1273
1.15M
  size_t num_written = *available_out;
1274
1.15M
  if (num_written > to_write) {
1275
466k
    num_written = to_write;
1276
466k
  }
1277
1.15M
  if (s->meta_block_remaining_len < 0) {
1278
166
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
1279
166
  }
1280
1.15M
  if (next_out && !*next_out) {
1281
466k
    *next_out = start;
1282
688k
  } else {
1283
688k
    if (next_out) {
1284
0
      memcpy(*next_out, start, num_written);
1285
0
      *next_out += num_written;
1286
0
    }
1287
688k
  }
1288
1.15M
  *available_out -= num_written;
1289
1.15M
  BROTLI_LOG_UINT(to_write);
1290
1.15M
  BROTLI_LOG_UINT(num_written);
1291
1.15M
  s->partial_pos_out += num_written;
1292
1.15M
  if (total_out) {
1293
0
    *total_out = s->partial_pos_out;
1294
0
  }
1295
1.15M
  if (num_written < to_write) {
1296
371k
    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
1297
371k
      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
1298
371k
    } else {
1299
57
      return BROTLI_DECODER_SUCCESS;
1300
57
    }
1301
371k
  }
1302
  /* Wrap ring buffer only if it has reached its maximal size. */
1303
783k
  if (s->ringbuffer_size == (1 << s->window_bits) &&
1304
610k
      s->pos >= s->ringbuffer_size) {
1305
202k
    s->pos -= s->ringbuffer_size;
1306
202k
    s->rb_roundtrips++;
1307
202k
    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1308
202k
  }
1309
783k
  return BROTLI_DECODER_SUCCESS;
1310
1.15M
}
1311
1312
665k
static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1313
665k
  if (s->should_wrap_ringbuffer) {
1314
32.2k
    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1315
32.2k
    s->should_wrap_ringbuffer = 0;
1316
32.2k
  }
1317
665k
}
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
83.4k
    BrotliDecoderState* s) {
1328
83.4k
  uint8_t* old_ringbuffer = s->ringbuffer;
1329
83.4k
  if (s->ringbuffer_size == s->new_ringbuffer_size) {
1330
78.8k
    return BROTLI_TRUE;
1331
78.8k
  }
1332
1333
4.55k
  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
1334
4.55k
      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
1335
4.55k
  if (s->ringbuffer == 0) {
1336
    /* Restore previous value. */
1337
0
    s->ringbuffer = old_ringbuffer;
1338
0
    return BROTLI_FALSE;
1339
0
  }
1340
4.55k
  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1341
4.55k
  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
1342
1343
4.55k
  if (!!old_ringbuffer) {
1344
450
    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1345
450
    BROTLI_DECODER_FREE(s, old_ringbuffer);
1346
450
  }
1347
1348
4.55k
  s->ringbuffer_size = s->new_ringbuffer_size;
1349
4.55k
  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1350
4.55k
  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1351
1352
4.55k
  return BROTLI_TRUE;
1353
4.55k
}
1354
1355
static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1356
    size_t* available_out, uint8_t** next_out, size_t* total_out,
1357
69.1k
    BrotliDecoderState* s) {
1358
  /* TODO: avoid allocation for single uncompressed block. */
1359
69.1k
  if (!BrotliEnsureRingBuffer(s)) {
1360
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
1361
0
  }
1362
1363
  /* State machine */
1364
72.7k
  for (;;) {
1365
72.7k
    switch (s->substate_uncompressed) {
1366
69.1k
      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1367
69.1k
        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1368
69.1k
        if (nbytes > s->meta_block_remaining_len) {
1369
1.71k
          nbytes = s->meta_block_remaining_len;
1370
1.71k
        }
1371
69.1k
        if (s->pos + nbytes > s->ringbuffer_size) {
1372
3.61k
          nbytes = s->ringbuffer_size - s->pos;
1373
3.61k
        }
1374
        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1375
69.1k
        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1376
69.1k
        s->pos += nbytes;
1377
69.1k
        s->meta_block_remaining_len -= nbytes;
1378
69.1k
        if (s->pos < 1 << s->window_bits) {
1379
65.4k
          if (s->meta_block_remaining_len == 0) {
1380
2.52k
            return BROTLI_DECODER_SUCCESS;
1381
2.52k
          }
1382
62.8k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
1383
65.4k
        }
1384
3.69k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1385
3.69k
      }
1386
      /* Fall through. */
1387
1388
7.38k
      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1389
7.38k
        BrotliDecoderErrorCode result;
1390
7.38k
        result = WriteRingBuffer(
1391
7.38k
            s, available_out, next_out, total_out, BROTLI_FALSE);
1392
7.38k
        if (result != BROTLI_DECODER_SUCCESS) {
1393
3.69k
          return result;
1394
3.69k
        }
1395
3.69k
        if (s->ringbuffer_size == 1 << s->window_bits) {
1396
3.69k
          s->max_distance = s->max_backward_distance;
1397
3.69k
        }
1398
3.69k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1399
3.69k
        break;
1400
7.38k
      }
1401
72.7k
    }
1402
72.7k
  }
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
19.7k
    BrotliDecoderState* s) {
1414
19.7k
  int window_size = 1 << s->window_bits;
1415
19.7k
  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
19.7k
  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
1419
19.7k
  int output_size;
1420
1421
  /* If maximum is already reached, no further extension is retired. */
1422
19.7k
  if (s->ringbuffer_size == window_size) {
1423
2.94k
    return;
1424
2.94k
  }
1425
1426
  /* Metadata blocks does not touch ring buffer. */
1427
16.7k
  if (s->is_metadata) {
1428
0
    return;
1429
0
  }
1430
1431
16.7k
  if (!s->ringbuffer) {
1432
6.23k
    output_size = 0;
1433
10.5k
  } else {
1434
10.5k
    output_size = s->pos;
1435
10.5k
  }
1436
16.7k
  output_size += s->meta_block_remaining_len;
1437
16.7k
  min_size = min_size < output_size ? output_size : min_size;
1438
1439
16.7k
  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
92.0k
    while ((new_ringbuffer_size >> 1) >= min_size) {
1444
75.3k
      new_ringbuffer_size >>= 1;
1445
75.3k
    }
1446
16.7k
  }
1447
1448
16.7k
  s->new_ringbuffer_size = new_ringbuffer_size;
1449
16.7k
}
1450
1451
/* Reads 1..256 2-bit context modes. */
1452
17.9k
static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1453
17.9k
  BrotliBitReader* br = &s->br;
1454
17.9k
  int i = s->loop_counter;
1455
1456
52.3k
  while (i < (int)s->num_block_types[0]) {
1457
36.4k
    uint32_t bits;
1458
36.4k
    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
34.4k
    s->context_modes[i] = (uint8_t)bits;
1463
34.4k
    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1464
34.4k
    i++;
1465
34.4k
  }
1466
15.9k
  return BROTLI_DECODER_SUCCESS;
1467
17.9k
}
1468
1469
103M
static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1470
103M
  int offset = s->distance_code - 3;
1471
103M
  if (s->distance_code <= 3) {
1472
    /* Compensate double distance-ring-buffer roll for dictionary items. */
1473
29.9M
    s->distance_context = 1 >> s->distance_code;
1474
29.9M
    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
1475
29.9M
    s->dist_rb_idx -= s->distance_context;
1476
73.0M
  } else {
1477
73.0M
    int index_delta = 3;
1478
73.0M
    int delta;
1479
73.0M
    int base = s->distance_code - 10;
1480
73.0M
    if (s->distance_code < 10) {
1481
57.8M
      base = s->distance_code - 4;
1482
57.8M
    } else {
1483
15.1M
      index_delta = 2;
1484
15.1M
    }
1485
    /* Unpack one of six 4-bit values. */
1486
73.0M
    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
1487
73.0M
    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
1488
73.0M
    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
33
      s->distance_code = 0x7FFFFFFF;
1492
33
    }
1493
73.0M
  }
1494
103M
}
1495
1496
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1497
1.52G
    BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
1498
1.52G
  if (n_bits != 0) {
1499
81.2k
    return BrotliSafeReadBits(br, n_bits, val);
1500
1.52G
  } else {
1501
1.52G
    *val = 0;
1502
1.52G
    return BROTLI_TRUE;
1503
1.52G
  }
1504
1.52G
}
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
18.8k
    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.3k
static void CalculateDistanceLut(BrotliDecoderState* s) {
1584
14.3k
  BrotliMetablockBodyArena* b = &s->arena.body;
1585
14.3k
  uint32_t npostfix = s->distance_postfix_bits;
1586
14.3k
  uint32_t ndirect = s->num_direct_distance_codes;
1587
14.3k
  uint32_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
1588
14.3k
  uint32_t postfix = 1u << npostfix;
1589
14.3k
  uint32_t j;
1590
14.3k
  uint32_t bits = 1;
1591
14.3k
  uint32_t half = 0;
1592
1593
  /* Skip short codes. */
1594
14.3k
  uint32_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
1595
1596
  /* Fill direct codes. */
1597
308k
  for (j = 0; j < ndirect; ++j) {
1598
294k
    b->dist_extra_bits[i] = 0;
1599
294k
    b->dist_offset[i] = j + 1;
1600
294k
    ++i;
1601
294k
  }
1602
1603
  /* Fill regular distance codes. */
1604
701k
  while (i < alphabet_size_limit) {
1605
687k
    uint32_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
1606
    /* Always fill the complete group. */
1607
2.54M
    for (j = 0; j < postfix; ++j) {
1608
1.85M
      b->dist_extra_bits[i] = (uint8_t)bits;
1609
1.85M
      b->dist_offset[i] = base + j;
1610
1.85M
      ++i;
1611
1.85M
    }
1612
687k
    bits = bits + half;
1613
687k
    half = half ^ 1;
1614
687k
  }
1615
14.3k
}
1616
1617
/* Precondition: s->distance_code < 0. */
1618
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
1619
542M
    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1620
542M
  BrotliMetablockBodyArena* b = &s->arena.body;
1621
542M
  uint32_t code;
1622
542M
  uint32_t bits;
1623
542M
  BrotliBitReaderState memento;
1624
542M
  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1625
542M
  if (!safe) {
1626
4.85M
    code = ReadSymbol(distance_tree, br);
1627
537M
  } else {
1628
537M
    BrotliBitReaderSaveState(br, &memento);
1629
537M
    if (!SafeReadSymbol(distance_tree, br, &code)) {
1630
654
      return BROTLI_FALSE;
1631
654
    }
1632
537M
  }
1633
542M
  --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
542M
  s->distance_context = 0;
1637
542M
  if ((code & ~0xFu) == 0) {
1638
103M
    s->distance_code = (int)code;
1639
103M
    TakeDistanceFromRingBuffer(s);
1640
103M
    return BROTLI_TRUE;
1641
103M
  }
1642
439M
  if (!safe) {
1643
1.89M
    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
1644
437M
  } else {
1645
437M
    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
1646
8.60k
      ++s->block_length[2];
1647
8.60k
      BrotliBitReaderRestoreState(br, &memento);
1648
8.60k
      return BROTLI_FALSE;
1649
8.60k
    }
1650
437M
  }
1651
439M
  s->distance_code =
1652
439M
      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
1653
439M
  return BROTLI_TRUE;
1654
439M
}
1655
1656
static BROTLI_INLINE void ReadDistance(
1657
4.85M
    BrotliDecoderState* s, BrotliBitReader* br) {
1658
4.85M
  ReadDistanceInternal(0, s, br);
1659
4.85M
}
1660
1661
static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
1662
537M
    BrotliDecoderState* s, BrotliBitReader* br) {
1663
537M
  return ReadDistanceInternal(1, s, br);
1664
537M
}
1665
1666
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
1667
829M
    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1668
829M
  uint32_t cmd_code;
1669
829M
  uint32_t insert_len_extra = 0;
1670
829M
  uint32_t copy_length;
1671
829M
  CmdLutElement v;
1672
829M
  BrotliBitReaderState memento;
1673
829M
  if (!safe) {
1674
64.7M
    cmd_code = ReadSymbol(s->htree_command, br);
1675
764M
  } else {
1676
764M
    BrotliBitReaderSaveState(br, &memento);
1677
764M
    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
1678
4.76k
      return BROTLI_FALSE;
1679
4.76k
    }
1680
764M
  }
1681
829M
  v = kCmdLut[cmd_code];
1682
829M
  s->distance_code = v.distance_code;
1683
829M
  s->distance_context = v.context;
1684
829M
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1685
829M
  *insert_length = v.insert_len_offset;
1686
829M
  if (!safe) {
1687
64.7M
    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1688
13.0k
      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
1689
13.0k
    }
1690
64.7M
    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
1691
764M
  } else {
1692
764M
    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1693
764M
        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1694
24.2k
      BrotliBitReaderRestoreState(br, &memento);
1695
24.2k
      return BROTLI_FALSE;
1696
24.2k
    }
1697
764M
  }
1698
829M
  s->copy_length = (int)copy_length + v.copy_len_offset;
1699
829M
  --s->block_length[1];
1700
829M
  *insert_length += (int)insert_len_extra;
1701
829M
  return BROTLI_TRUE;
1702
829M
}
1703
1704
static BROTLI_INLINE void ReadCommand(
1705
64.7M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1706
64.7M
  ReadCommandInternal(0, s, br, insert_length);
1707
64.7M
}
1708
1709
static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
1710
764M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1711
764M
  return ReadCommandInternal(1, s, br, insert_length);
1712
764M
}
1713
1714
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
1715
3.53G
    int safe, BrotliBitReader* const br, size_t num) {
1716
3.53G
  if (safe) {
1717
3.06G
    return BROTLI_TRUE;
1718
3.06G
  }
1719
462M
  return BrotliCheckInputAmount(br, num);
1720
3.53G
}
1721
1722
#define BROTLI_SAFE(METHOD)                       \
1723
1.37G
  {                                               \
1724
1.37G
    if (safe) {                                   \
1725
1.30G
      if (!Safe##METHOD) {                        \
1726
75.9k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
1727
75.9k
        goto saveStateAndReturn;                  \
1728
75.9k
      }                                           \
1729
1.30G
    } else {                                      \
1730
69.6M
      METHOD;                                     \
1731
69.6M
    }                                             \
1732
1.37G
  }
1733
1734
static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
1735
563k
    int safe, BrotliDecoderState* s) {
1736
563k
  int pos = s->pos;
1737
563k
  int i = s->loop_counter;
1738
563k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1739
563k
  BrotliBitReader* br = &s->br;
1740
1741
563k
  if (!CheckInputAmount(safe, br, 28)) {
1742
249k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1743
249k
    goto saveStateAndReturn;
1744
249k
  }
1745
314k
  if (!safe) {
1746
43.5k
    BROTLI_UNUSED(BrotliWarmupBitReader(br));
1747
43.5k
  }
1748
1749
  /* Jump into state machine. */
1750
314k
  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
1751
115k
    goto CommandBegin;
1752
198k
  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
1753
56.9k
    goto CommandInner;
1754
141k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
1755
48.7k
    goto CommandPostDecodeLiterals;
1756
92.7k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
1757
92.7k
    goto CommandPostWrapCopy;
1758
92.7k
  } else {
1759
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
1760
0
  }
1761
1762
829M
CommandBegin:
1763
829M
  if (safe) {
1764
764M
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1765
764M
  }
1766
829M
  if (!CheckInputAmount(safe, br, 28)) {  /* 156 bits + 7 bytes */
1767
8.06k
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1768
8.06k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1769
8.06k
    goto saveStateAndReturn;
1770
8.06k
  }
1771
829M
  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
1772
55.6k
    BROTLI_SAFE(DecodeCommandBlockSwitch(s));
1773
33.7k
    goto CommandBegin;
1774
55.6k
  }
1775
  /* Read the insert/copy length in the command. */
1776
829M
  BROTLI_SAFE(ReadCommand(s, br, &i));
1777
829M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
1778
829M
              pos, i, s->copy_length));
1779
829M
  if (i == 0) {
1780
64.7M
    goto CommandPostDecodeLiterals;
1781
64.7M
  }
1782
764M
  s->meta_block_remaining_len -= i;
1783
1784
764M
CommandInner:
1785
764M
  if (safe) {
1786
704M
    s->state = BROTLI_STATE_COMMAND_INNER;
1787
704M
  }
1788
  /* Read the literals in the command. */
1789
764M
  if (s->trivial_literal_context) {
1790
756M
    uint32_t bits;
1791
756M
    uint32_t value;
1792
756M
    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
1793
2.60G
    do {
1794
2.60G
      if (!CheckInputAmount(safe, br, 28)) {  /* 162 bits + 7 bytes */
1795
8.89k
        s->state = BROTLI_STATE_COMMAND_INNER;
1796
8.89k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1797
8.89k
        goto saveStateAndReturn;
1798
8.89k
      }
1799
2.60G
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
1800
30.6k
        BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
1801
24.5k
        PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
1802
24.5k
        if (!s->trivial_literal_context) goto CommandInner;
1803
24.5k
      }
1804
2.60G
      if (!safe) {
1805
368M
        s->ringbuffer[pos] =
1806
368M
            (uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value);
1807
2.23G
      } else {
1808
2.23G
        uint32_t literal;
1809
2.23G
        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
1810
1.05k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1811
1.05k
          goto saveStateAndReturn;
1812
1.05k
        }
1813
2.23G
        s->ringbuffer[pos] = (uint8_t)literal;
1814
2.23G
      }
1815
2.60G
      --s->block_length[0];
1816
2.60G
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
1817
2.60G
      ++pos;
1818
2.60G
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
1819
55.5k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
1820
55.5k
        --i;
1821
55.5k
        goto saveStateAndReturn;
1822
55.5k
      }
1823
2.60G
    } while (--i != 0);
1824
756M
  } else {
1825
7.36M
    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
1826
7.36M
    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
1827
101M
    do {
1828
101M
      const HuffmanCode* hc;
1829
101M
      uint8_t context;
1830
101M
      if (!CheckInputAmount(safe, br, 28)) {  /* 162 bits + 7 bytes */
1831
4.09k
        s->state = BROTLI_STATE_COMMAND_INNER;
1832
4.09k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1833
4.09k
        goto saveStateAndReturn;
1834
4.09k
      }
1835
101M
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
1836
13.6k
        BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
1837
11.1k
        if (s->trivial_literal_context) goto CommandInner;
1838
11.1k
      }
1839
101M
      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
1840
101M
      BROTLI_LOG_UINT(context);
1841
101M
      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
1842
101M
      p2 = p1;
1843
101M
      if (!safe) {
1844
28.6M
        p1 = (uint8_t)ReadSymbol(hc, br);
1845
73.1M
      } else {
1846
73.1M
        uint32_t literal;
1847
73.1M
        if (!SafeReadSymbol(hc, br, &literal)) {
1848
4.78k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1849
4.78k
          goto saveStateAndReturn;
1850
4.78k
        }
1851
73.1M
        p1 = (uint8_t)literal;
1852
73.1M
      }
1853
101M
      s->ringbuffer[pos] = p1;
1854
101M
      --s->block_length[0];
1855
101M
      BROTLI_LOG_UINT(s->context_map_slice[context]);
1856
101M
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
1857
101M
      ++pos;
1858
101M
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
1859
7.72k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
1860
7.72k
        --i;
1861
7.72k
        goto saveStateAndReturn;
1862
7.72k
      }
1863
101M
    } while (--i != 0);
1864
7.36M
  }
1865
764M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
1866
764M
  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
1867
8.35k
    s->state = BROTLI_STATE_METABLOCK_DONE;
1868
8.35k
    goto saveStateAndReturn;
1869
8.35k
  }
1870
1871
829M
CommandPostDecodeLiterals:
1872
829M
  if (safe) {
1873
764M
    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
1874
764M
  }
1875
829M
  if (s->distance_code >= 0) {
1876
    /* Implicit distance case. */
1877
286M
    s->distance_context = s->distance_code ? 0 : 1;
1878
286M
    --s->dist_rb_idx;
1879
286M
    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
1880
542M
  } else {
1881
    /* Read distance code in the command, unless it was implicitly zero. */
1882
542M
    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
1883
23.0k
      BROTLI_SAFE(DecodeDistanceBlockSwitch(s));
1884
16.0k
    }
1885
542M
    BROTLI_SAFE(ReadDistance(s, br));
1886
542M
  }
1887
829M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
1888
829M
              pos, s->distance_code));
1889
829M
  if (s->max_distance != s->max_backward_distance) {
1890
232M
    s->max_distance =
1891
232M
        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
1892
232M
  }
1893
829M
  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
829M
  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
25.7M
    if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
1901
33
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
1902
33
          "len: %d bytes left: %d\n",
1903
33
          pos, s->distance_code, i, s->meta_block_remaining_len));
1904
33
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
1905
33
    }
1906
25.7M
    if (i >= BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
1907
25.7M
        i <= BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
1908
25.7M
      int address = s->distance_code - s->max_distance - 1;
1909
25.7M
      const BrotliDictionary* words = s->dictionary;
1910
25.7M
      const BrotliTransforms* transforms = s->transforms;
1911
25.7M
      int offset = (int)s->dictionary->offsets_by_length[i];
1912
25.7M
      uint32_t shift = s->dictionary->size_bits_by_length[i];
1913
1914
25.7M
      int mask = (int)BitMask(shift);
1915
25.7M
      int word_idx = address & mask;
1916
25.7M
      int transform_idx = address >> shift;
1917
      /* Compensate double distance-ring-buffer roll. */
1918
25.7M
      s->dist_rb_idx += s->distance_context;
1919
25.7M
      offset += word_idx * i;
1920
25.7M
      if (BROTLI_PREDICT_FALSE(!words->data)) {
1921
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
1922
0
      }
1923
25.7M
      if (transform_idx < (int)transforms->num_transforms) {
1924
25.7M
        const uint8_t* word = &words->data[offset];
1925
25.7M
        int len = i;
1926
25.7M
        if (transform_idx == transforms->cutOffTransforms[0]) {
1927
25.7M
          memcpy(&s->ringbuffer[pos], word, (size_t)len);
1928
25.7M
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
1929
25.7M
                      len, word));
1930
25.7M
        } else {
1931
22.0k
          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
1932
22.0k
              transforms, transform_idx);
1933
22.0k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
1934
22.0k
                      " transform_idx = %d, transformed: [%.*s]\n",
1935
22.0k
                      i, word, transform_idx, len, &s->ringbuffer[pos]));
1936
22.0k
        }
1937
25.7M
        pos += len;
1938
25.7M
        s->meta_block_remaining_len -= len;
1939
25.7M
        if (pos >= s->ringbuffer_size) {
1940
43.1k
          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
1941
43.1k
          goto saveStateAndReturn;
1942
43.1k
        }
1943
25.7M
      } else {
1944
141
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
1945
141
            "len: %d bytes left: %d\n",
1946
141
            pos, s->distance_code, i, s->meta_block_remaining_len));
1947
141
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
1948
141
      }
1949
25.7M
    } else {
1950
88
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
1951
88
          "len: %d bytes left: %d\n",
1952
88
          pos, s->distance_code, i, s->meta_block_remaining_len));
1953
88
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
1954
88
    }
1955
803M
  } else {
1956
803M
    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
1957
803M
    uint8_t* copy_dst = &s->ringbuffer[pos];
1958
803M
    uint8_t* copy_src = &s->ringbuffer[src_start];
1959
803M
    int dst_end = pos + i;
1960
803M
    int src_end = src_start + i;
1961
    /* Update the recent distances cache. */
1962
803M
    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
1963
803M
    ++s->dist_rb_idx;
1964
803M
    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
803M
    memmove16(copy_dst, copy_src);
1969
803M
    if (src_end > pos && dst_end > src_start) {
1970
      /* Regions intersect. */
1971
226M
      goto CommandPostWrapCopy;
1972
226M
    }
1973
576M
    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
1974
      /* At least one region wraps. */
1975
115k
      goto CommandPostWrapCopy;
1976
115k
    }
1977
576M
    pos += i;
1978
576M
    if (i > 16) {
1979
11.5k
      if (i > 32) {
1980
2.83k
        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
1981
8.71k
      } else {
1982
        /* This branch covers about 45% cases.
1983
           Fixed size short copy allows more compiler optimizations. */
1984
8.71k
        memmove16(copy_dst + 16, copy_src + 16);
1985
8.71k
      }
1986
11.5k
    }
1987
576M
  }
1988
602M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
1989
602M
  if (s->meta_block_remaining_len <= 0) {
1990
    /* Next metablock, if any. */
1991
1.45k
    s->state = BROTLI_STATE_METABLOCK_DONE;
1992
1.45k
    goto saveStateAndReturn;
1993
602M
  } else {
1994
602M
    goto CommandBegin;
1995
602M
  }
1996
226M
CommandPostWrapCopy:
1997
226M
  {
1998
226M
    int wrap_guard = s->ringbuffer_size - pos;
1999
3.08G
    while (--i >= 0) {
2000
2.86G
      s->ringbuffer[pos] =
2001
2.86G
          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
2002
2.86G
      ++pos;
2003
2.86G
      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
2004
92.9k
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
2005
92.9k
        goto saveStateAndReturn;
2006
92.9k
      }
2007
2.86G
    }
2008
226M
  }
2009
226M
  if (s->meta_block_remaining_len <= 0) {
2010
    /* Next metablock, if any. */
2011
1.72k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2012
1.72k
    goto saveStateAndReturn;
2013
226M
  } else {
2014
226M
    goto CommandBegin;
2015
226M
  }
2016
2017
563k
saveStateAndReturn:
2018
563k
  s->pos = pos;
2019
563k
  s->loop_counter = i;
2020
563k
  return result;
2021
226M
}
2022
2023
#undef BROTLI_SAFE
2024
2025
static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
2026
292k
    BrotliDecoderState* s) {
2027
292k
  return ProcessCommandsInternal(0, s);
2028
292k
}
2029
2030
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
2031
270k
    BrotliDecoderState* s) {
2032
270k
  return ProcessCommandsInternal(1, s);
2033
270k
}
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
531k
    size_t* available_out, uint8_t** next_out, size_t* total_out) {
2072
531k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2073
531k
  BrotliBitReader* br = &s->br;
2074
  /* Ensure that |total_out| is set, even if no data will ever be pushed out. */
2075
531k
  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
531k
  if ((int)s->error_code < 0) {
2080
0
    return BROTLI_DECODER_RESULT_ERROR;
2081
0
  }
2082
531k
  if (*available_out && (!next_out || !*next_out)) {
2083
0
    return SaveErrorCode(
2084
0
        s, BROTLI_FAILURE(BROTLI_DECODER_ERROR_INVALID_ARGUMENTS));
2085
0
  }
2086
531k
  if (!*available_out) next_out = 0;
2087
531k
  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
2088
519k
    br->avail_in = *available_in;
2089
519k
    br->next_in = *next_in;
2090
519k
  } 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.7k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2095
11.7k
    br->next_in = &s->buffer.u8[0];
2096
11.7k
  }
2097
  /* State machine */
2098
1.63M
  for (;;) {
2099
1.63M
    if (result != BROTLI_DECODER_SUCCESS) {
2100
      /* Error, needs more input/output. */
2101
549k
      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2102
313k
        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
2103
250k
          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
2104
250k
              available_out, next_out, total_out, BROTLI_TRUE);
2105
          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
2106
250k
          if ((int)intermediate_result < 0) {
2107
14
            result = intermediate_result;
2108
14
            break;
2109
14
          }
2110
250k
        }
2111
313k
        if (s->buffer_length != 0) {  /* Used with internal buffer. */
2112
21.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
7.22k
            s->buffer_length = 0;
2117
            /* Switch to input stream and restart. */
2118
7.22k
            result = BROTLI_DECODER_SUCCESS;
2119
7.22k
            br->avail_in = *available_in;
2120
7.22k
            br->next_in = *next_in;
2121
7.22k
            continue;
2122
14.7k
          } else if (*available_in != 0) {
2123
            /* Not enough data in buffer, but can take one more byte from
2124
               input stream. */
2125
11.7k
            result = BROTLI_DECODER_SUCCESS;
2126
11.7k
            s->buffer.u8[s->buffer_length] = **next_in;
2127
11.7k
            s->buffer_length++;
2128
11.7k
            br->avail_in = s->buffer_length;
2129
11.7k
            (*next_in)++;
2130
11.7k
            (*available_in)--;
2131
            /* Retry with more data in buffer. */
2132
11.7k
            continue;
2133
11.7k
          }
2134
          /* Can't finish reading and no more input. */
2135
2.97k
          break;
2136
291k
        } else {  /* Input stream doesn't contain enough input. */
2137
          /* Copy tail to internal buffer and return. */
2138
291k
          *next_in = br->next_in;
2139
291k
          *available_in = br->avail_in;
2140
300k
          while (*available_in) {
2141
8.99k
            s->buffer.u8[s->buffer_length] = **next_in;
2142
8.99k
            s->buffer_length++;
2143
8.99k
            (*next_in)++;
2144
8.99k
            (*available_in)--;
2145
8.99k
          }
2146
291k
          break;
2147
291k
        }
2148
        /* Unreachable. */
2149
313k
      }
2150
2151
      /* Fail or needs more output. */
2152
2153
236k
      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.58k
        s->buffer_length = 0;
2157
235k
      } 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
235k
        BrotliBitReaderUnload(br);
2162
235k
        *available_in = br->avail_in;
2163
235k
        *next_in = br->next_in;
2164
235k
      }
2165
236k
      break;
2166
549k
    }
2167
1.08M
    switch (s->state) {
2168
11.1k
      case BROTLI_STATE_UNINITED:
2169
        /* Prepare to the first read. */
2170
11.1k
        if (!BrotliWarmupBitReader(br)) {
2171
4.38k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2172
4.38k
          break;
2173
4.38k
        }
2174
        /* Decode window size. */
2175
6.80k
        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
2176
6.80k
        if (result != BROTLI_DECODER_SUCCESS) {
2177
2
          break;
2178
2
        }
2179
6.80k
        if (s->large_window) {
2180
0
          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
2181
0
          break;
2182
0
        }
2183
6.80k
        s->state = BROTLI_STATE_INITIALIZE;
2184
6.80k
        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.80k
      case BROTLI_STATE_INITIALIZE:
2200
6.80k
        BROTLI_LOG_UINT(s->window_bits);
2201
        /* Maximum distance, see section 9.1. of the spec. */
2202
6.80k
        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.80k
        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
2206
6.80k
            sizeof(HuffmanCode) * 3 *
2207
6.80k
                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2208
6.80k
        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.80k
        s->block_len_trees =
2213
6.80k
            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
2214
2215
6.80k
        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2216
      /* Fall through. */
2217
2218
25.6k
      case BROTLI_STATE_METABLOCK_BEGIN:
2219
25.6k
        BrotliDecoderStateMetablockBegin(s);
2220
25.6k
        BROTLI_LOG_UINT(s->pos);
2221
25.6k
        s->state = BROTLI_STATE_METABLOCK_HEADER;
2222
      /* Fall through. */
2223
2224
54.0k
      case BROTLI_STATE_METABLOCK_HEADER:
2225
54.0k
        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
2226
54.0k
        if (result != BROTLI_DECODER_SUCCESS) {
2227
28.7k
          break;
2228
28.7k
        }
2229
25.2k
        BROTLI_LOG_UINT(s->is_last_metablock);
2230
25.2k
        BROTLI_LOG_UINT(s->meta_block_remaining_len);
2231
25.2k
        BROTLI_LOG_UINT(s->is_metadata);
2232
25.2k
        BROTLI_LOG_UINT(s->is_uncompressed);
2233
25.2k
        if (s->is_metadata || s->is_uncompressed) {
2234
8.13k
          if (!BrotliJumpToByteBoundary(br)) {
2235
43
            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
2236
43
            break;
2237
43
          }
2238
8.13k
        }
2239
25.2k
        if (s->is_metadata) {
2240
5.19k
          s->state = BROTLI_STATE_METADATA;
2241
5.19k
          break;
2242
5.19k
        }
2243
20.0k
        if (s->meta_block_remaining_len == 0) {
2244
314
          s->state = BROTLI_STATE_METABLOCK_DONE;
2245
314
          break;
2246
314
        }
2247
19.7k
        BrotliCalculateRingBufferSize(s);
2248
19.7k
        if (s->is_uncompressed) {
2249
2.89k
          s->state = BROTLI_STATE_UNCOMPRESSED;
2250
2.89k
          break;
2251
2.89k
        }
2252
16.8k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER;
2253
      /* Fall through. */
2254
2255
16.8k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: {
2256
16.8k
        BrotliMetablockHeaderArena* h = &s->arena.header;
2257
16.8k
        s->loop_counter = 0;
2258
        /* Initialize compressed metablock header arena. */
2259
16.8k
        h->sub_loop_counter = 0;
2260
        /* Make small negative indexes addressable. */
2261
16.8k
        h->symbol_lists =
2262
16.8k
            &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
2263
16.8k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
2264
16.8k
        h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
2265
16.8k
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
2266
16.8k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2267
16.8k
      }
2268
      /* Fall through. */
2269
2270
68.7k
      case BROTLI_STATE_HUFFMAN_CODE_0:
2271
68.7k
        if (s->loop_counter >= 3) {
2272
16.0k
          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
2273
16.0k
          break;
2274
16.0k
        }
2275
        /* Reads 1..11 bits. */
2276
52.6k
        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
2277
52.6k
        if (result != BROTLI_DECODER_SUCCESS) {
2278
3.37k
          break;
2279
3.37k
        }
2280
49.3k
        s->num_block_types[s->loop_counter]++;
2281
49.3k
        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2282
49.3k
        if (s->num_block_types[s->loop_counter] < 2) {
2283
44.5k
          s->loop_counter++;
2284
44.5k
          break;
2285
44.5k
        }
2286
4.74k
        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2287
      /* Fall through. */
2288
2289
9.24k
      case BROTLI_STATE_HUFFMAN_CODE_1: {
2290
9.24k
        uint32_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
2291
9.24k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2292
9.24k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2293
9.24k
            &s->block_type_trees[tree_offset], NULL, s);
2294
9.24k
        if (result != BROTLI_DECODER_SUCCESS) break;
2295
4.33k
        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2296
4.33k
      }
2297
      /* Fall through. */
2298
2299
13.5k
      case BROTLI_STATE_HUFFMAN_CODE_2: {
2300
13.5k
        uint32_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
2301
13.5k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2302
13.5k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2303
13.5k
            &s->block_len_trees[tree_offset], NULL, s);
2304
13.5k
        if (result != BROTLI_DECODER_SUCCESS) break;
2305
4.12k
        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2306
4.12k
      }
2307
      /* Fall through. */
2308
2309
5.47k
      case BROTLI_STATE_HUFFMAN_CODE_3: {
2310
5.47k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2311
5.47k
        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2312
5.47k
            &s->block_len_trees[tree_offset], br)) {
2313
1.42k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2314
1.42k
          break;
2315
1.42k
        }
2316
4.05k
        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2317
4.05k
        s->loop_counter++;
2318
4.05k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2319
4.05k
        break;
2320
5.47k
      }
2321
2322
69.1k
      case BROTLI_STATE_UNCOMPRESSED: {
2323
69.1k
        result = CopyUncompressedBlockToOutput(
2324
69.1k
            available_out, next_out, total_out, s);
2325
69.1k
        if (result != BROTLI_DECODER_SUCCESS) {
2326
66.5k
          break;
2327
66.5k
        }
2328
2.52k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2329
2.52k
        break;
2330
69.1k
      }
2331
2332
16.5k
      case BROTLI_STATE_METADATA:
2333
913k
        for (; s->meta_block_remaining_len > 0; --s->meta_block_remaining_len) {
2334
908k
          uint32_t bits;
2335
          /* Read one byte and ignore it. */
2336
908k
          if (!BrotliSafeReadBits(br, 8, &bits)) {
2337
11.4k
            result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2338
11.4k
            break;
2339
11.4k
          }
2340
908k
        }
2341
16.5k
        if (result == BROTLI_DECODER_SUCCESS) {
2342
5.08k
          s->state = BROTLI_STATE_METABLOCK_DONE;
2343
5.08k
        }
2344
16.5k
        break;
2345
2346
23.7k
      case BROTLI_STATE_METABLOCK_HEADER_2: {
2347
23.7k
        uint32_t bits;
2348
23.7k
        if (!BrotliSafeReadBits(br, 6, &bits)) {
2349
7.83k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2350
7.83k
          break;
2351
7.83k
        }
2352
15.9k
        s->distance_postfix_bits = bits & BitMask(2);
2353
15.9k
        bits >>= 2;
2354
15.9k
        s->num_direct_distance_codes = bits << s->distance_postfix_bits;
2355
15.9k
        BROTLI_LOG_UINT(s->num_direct_distance_codes);
2356
15.9k
        BROTLI_LOG_UINT(s->distance_postfix_bits);
2357
15.9k
        s->context_modes =
2358
15.9k
            (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
2359
15.9k
        if (s->context_modes == 0) {
2360
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
2361
0
          break;
2362
0
        }
2363
15.9k
        s->loop_counter = 0;
2364
15.9k
        s->state = BROTLI_STATE_CONTEXT_MODES;
2365
15.9k
      }
2366
      /* Fall through. */
2367
2368
17.9k
      case BROTLI_STATE_CONTEXT_MODES:
2369
17.9k
        result = ReadContextModes(s);
2370
17.9k
        if (result != BROTLI_DECODER_SUCCESS) {
2371
2.04k
          break;
2372
2.04k
        }
2373
15.9k
        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2374
      /* Fall through. */
2375
2376
27.1k
      case BROTLI_STATE_CONTEXT_MAP_1:
2377
27.1k
        result = DecodeContextMap(
2378
27.1k
            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2379
27.1k
            &s->num_literal_htrees, &s->context_map, s);
2380
27.1k
        if (result != BROTLI_DECODER_SUCCESS) {
2381
11.5k
          break;
2382
11.5k
        }
2383
15.6k
        DetectTrivialLiteralBlockTypes(s);
2384
15.6k
        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2385
      /* Fall through. */
2386
2387
18.0k
      case BROTLI_STATE_CONTEXT_MAP_2: {
2388
18.0k
        uint32_t npostfix = s->distance_postfix_bits;
2389
18.0k
        uint32_t ndirect = s->num_direct_distance_codes;
2390
18.0k
        uint32_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2391
18.0k
            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
2392
18.0k
        uint32_t distance_alphabet_size_limit = distance_alphabet_size_max;
2393
18.0k
        BROTLI_BOOL allocation_success = BROTLI_TRUE;
2394
18.0k
        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.0k
        result = DecodeContextMap(
2402
18.0k
            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2403
18.0k
            &s->num_dist_htrees, &s->dist_context_map, s);
2404
18.0k
        if (result != BROTLI_DECODER_SUCCESS) {
2405
2.67k
          break;
2406
2.67k
        }
2407
15.3k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2408
15.3k
            s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
2409
15.3k
            BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
2410
15.3k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2411
15.3k
            s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
2412
15.3k
            BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
2413
15.3k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2414
15.3k
            s, &s->distance_hgroup, distance_alphabet_size_max,
2415
15.3k
            distance_alphabet_size_limit, s->num_dist_htrees);
2416
15.3k
        if (!allocation_success) {
2417
0
          return SaveErrorCode(s,
2418
0
              BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
2419
0
        }
2420
15.3k
        s->loop_counter = 0;
2421
15.3k
        s->state = BROTLI_STATE_TREE_GROUP;
2422
15.3k
      }
2423
      /* Fall through. */
2424
2425
113k
      case BROTLI_STATE_TREE_GROUP: {
2426
113k
        HuffmanTreeGroup* hgroup = NULL;
2427
113k
        switch (s->loop_counter) {
2428
36.4k
          case 0: hgroup = &s->literal_hgroup; break;
2429
40.1k
          case 1: hgroup = &s->insert_copy_hgroup; break;
2430
36.5k
          case 2: hgroup = &s->distance_hgroup; break;
2431
0
          default: return SaveErrorCode(s, BROTLI_FAILURE(
2432
0
              BROTLI_DECODER_ERROR_UNREACHABLE));
2433
113k
        }
2434
113k
        result = HuffmanTreeGroupDecode(hgroup, s);
2435
113k
        if (result != BROTLI_DECODER_SUCCESS) break;
2436
43.8k
        s->loop_counter++;
2437
43.8k
        if (s->loop_counter < 3) {
2438
29.5k
          break;
2439
29.5k
        }
2440
14.3k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY;
2441
14.3k
      }
2442
      /* Fall through. */
2443
2444
14.3k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY:
2445
14.3k
        PrepareLiteralDecoding(s);
2446
14.3k
        s->dist_context_map_slice = s->dist_context_map;
2447
14.3k
        s->htree_command = s->insert_copy_hgroup.htrees[0];
2448
14.3k
        if (!BrotliEnsureRingBuffer(s)) {
2449
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
2450
0
          break;
2451
0
        }
2452
14.3k
        CalculateDistanceLut(s);
2453
14.3k
        s->state = BROTLI_STATE_COMMAND_BEGIN;
2454
      /* Fall through. */
2455
2456
107k
      case BROTLI_STATE_COMMAND_BEGIN:
2457
      /* Fall through. */
2458
151k
      case BROTLI_STATE_COMMAND_INNER:
2459
      /* Fall through. */
2460
200k
      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2461
      /* Fall through. */
2462
292k
      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2463
292k
        result = ProcessCommands(s);
2464
292k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2465
270k
          result = SafeProcessCommands(s);
2466
270k
        }
2467
292k
        break;
2468
2469
126k
      case BROTLI_STATE_COMMAND_INNER_WRITE:
2470
      /* Fall through. */
2471
244k
      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2472
      /* Fall through. */
2473
430k
      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2474
430k
        result = WriteRingBuffer(
2475
430k
            s, available_out, next_out, total_out, BROTLI_FALSE);
2476
430k
        if (result != BROTLI_DECODER_SUCCESS) {
2477
231k
          break;
2478
231k
        }
2479
198k
        WrapRingBuffer(s);
2480
198k
        if (s->ringbuffer_size == 1 << s->window_bits) {
2481
198k
          s->max_distance = s->max_backward_distance;
2482
198k
        }
2483
198k
        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
2484
43.0k
          if (s->meta_block_remaining_len == 0) {
2485
            /* Next metablock, if any. */
2486
37
            s->state = BROTLI_STATE_METABLOCK_DONE;
2487
43.0k
          } else {
2488
43.0k
            s->state = BROTLI_STATE_COMMAND_BEGIN;
2489
43.0k
          }
2490
43.0k
          break;
2491
155k
        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2492
92.7k
          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2493
92.7k
        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2494
63.1k
          if (s->loop_counter == 0) {
2495
33.3k
            if (s->meta_block_remaining_len == 0) {
2496
249
              s->state = BROTLI_STATE_METABLOCK_DONE;
2497
33.1k
            } else {
2498
33.1k
              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2499
33.1k
            }
2500
33.3k
            break;
2501
33.3k
          }
2502
29.7k
          s->state = BROTLI_STATE_COMMAND_INNER;
2503
29.7k
        }
2504
122k
        break;
2505
2506
122k
      case BROTLI_STATE_METABLOCK_DONE:
2507
19.7k
        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
19.2k
        BrotliDecoderStateCleanupAfterMetablock(s);
2512
19.2k
        if (!s->is_last_metablock) {
2513
18.8k
          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2514
18.8k
          break;
2515
18.8k
        }
2516
402
        if (!BrotliJumpToByteBoundary(br)) {
2517
36
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2518
36
          break;
2519
36
        }
2520
366
        if (s->buffer_length == 0) {
2521
362
          BrotliBitReaderUnload(br);
2522
362
          *available_in = br->avail_in;
2523
362
          *next_in = br->next_in;
2524
362
        }
2525
366
        s->state = BROTLI_STATE_DONE;
2526
      /* Fall through. */
2527
2528
392
      case BROTLI_STATE_DONE:
2529
392
        if (s->ringbuffer != 0) {
2530
65
          result = WriteRingBuffer(
2531
65
              s, available_out, next_out, total_out, BROTLI_TRUE);
2532
65
          if (result != BROTLI_DECODER_SUCCESS) {
2533
38
            break;
2534
38
          }
2535
65
        }
2536
354
        return SaveErrorCode(s, result);
2537
1.08M
    }
2538
1.08M
  }
2539
530k
  return SaveErrorCode(s, result);
2540
531k
}
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
529k
const uint8_t* BrotliDecoderTakeOutput(BrotliDecoderState* s, size_t* size) {
2552
529k
  uint8_t* result = 0;
2553
529k
  size_t available_out = *size ? *size : 1u << 24;
2554
529k
  size_t requested_out = available_out;
2555
529k
  BrotliDecoderErrorCode status;
2556
529k
  if ((s->ringbuffer == 0) || ((int)s->error_code < 0)) {
2557
62.9k
    *size = 0;
2558
62.9k
    return 0;
2559
62.9k
  }
2560
466k
  WrapRingBuffer(s);
2561
466k
  status = WriteRingBuffer(s, &available_out, &result, 0, BROTLI_TRUE);
2562
  /* Either WriteRingBuffer returns those "success" codes... */
2563
466k
  if (status == BROTLI_DECODER_SUCCESS ||
2564
466k
      status == BROTLI_DECODER_NEEDS_MORE_OUTPUT) {
2565
466k
    *size = requested_out - available_out;
2566
466k
  } 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
466k
  return result;
2574
529k
}
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