Coverage Report

Created: 2025-12-31 06:23

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.66k
#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.83G
#define HUFFMAN_TABLE_BITS 8U
40
1.21k
#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.44k
    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
79
7.44k
  BrotliDecoderState* state = 0;
80
7.44k
  if (!alloc_func && !free_func) {
81
7.44k
    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
82
7.44k
  } else if (alloc_func && free_func) {
83
0
    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
84
0
  }
85
7.44k
  if (state == 0) {
86
0
    BROTLI_DUMP();
87
0
    return 0;
88
0
  }
89
7.44k
  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.44k
  return state;
99
7.44k
}
100
101
/* Deinitializes and frees BrotliDecoderState instance. */
102
7.44k
void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
103
7.44k
  if (!state) {
104
0
    return;
105
7.44k
  } else {
106
7.44k
    brotli_free_func free_func = state->free_func;
107
7.44k
    void* opaque = state->memory_manager_opaque;
108
7.44k
    BrotliDecoderStateCleanup(state);
109
7.44k
    free_func(opaque, state);
110
7.44k
  }
111
7.44k
}
112
113
/* Saves error code and converts it to BrotliDecoderResult. */
114
static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
115
617k
    BrotliDecoderState* s, BrotliDecoderErrorCode e) {
116
617k
  s->error_code = (int)e;
117
617k
  switch (e) {
118
355
    case BROTLI_DECODER_SUCCESS:
119
355
      return BROTLI_DECODER_RESULT_SUCCESS;
120
121
273k
    case BROTLI_DECODER_NEEDS_MORE_INPUT:
122
273k
      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
123
124
341k
    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
125
341k
      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
126
127
1.66k
    default:
128
1.66k
      return BROTLI_DECODER_RESULT_ERROR;
129
617k
  }
130
617k
}
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
7.07k
                                               BrotliBitReader* br) {
136
7.07k
  uint32_t n;
137
7.07k
  BROTLI_BOOL large_window = s->large_window;
138
7.07k
  s->large_window = BROTLI_FALSE;
139
7.07k
  BrotliTakeBits(br, 1, &n);
140
7.07k
  if (n == 0) {
141
4.80k
    s->window_bits = 16;
142
4.80k
    return BROTLI_DECODER_SUCCESS;
143
4.80k
  }
144
2.27k
  BrotliTakeBits(br, 3, &n);
145
2.27k
  if (n != 0) {
146
1.27k
    s->window_bits = 17 + n;
147
1.27k
    return BROTLI_DECODER_SUCCESS;
148
1.27k
  }
149
1.00k
  BrotliTakeBits(br, 3, &n);
150
1.00k
  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
999
  if (n != 0) {
163
901
    s->window_bits = 8 + n;
164
901
    return BROTLI_DECODER_SUCCESS;
165
901
  }
166
98
  s->window_bits = 17;
167
98
  return BROTLI_DECODER_SUCCESS;
168
999
}
169
170
892M
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
892M
  uint32_t buffer[4];
175
892M
  memcpy(buffer, src, 16);
176
892M
  memcpy(dst, buffer, 16);
177
892M
#endif
178
892M
}
179
180
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
181
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
182
89.1k
    BrotliDecoderState* s, BrotliBitReader* br, uint32_t* value) {
183
89.1k
  uint32_t bits;
184
89.1k
  switch (s->substate_decode_uint8) {
185
85.8k
    case BROTLI_STATE_DECODE_UINT8_NONE:
186
85.8k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
187
5.05k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
188
5.05k
      }
189
80.7k
      if (bits == 0) {
190
72.1k
        *value = 0;
191
72.1k
        return BROTLI_DECODER_SUCCESS;
192
72.1k
      }
193
    /* Fall through. */
194
195
10.7k
    case BROTLI_STATE_DECODE_UINT8_SHORT:
196
10.7k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
197
2.16k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
198
2.16k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
199
2.16k
      }
200
8.59k
      if (bits == 0) {
201
3.92k
        *value = 1;
202
3.92k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
203
3.92k
        return BROTLI_DECODER_SUCCESS;
204
3.92k
      }
205
      /* Use output value as a temporary storage. It MUST be persisted. */
206
4.66k
      *value = bits;
207
    /* Fall through. */
208
209
5.82k
    case BROTLI_STATE_DECODE_UINT8_LONG:
210
5.82k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
211
1.20k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
212
1.20k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
213
1.20k
      }
214
4.62k
      *value = (1U << *value) + bits;
215
4.62k
      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
216
4.62k
      return BROTLI_DECODER_SUCCESS;
217
218
0
    default:
219
0
      return
220
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
221
89.1k
  }
222
89.1k
}
223
224
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
225
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
226
51.8k
    BrotliDecoderState* s, BrotliBitReader* br) {
227
51.8k
  uint32_t bits;
228
51.8k
  int i;
229
81.7k
  for (;;) {
230
81.7k
    switch (s->substate_metablock_header) {
231
28.8k
      case BROTLI_STATE_METABLOCK_HEADER_NONE:
232
28.8k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
233
2.86k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
234
2.86k
        }
235
25.9k
        s->is_last_metablock = bits ? 1 : 0;
236
25.9k
        s->meta_block_remaining_len = 0;
237
25.9k
        s->is_uncompressed = 0;
238
25.9k
        s->is_metadata = 0;
239
25.9k
        if (!s->is_last_metablock) {
240
24.0k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
241
24.0k
          break;
242
24.0k
        }
243
1.88k
        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
36
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
249
36
        }
250
1.86k
        if (bits) {
251
287
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
252
287
          return BROTLI_DECODER_SUCCESS;
253
287
        }
254
1.57k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
255
      /* Fall through. */
256
257
28.1k
      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
258
28.1k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
259
2.61k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
260
2.61k
        }
261
25.5k
        s->size_nibbles = (uint8_t)(bits + 4);
262
25.5k
        s->loop_counter = 0;
263
25.5k
        if (bits == 3) {
264
5.81k
          s->is_metadata = 1;
265
5.81k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
266
5.81k
          break;
267
5.81k
        }
268
19.7k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
269
      /* Fall through. */
270
271
37.9k
      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
272
37.9k
        i = s->loop_counter;
273
120k
        for (; i < (int)s->size_nibbles; ++i) {
274
100k
          if (!BrotliSafeReadBits(br, 4, &bits)) {
275
18.3k
            s->loop_counter = i;
276
18.3k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
277
18.3k
          }
278
82.2k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
279
2.21k
              bits == 0) {
280
8
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
281
8
          }
282
82.2k
          s->meta_block_remaining_len |= (int)(bits << (i * 4));
283
82.2k
        }
284
19.6k
        s->substate_metablock_header =
285
19.6k
            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
286
      /* Fall through. */
287
288
19.7k
      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
289
19.7k
        if (!s->is_last_metablock) {
290
18.3k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
291
152
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
292
152
          }
293
18.2k
          s->is_uncompressed = bits ? 1 : 0;
294
18.2k
        }
295
19.5k
        ++s->meta_block_remaining_len;
296
19.5k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
297
19.5k
        return BROTLI_DECODER_SUCCESS;
298
299
6.90k
      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
300
6.90k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
301
1.09k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
302
1.09k
        }
303
5.81k
        if (bits != 0) {
304
18
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
305
18
        }
306
5.79k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
307
      /* Fall through. */
308
309
6.12k
      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
310
6.12k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
311
339
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
312
339
        }
313
5.78k
        if (bits == 0) {
314
4.31k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
315
4.31k
          return BROTLI_DECODER_SUCCESS;
316
4.31k
        }
317
1.47k
        s->size_nibbles = (uint8_t)bits;
318
1.47k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
319
      /* Fall through. */
320
321
2.12k
      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
322
2.12k
        i = s->loop_counter;
323
3.90k
        for (; i < (int)s->size_nibbles; ++i) {
324
2.46k
          if (!BrotliSafeReadBits(br, 8, &bits)) {
325
682
            s->loop_counter = i;
326
682
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
327
682
          }
328
1.78k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
329
294
              bits == 0) {
330
6
            return BROTLI_FAILURE(
331
6
                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
332
6
          }
333
1.78k
          s->meta_block_remaining_len |= (int)(bits << (i * 8));
334
1.78k
        }
335
1.43k
        ++s->meta_block_remaining_len;
336
1.43k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
337
1.43k
        return BROTLI_DECODER_SUCCESS;
338
339
0
      default:
340
0
        return
341
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
342
81.7k
    }
343
81.7k
  }
344
51.8k
}
345
346
/* Decodes the Huffman code.
347
   This method doesn't read data from the bit reader, BUT drops the amount of
348
   bits that correspond to the decoded symbol.
349
   bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */
350
static BROTLI_INLINE uint32_t DecodeSymbol(uint32_t bits,
351
                                           const HuffmanCode* table,
352
970M
                                           BrotliBitReader* br) {
353
970M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
354
970M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
355
970M
  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
356
13.7k
    uint32_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
357
13.7k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
358
13.7k
    BROTLI_HC_ADJUST_TABLE_INDEX(table,
359
13.7k
        BROTLI_HC_FAST_LOAD_VALUE(table) +
360
13.7k
        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
361
13.7k
  }
362
970M
  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
363
970M
  return BROTLI_HC_FAST_LOAD_VALUE(table);
364
970M
}
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
137M
                                         BrotliBitReader* br) {
370
137M
  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
371
137M
}
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
3.04G
    const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
377
3.04G
  uint32_t val;
378
3.04G
  uint32_t available_bits = BrotliGetAvailableBits(br);
379
3.04G
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
380
3.04G
  if (available_bits == 0) {
381
171M
    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
382
171M
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
383
171M
      return BROTLI_TRUE;
384
171M
    }
385
14.0k
    return BROTLI_FALSE;  /* No valid bits at all. */
386
171M
  }
387
2.86G
  val = (uint32_t)BrotliGetBitsUnmasked(br);
388
2.86G
  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
389
2.86G
  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
390
2.86G
    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
391
2.86G
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
392
2.86G
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
393
2.86G
      return BROTLI_TRUE;
394
2.86G
    } else {
395
6.38k
      return BROTLI_FALSE;  /* Not enough bits for the first level. */
396
6.38k
    }
397
2.86G
  }
398
3.66k
  if (available_bits <= HUFFMAN_TABLE_BITS) {
399
2.21k
    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
400
2.21k
  }
401
402
  /* Speculatively drop HUFFMAN_TABLE_BITS. */
403
1.44k
  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
404
1.44k
  available_bits -= HUFFMAN_TABLE_BITS;
405
1.44k
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
406
1.44k
  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
407
435
    return BROTLI_FALSE;  /* Not enough bits for the second level. */
408
435
  }
409
410
1.01k
  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
411
1.01k
  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
412
1.01k
  return BROTLI_TRUE;
413
1.44k
}
414
415
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
416
3.87G
    const HuffmanCode* table, BrotliBitReader* br, uint32_t* result) {
417
3.87G
  uint32_t val;
418
3.87G
  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
419
832M
    *result = DecodeSymbol(val, table, br);
420
832M
    return BROTLI_TRUE;
421
832M
  }
422
3.04G
  return SafeDecodeSymbol(table, br, result);
423
3.87G
}
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.32G
                                        uint32_t* value) {
431
1.32G
  if (safe) {
432
761M
    return;
433
761M
  }
434
565M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
435
565M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
436
565M
  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
437
565M
  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
438
565M
}
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
460M
                                                  uint32_t* value) {
446
460M
  uint32_t result = *value;
447
460M
  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
448
1.21k
    uint32_t val = BrotliGet16BitsUnmasked(br);
449
1.21k
    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
450
1.21k
    uint32_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
451
1.21k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
452
1.21k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
453
1.21k
    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
454
1.21k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
455
1.21k
    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
456
460M
  } else {
457
460M
    BrotliDropBits(br, *bits);
458
460M
  }
459
460M
  PreloadSymbol(0, table, br, bits, value);
460
460M
  return result;
461
460M
}
462
463
104k
static BROTLI_INLINE uint32_t Log2Floor(uint32_t x) {
464
104k
  uint32_t result = 0;
465
907k
  while (x) {
466
802k
    x >>= 1;
467
802k
    ++result;
468
802k
  }
469
104k
  return result;
470
104k
}
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
104k
    BrotliDecoderState* s) {
478
  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
479
104k
  BrotliBitReader* br = &s->br;
480
104k
  BrotliMetablockHeaderArena* h = &s->arena.header;
481
104k
  uint32_t max_bits = Log2Floor(alphabet_size_max - 1);
482
104k
  uint32_t i = h->sub_loop_counter;
483
104k
  uint32_t num_symbols = h->symbol;
484
206k
  while (i <= num_symbols) {
485
139k
    uint32_t v;
486
139k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
487
37.5k
      h->sub_loop_counter = i;
488
37.5k
      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
489
37.5k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
490
37.5k
    }
491
101k
    if (v >= alphabet_size_limit) {
492
30
      return
493
30
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
494
30
    }
495
101k
    h->symbols_lists_array[i] = (uint16_t)v;
496
101k
    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
497
101k
    ++i;
498
101k
  }
499
500
101k
  for (i = 0; i < num_symbols; ++i) {
501
34.4k
    uint32_t k = i + 1;
502
89.1k
    for (; k <= num_symbols; ++k) {
503
54.7k
      if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) {
504
20
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
505
20
      }
506
54.7k
    }
507
34.4k
  }
508
509
67.2k
  return BROTLI_DECODER_SUCCESS;
510
67.2k
}
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
275k
    uint16_t* code_length_histo, int* next_symbol) {
522
275k
  *repeat = 0;
523
275k
  if (code_len != 0) {  /* code_len == 1..15 */
524
268k
    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
525
268k
    next_symbol[code_len] = (int)(*symbol);
526
268k
    *prev_code_len = code_len;
527
268k
    *space -= 32768U >> code_len;
528
268k
    code_length_histo[code_len]++;
529
268k
    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
530
268k
        (int)*symbol, (int)code_len));
531
268k
  }
532
275k
  (*symbol)++;
533
275k
}
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
7.14k
    uint16_t* code_length_histo, int* next_symbol) {
550
7.14k
  uint32_t old_repeat;
551
7.14k
  uint32_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
552
7.14k
  uint32_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
553
7.14k
  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
554
4.44k
    new_len = *prev_code_len;
555
4.44k
    extra_bits = 2;
556
4.44k
  }
557
7.14k
  if (*repeat_code_len != new_len) {
558
1.97k
    *repeat = 0;
559
1.97k
    *repeat_code_len = new_len;
560
1.97k
  }
561
7.14k
  old_repeat = *repeat;
562
7.14k
  if (*repeat > 0) {
563
1.19k
    *repeat -= 2;
564
1.19k
    *repeat <<= extra_bits;
565
1.19k
  }
566
7.14k
  *repeat += repeat_delta + 3U;
567
7.14k
  repeat_delta = *repeat - old_repeat;
568
7.14k
  if (*symbol + repeat_delta > alphabet_size) {
569
134
    BROTLI_DUMP();
570
134
    *symbol = alphabet_size;
571
134
    *space = 0xFFFFF;
572
134
    return;
573
134
  }
574
7.00k
  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
575
7.00k
      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
576
7.00k
  if (*repeat_code_len != 0) {
577
4.37k
    unsigned last = *symbol + repeat_delta;
578
4.37k
    int next = next_symbol[*repeat_code_len];
579
47.5k
    do {
580
47.5k
      symbol_lists[next] = (uint16_t)*symbol;
581
47.5k
      next = (int)*symbol;
582
47.5k
    } while (++(*symbol) != last);
583
4.37k
    next_symbol[*repeat_code_len] = next;
584
4.37k
    *space -= repeat_delta << (15 - *repeat_code_len);
585
4.37k
    code_length_histo[*repeat_code_len] =
586
4.37k
        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
587
4.37k
  } else {
588
2.63k
    *symbol += repeat_delta;
589
2.63k
  }
590
7.00k
}
591
592
/* Reads and decodes symbol codelengths. */
593
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
594
37.1k
    uint32_t alphabet_size, BrotliDecoderState* s) {
595
37.1k
  BrotliBitReader* br = &s->br;
596
37.1k
  BrotliMetablockHeaderArena* h = &s->arena.header;
597
37.1k
  uint32_t symbol = h->symbol;
598
37.1k
  uint32_t repeat = h->repeat;
599
37.1k
  uint32_t space = h->space;
600
37.1k
  uint32_t prev_code_len = h->prev_code_len;
601
37.1k
  uint32_t repeat_code_len = h->repeat_code_len;
602
37.1k
  uint16_t* symbol_lists = h->symbol_lists;
603
37.1k
  uint16_t* code_length_histo = h->code_length_histo;
604
37.1k
  int* next_symbol = h->next_symbol;
605
37.1k
  if (!BrotliWarmupBitReader(br)) {
606
1.98k
    return BROTLI_DECODER_NEEDS_MORE_INPUT;
607
1.98k
  }
608
154k
  while (symbol < alphabet_size && space > 0) {
609
150k
    const HuffmanCode* p = h->table;
610
150k
    uint32_t code_len;
611
150k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
612
150k
    if (!BrotliCheckInputAmount(br, BROTLI_SHORT_FILL_BIT_WINDOW_READ)) {
613
30.8k
      h->symbol = symbol;
614
30.8k
      h->repeat = repeat;
615
30.8k
      h->prev_code_len = prev_code_len;
616
30.8k
      h->repeat_code_len = repeat_code_len;
617
30.8k
      h->space = space;
618
30.8k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
619
30.8k
    }
620
119k
    BrotliFillBitWindow16(br);
621
119k
    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
622
119k
        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
623
119k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
624
119k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
625
119k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
626
116k
      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
627
116k
          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
628
116k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
629
3.52k
      uint32_t extra_bits =
630
3.52k
          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
631
3.52k
      uint32_t repeat_delta =
632
3.52k
          (uint32_t)BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
633
3.52k
      BrotliDropBits(br, extra_bits);
634
3.52k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
635
3.52k
          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
636
3.52k
          symbol_lists, code_length_histo, next_symbol);
637
3.52k
    }
638
119k
  }
639
4.30k
  h->space = space;
640
4.30k
  return BROTLI_DECODER_SUCCESS;
641
35.1k
}
642
643
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
644
32.7k
    uint32_t alphabet_size, BrotliDecoderState* s) {
645
32.7k
  BrotliBitReader* br = &s->br;
646
32.7k
  BrotliMetablockHeaderArena* h = &s->arena.header;
647
32.7k
  BROTLI_BOOL get_byte = BROTLI_FALSE;
648
245k
  while (h->symbol < alphabet_size && h->space > 0) {
649
240k
    const HuffmanCode* p = h->table;
650
240k
    uint32_t code_len;
651
240k
    uint32_t available_bits;
652
240k
    uint32_t bits = 0;
653
240k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
654
240k
    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
655
212k
    get_byte = BROTLI_FALSE;
656
212k
    available_bits = BrotliGetAvailableBits(br);
657
212k
    if (available_bits != 0) {
658
181k
      bits = (uint32_t)BrotliGetBitsUnmasked(br);
659
181k
    }
660
212k
    BROTLI_HC_ADJUST_TABLE_INDEX(p,
661
212k
        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
662
212k
    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
663
47.9k
      get_byte = BROTLI_TRUE;
664
47.9k
      continue;
665
47.9k
    }
666
164k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
667
164k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
668
158k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
669
158k
      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
670
158k
          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
671
158k
          h->next_symbol);
672
158k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
673
5.32k
      uint32_t extra_bits = code_len - 14U;
674
5.32k
      uint32_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
675
5.32k
          BitMask(extra_bits);
676
5.32k
      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
677
1.70k
        get_byte = BROTLI_TRUE;
678
1.70k
        continue;
679
1.70k
      }
680
3.62k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
681
3.62k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
682
3.62k
          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
683
3.62k
          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
684
3.62k
          h->next_symbol);
685
3.62k
    }
686
164k
  }
687
4.91k
  return BROTLI_DECODER_SUCCESS;
688
32.7k
}
689
690
/* Reads and decodes 15..18 codes using static prefix code.
691
   Each code is 2..4 bits long. In total 30..72 bits are used. */
692
21.4k
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
693
21.4k
  BrotliBitReader* br = &s->br;
694
21.4k
  BrotliMetablockHeaderArena* h = &s->arena.header;
695
21.4k
  uint32_t num_codes = h->repeat;
696
21.4k
  unsigned space = h->space;
697
21.4k
  uint32_t i = h->sub_loop_counter;
698
97.5k
  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
699
96.9k
    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
700
96.9k
    uint32_t ix;
701
96.9k
    uint32_t v;
702
96.9k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
703
20.6k
      uint32_t available_bits = BrotliGetAvailableBits(br);
704
20.6k
      if (available_bits != 0) {
705
12.3k
        ix = BrotliGetBitsUnmasked(br) & 0xF;
706
12.3k
      } else {
707
8.22k
        ix = 0;
708
8.22k
      }
709
20.6k
      if (kCodeLengthPrefixLength[ix] > available_bits) {
710
11.7k
        h->sub_loop_counter = i;
711
11.7k
        h->repeat = num_codes;
712
11.7k
        h->space = space;
713
11.7k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
714
11.7k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
715
11.7k
      }
716
20.6k
    }
717
85.2k
    v = kCodeLengthPrefixValue[ix];
718
85.2k
    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
719
85.2k
    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
720
85.2k
    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
721
85.2k
    if (v != 0) {
722
48.7k
      space = space - (32U >> v);
723
48.7k
      ++num_codes;
724
48.7k
      ++h->code_length_histo[v];
725
48.7k
      if (space - 1U >= 32U) {
726
        /* space is 0 or wrapped around. */
727
9.08k
        break;
728
9.08k
      }
729
48.7k
    }
730
85.2k
  }
731
9.71k
  if (!(num_codes == 1 || space == 0)) {
732
169
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
733
169
  }
734
9.55k
  return BROTLI_DECODER_SUCCESS;
735
9.71k
}
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
167k
                                              BrotliDecoderState* s) {
753
167k
  BrotliBitReader* br = &s->br;
754
167k
  BrotliMetablockHeaderArena* h = &s->arena.header;
755
  /* State machine. */
756
177k
  for (;;) {
757
177k
    switch (h->substate_huffman) {
758
84.9k
      case BROTLI_STATE_HUFFMAN_NONE:
759
84.9k
        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
760
7.23k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
761
7.23k
        }
762
77.7k
        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
77.7k
        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
73.1k
      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
779
        /* Read symbols, codes & code lengths directly. */
780
73.1k
        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
781
5.70k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
782
5.70k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
783
5.70k
        }
784
67.4k
        h->sub_loop_counter = 0;
785
      /* Fall through. */
786
787
104k
      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
788
104k
        BrotliDecoderErrorCode result =
789
104k
            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
790
104k
        if (result != BROTLI_DECODER_SUCCESS) {
791
37.5k
          return result;
792
37.5k
        }
793
104k
      }
794
      /* Fall through. */
795
796
67.8k
      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
797
67.8k
        uint32_t table_size;
798
67.8k
        if (h->symbol == 3) {
799
6.20k
          uint32_t bits;
800
6.20k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
801
579
            h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
802
579
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
803
579
          }
804
5.62k
          h->symbol += bits;
805
5.62k
        }
806
67.2k
        BROTLI_LOG_UINT(h->symbol);
807
67.2k
        table_size = BrotliBuildSimpleHuffmanTable(
808
67.2k
            table, HUFFMAN_TABLE_BITS, h->symbols_lists_array, h->symbol);
809
67.2k
        if (opt_table_size) {
810
55.7k
          *opt_table_size = table_size;
811
55.7k
        }
812
67.2k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
813
67.2k
        return BROTLI_DECODER_SUCCESS;
814
67.8k
      }
815
816
      /* Decode Huffman-coded code lengths. */
817
21.4k
      case BROTLI_STATE_HUFFMAN_COMPLEX: {
818
21.4k
        uint32_t i;
819
21.4k
        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
820
21.4k
        if (result != BROTLI_DECODER_SUCCESS) {
821
11.8k
          return result;
822
11.8k
        }
823
9.55k
        BrotliBuildCodeLengthsHuffmanTable(h->table,
824
9.55k
                                           h->code_length_code_lengths,
825
9.55k
                                           h->code_length_histo);
826
9.55k
        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
152k
          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
829
152k
          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
830
152k
        }
831
832
9.55k
        h->symbol = 0;
833
9.55k
        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
834
9.55k
        h->repeat = 0;
835
9.55k
        h->repeat_code_len = 0;
836
9.55k
        h->space = 32768;
837
9.55k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
838
9.55k
      }
839
      /* Fall through. */
840
841
37.1k
      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
842
37.1k
        uint32_t table_size;
843
37.1k
        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
844
37.1k
            alphabet_size_limit, s);
845
37.1k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
846
32.7k
          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
847
32.7k
        }
848
37.1k
        if (result != BROTLI_DECODER_SUCCESS) {
849
27.8k
          return result;
850
27.8k
        }
851
852
9.22k
        if (h->space != 0) {
853
281
          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
854
281
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
855
281
        }
856
8.94k
        table_size = BrotliBuildHuffmanTable(
857
8.94k
            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
858
8.94k
        if (opt_table_size) {
859
7.55k
          *opt_table_size = table_size;
860
7.55k
        }
861
8.94k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
862
8.94k
        return BROTLI_DECODER_SUCCESS;
863
9.22k
      }
864
865
0
      default:
866
0
        return
867
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
868
177k
    }
869
177k
  }
870
167k
}
871
872
/* Decodes a block length by reading 3..39 bits. */
873
static BROTLI_INLINE uint32_t ReadBlockLength(const HuffmanCode* table,
874
45.1k
                                              BrotliBitReader* br) {
875
45.1k
  uint32_t code;
876
45.1k
  uint32_t nbits;
877
45.1k
  code = ReadSymbol(table, br);
878
45.1k
  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
879
45.1k
  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
880
45.1k
}
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
73.5k
    BrotliBitReader* br) {
887
73.5k
  uint32_t index;
888
73.5k
  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
889
72.7k
    if (!SafeReadSymbol(table, br, &index)) {
890
7.03k
      return BROTLI_FALSE;
891
7.03k
    }
892
72.7k
  } else {
893
845
    index = s->block_length_index;
894
845
  }
895
66.5k
  {
896
66.5k
    uint32_t bits;
897
66.5k
    uint32_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
898
66.5k
    uint32_t offset = _kBrotliPrefixCodeRanges[index].offset;
899
66.5k
    if (!BrotliSafeReadBits(br, nbits, &bits)) {
900
17.7k
      s->block_length_index = index;
901
17.7k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
902
17.7k
      return BROTLI_FALSE;
903
17.7k
    }
904
48.7k
    *result = offset + bits;
905
48.7k
    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
906
48.7k
    return BROTLI_TRUE;
907
66.5k
  }
908
66.5k
}
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.53k
    uint8_t* v, uint32_t v_len, BrotliDecoderState* state) {
926
  /* Reinitialize elements that could have been changed. */
927
1.53k
  uint32_t i = 1;
928
1.53k
  uint32_t upper_bound = state->mtf_upper_bound;
929
1.53k
  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
930
1.53k
  uint8_t* mtf_u8 = (uint8_t*)mtf;
931
  /* Load endian-aware constant. */
932
1.53k
  const uint8_t b0123[4] = {0, 1, 2, 3};
933
1.53k
  uint32_t pattern;
934
1.53k
  memcpy(&pattern, &b0123, 4);
935
936
  /* Initialize list using 4 consequent values pattern. */
937
1.53k
  mtf[0] = pattern;
938
31.6k
  do {
939
31.6k
    pattern += 0x04040404;  /* Advance all 4 values by 4. */
940
31.6k
    mtf[i] = pattern;
941
31.6k
    i++;
942
31.6k
  } while (i <= upper_bound);
943
944
  /* Transform the input. */
945
1.53k
  upper_bound = 0;
946
212k
  for (i = 0; i < v_len; ++i) {
947
211k
    int index = v[i];
948
211k
    uint8_t value = mtf_u8[index];
949
211k
    upper_bound |= v[i];
950
211k
    v[i] = value;
951
211k
    mtf_u8[-1] = value;
952
7.13M
    do {
953
7.13M
      index--;
954
7.13M
      mtf_u8[index + 1] = mtf_u8[index];
955
7.13M
    } while (index >= 0);
956
211k
  }
957
  /* Remember amount of elements to be reinitialized. */
958
1.53k
  state->mtf_upper_bound = upper_bound >> 2;
959
1.53k
}
960
961
/* Decodes a series of Huffman table using ReadHuffmanCode function. */
962
static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
963
120k
    HuffmanTreeGroup* group, BrotliDecoderState* s) {
964
120k
  BrotliMetablockHeaderArena* h = &s->arena.header;
965
120k
  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
184k
  while (h->htree_index < group->num_htrees) {
971
140k
    uint32_t table_size;
972
140k
    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
973
140k
        group->alphabet_size_limit, h->next, &table_size, s);
974
140k
    if (result != BROTLI_DECODER_SUCCESS) return result;
975
63.3k
    group->htrees[h->htree_index] = h->next;
976
63.3k
    h->next += table_size;
977
63.3k
    ++h->htree_index;
978
63.3k
  }
979
43.8k
  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
980
43.8k
  return BROTLI_DECODER_SUCCESS;
981
120k
}
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.2k
                                               BrotliDecoderState* s) {
995
45.2k
  BrotliBitReader* br = &s->br;
996
45.2k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
997
45.2k
  BrotliMetablockHeaderArena* h = &s->arena.header;
998
999
45.2k
  switch ((int)h->substate_context_map) {
1000
36.4k
    case BROTLI_STATE_CONTEXT_MAP_NONE:
1001
36.4k
      result = DecodeVarLenUint8(s, br, num_htrees);
1002
36.4k
      if (result != BROTLI_DECODER_SUCCESS) {
1003
5.07k
        return result;
1004
5.07k
      }
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.3k
        memset(*context_map_arg, 0, (size_t)context_map_size);
1016
28.3k
        return BROTLI_DECODER_SUCCESS;
1017
28.3k
      }
1018
3.05k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
1019
    /* Fall through. */
1020
1021
3.81k
    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
1022
3.81k
      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.81k
      if (!BrotliSafeGetBits(br, 5, &bits)) {
1026
814
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1027
814
      }
1028
3.00k
      if ((bits & 1) != 0) { /* Use RLE for zeros. */
1029
409
        h->max_run_length_prefix = (bits >> 1) + 1;
1030
409
        BrotliDropBits(br, 5);
1031
2.59k
      } else {
1032
2.59k
        h->max_run_length_prefix = 0;
1033
2.59k
        BrotliDropBits(br, 1);
1034
2.59k
      }
1035
3.00k
      BROTLI_LOG_UINT(h->max_run_length_prefix);
1036
3.00k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
1037
3.00k
    }
1038
    /* Fall through. */
1039
1040
6.29k
    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
1041
6.29k
      uint32_t alphabet_size = *num_htrees + h->max_run_length_prefix;
1042
6.29k
      result = ReadHuffmanCode(alphabet_size, alphabet_size,
1043
6.29k
                               h->context_map_table, NULL, s);
1044
6.29k
      if (result != BROTLI_DECODER_SUCCESS) return result;
1045
2.87k
      h->code = 0xFFFF;
1046
2.87k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
1047
2.87k
    }
1048
    /* Fall through. */
1049
1050
7.39k
    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
1051
7.39k
      uint32_t context_index = h->context_index;
1052
7.39k
      uint32_t max_run_length_prefix = h->max_run_length_prefix;
1053
7.39k
      uint8_t* context_map = *context_map_arg;
1054
7.39k
      uint32_t code = h->code;
1055
7.39k
      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
1056
315k
      while (context_index < context_map_size || skip_preamble) {
1057
312k
        if (!skip_preamble) {
1058
312k
          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
1059
3.79k
            h->code = 0xFFFF;
1060
3.79k
            h->context_index = context_index;
1061
3.79k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1062
3.79k
          }
1063
308k
          BROTLI_LOG_UINT(code);
1064
1065
308k
          if (code == 0) {
1066
64.9k
            context_map[context_index++] = 0;
1067
64.9k
            continue;
1068
64.9k
          }
1069
243k
          if (code > max_run_length_prefix) {
1070
239k
            context_map[context_index++] =
1071
239k
                (uint8_t)(code - max_run_length_prefix);
1072
239k
            continue;
1073
239k
          }
1074
243k
        } else {
1075
821
          skip_preamble = BROTLI_FALSE;
1076
821
        }
1077
        /* RLE sub-stage. */
1078
5.11k
        {
1079
5.11k
          uint32_t reps;
1080
5.11k
          if (!BrotliSafeReadBits(br, code, &reps)) {
1081
951
            h->code = code;
1082
951
            h->context_index = context_index;
1083
951
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1084
951
          }
1085
4.15k
          reps += 1U << code;
1086
4.15k
          BROTLI_LOG_UINT(reps);
1087
4.15k
          if (context_index + reps > context_map_size) {
1088
57
            return
1089
57
                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
1090
57
          }
1091
291k
          do {
1092
291k
            context_map[context_index++] = 0;
1093
291k
          } while (--reps);
1094
4.10k
        }
1095
4.10k
      }
1096
7.39k
    }
1097
    /* Fall through. */
1098
1099
2.77k
    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1100
2.77k
      uint32_t bits;
1101
2.77k
      if (!BrotliSafeReadBits(br, 1, &bits)) {
1102
219
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
1103
219
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1104
219
      }
1105
2.55k
      if (bits != 0) {
1106
1.53k
        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
1107
1.53k
      }
1108
2.55k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
1109
2.55k
      return BROTLI_DECODER_SUCCESS;
1110
2.77k
    }
1111
1112
0
    default:
1113
0
      return
1114
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
1115
45.2k
  }
1116
45.2k
}
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
115k
    int safe, BrotliDecoderState* s, int tree_type) {
1122
115k
  uint32_t max_block_type = s->num_block_types[tree_type];
1123
115k
  const HuffmanCode* type_tree = &s->block_type_trees[
1124
115k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
1125
115k
  const HuffmanCode* len_tree = &s->block_len_trees[
1126
115k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1127
115k
  BrotliBitReader* br = &s->br;
1128
115k
  uint32_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1129
115k
  uint32_t block_type;
1130
115k
  if (max_block_type <= 1) {
1131
3
    return BROTLI_FALSE;
1132
3
  }
1133
1134
  /* Read 0..15 + 3..39 bits. */
1135
115k
  if (!safe) {
1136
45.1k
    block_type = ReadSymbol(type_tree, br);
1137
45.1k
    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1138
70.4k
  } else {
1139
70.4k
    BrotliBitReaderState memento;
1140
70.4k
    BrotliBitReaderSaveState(br, &memento);
1141
70.4k
    if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE;
1142
67.3k
    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1143
23.3k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1144
23.3k
      BrotliBitReaderRestoreState(br, &memento);
1145
23.3k
      return BROTLI_FALSE;
1146
23.3k
    }
1147
67.3k
  }
1148
1149
89.1k
  if (block_type == 1) {
1150
27.2k
    block_type = ringbuffer[1] + 1;
1151
61.9k
  } else if (block_type == 0) {
1152
13.9k
    block_type = ringbuffer[0];
1153
47.9k
  } else {
1154
47.9k
    block_type -= 2;
1155
47.9k
  }
1156
89.1k
  if (block_type >= max_block_type) {
1157
11.9k
    block_type -= max_block_type;
1158
11.9k
  }
1159
89.1k
  ringbuffer[0] = ringbuffer[1];
1160
89.1k
  ringbuffer[1] = block_type;
1161
89.1k
  return BROTLI_TRUE;
1162
115k
}
1163
1164
static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
1165
15.5k
    BrotliDecoderState* s) {
1166
15.5k
  size_t i;
1167
140k
  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1168
42.8k
  for (i = 0; i < s->num_block_types[0]; i++) {
1169
27.2k
    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1170
27.2k
    size_t error = 0;
1171
27.2k
    size_t sample = s->context_map[offset];
1172
27.2k
    size_t j;
1173
463k
    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1174
436k
      BROTLI_REPEAT(4, error |= s->context_map[offset + j++] ^ sample;)
1175
436k
    }
1176
27.2k
    if (error == 0) {
1177
23.6k
      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1178
23.6k
    }
1179
27.2k
  }
1180
15.5k
}
1181
1182
62.1k
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1183
62.1k
  uint8_t context_mode;
1184
62.1k
  size_t trivial;
1185
62.1k
  uint32_t block_type = s->block_type_rb[1];
1186
62.1k
  uint32_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1187
62.1k
  s->context_map_slice = s->context_map + context_offset;
1188
62.1k
  trivial = s->trivial_literal_contexts[block_type >> 5];
1189
62.1k
  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1190
62.1k
  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1191
62.1k
  context_mode = s->context_modes[block_type] & 3;
1192
62.1k
  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
1193
62.1k
}
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
55.9k
    int safe, BrotliDecoderState* s) {
1199
55.9k
  if (!DecodeBlockTypeAndLength(safe, s, 0)) {
1200
8.17k
    return BROTLI_FALSE;
1201
8.17k
  }
1202
47.7k
  PrepareLiteralDecoding(s);
1203
47.7k
  return BROTLI_TRUE;
1204
55.9k
}
1205
1206
31.7k
static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1207
31.7k
  DecodeLiteralBlockSwitchInternal(0, s);
1208
31.7k
}
1209
1210
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch(
1211
24.2k
    BrotliDecoderState* s) {
1212
24.2k
  return DecodeLiteralBlockSwitchInternal(1, s);
1213
24.2k
}
1214
1215
/* Block switch for insert/copy length.
1216
   Reads 3..54 bits. */
1217
static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal(
1218
24.2k
    int safe, BrotliDecoderState* s) {
1219
24.2k
  if (!DecodeBlockTypeAndLength(safe, s, 1)) {
1220
6.55k
    return BROTLI_FALSE;
1221
6.55k
  }
1222
17.6k
  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
1223
17.6k
  return BROTLI_TRUE;
1224
24.2k
}
1225
1226
7.13k
static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1227
7.13k
  DecodeCommandBlockSwitchInternal(0, s);
1228
7.13k
}
1229
1230
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch(
1231
17.0k
    BrotliDecoderState* s) {
1232
17.0k
  return DecodeCommandBlockSwitchInternal(1, s);
1233
17.0k
}
1234
1235
/* Block switch for distance codes.
1236
   Reads 3..54 bits. */
1237
static BROTLI_INLINE BROTLI_BOOL DecodeDistanceBlockSwitchInternal(
1238
35.3k
    int safe, BrotliDecoderState* s) {
1239
35.3k
  if (!DecodeBlockTypeAndLength(safe, s, 2)) {
1240
11.6k
    return BROTLI_FALSE;
1241
11.6k
  }
1242
23.6k
  s->dist_context_map_slice = s->dist_context_map +
1243
23.6k
      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
1244
23.6k
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1245
23.6k
  return BROTLI_TRUE;
1246
35.3k
}
1247
1248
6.28k
static void BROTLI_NOINLINE DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
1249
6.28k
  DecodeDistanceBlockSwitchInternal(0, s);
1250
6.28k
}
1251
1252
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
1253
29.0k
    BrotliDecoderState* s) {
1254
29.0k
  return DecodeDistanceBlockSwitchInternal(1, s);
1255
29.0k
}
1256
1257
1.36M
static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
1258
1.36M
  size_t pos = wrap && s->pos > s->ringbuffer_size ?
1259
1.24M
      (size_t)s->ringbuffer_size : (size_t)(s->pos);
1260
1.36M
  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
1261
1.36M
  return partial_pos_rb - s->partial_pos_out;
1262
1.36M
}
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.36M
    size_t* total_out, BROTLI_BOOL force) {
1270
1.36M
  uint8_t* start =
1271
1.36M
      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
1272
1.36M
  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1273
1.36M
  size_t num_written = *available_out;
1274
1.36M
  if (num_written > to_write) {
1275
533k
    num_written = to_write;
1276
533k
  }
1277
1.36M
  if (s->meta_block_remaining_len < 0) {
1278
180
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
1279
180
  }
1280
1.36M
  if (next_out && !*next_out) {
1281
533k
    *next_out = start;
1282
830k
  } else {
1283
830k
    if (next_out) {
1284
0
      memcpy(*next_out, start, num_written);
1285
0
      *next_out += num_written;
1286
0
    }
1287
830k
  }
1288
1.36M
  *available_out -= num_written;
1289
1.36M
  BROTLI_LOG_UINT(to_write);
1290
1.36M
  BROTLI_LOG_UINT(num_written);
1291
1.36M
  s->partial_pos_out += num_written;
1292
1.36M
  if (total_out) {
1293
0
    *total_out = s->partial_pos_out;
1294
0
  }
1295
1.36M
  if (num_written < to_write) {
1296
453k
    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
1297
453k
      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
1298
453k
    } else {
1299
47
      return BROTLI_DECODER_SUCCESS;
1300
47
    }
1301
453k
  }
1302
  /* Wrap ring buffer only if it has reached its maximal size. */
1303
909k
  if (s->ringbuffer_size == (1 << s->window_bits) &&
1304
794k
      s->pos >= s->ringbuffer_size) {
1305
280k
    s->pos -= s->ringbuffer_size;
1306
280k
    s->rb_roundtrips++;
1307
280k
    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1308
280k
  }
1309
909k
  return BROTLI_DECODER_SUCCESS;
1310
1.36M
}
1311
1312
811k
static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1313
811k
  if (s->should_wrap_ringbuffer) {
1314
61.2k
    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1315
61.2k
    s->should_wrap_ringbuffer = 0;
1316
61.2k
  }
1317
811k
}
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
81.5k
    BrotliDecoderState* s) {
1328
81.5k
  uint8_t* old_ringbuffer = s->ringbuffer;
1329
81.5k
  if (s->ringbuffer_size == s->new_ringbuffer_size) {
1330
76.7k
    return BROTLI_TRUE;
1331
76.7k
  }
1332
1333
4.75k
  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
1334
4.75k
      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
1335
4.75k
  if (s->ringbuffer == 0) {
1336
    /* Restore previous value. */
1337
0
    s->ringbuffer = old_ringbuffer;
1338
0
    return BROTLI_FALSE;
1339
0
  }
1340
4.75k
  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1341
4.75k
  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
1342
1343
4.75k
  if (!!old_ringbuffer) {
1344
418
    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1345
418
    BROTLI_DECODER_FREE(s, old_ringbuffer);
1346
418
  }
1347
1348
4.75k
  s->ringbuffer_size = s->new_ringbuffer_size;
1349
4.75k
  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1350
4.75k
  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1351
1352
4.75k
  return BROTLI_TRUE;
1353
4.75k
}
1354
1355
static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1356
    size_t* available_out, uint8_t** next_out, size_t* total_out,
1357
67.1k
    BrotliDecoderState* s) {
1358
  /* TODO: avoid allocation for single uncompressed block. */
1359
67.1k
  if (!BrotliEnsureRingBuffer(s)) {
1360
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
1361
0
  }
1362
1363
  /* State machine */
1364
69.6k
  for (;;) {
1365
69.6k
    switch (s->substate_uncompressed) {
1366
67.1k
      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1367
67.1k
        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1368
67.1k
        if (nbytes > s->meta_block_remaining_len) {
1369
1.73k
          nbytes = s->meta_block_remaining_len;
1370
1.73k
        }
1371
67.1k
        if (s->pos + nbytes > s->ringbuffer_size) {
1372
2.38k
          nbytes = s->ringbuffer_size - s->pos;
1373
2.38k
        }
1374
        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1375
67.1k
        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1376
67.1k
        s->pos += nbytes;
1377
67.1k
        s->meta_block_remaining_len -= nbytes;
1378
67.1k
        if (s->pos < 1 << s->window_bits) {
1379
64.7k
          if (s->meta_block_remaining_len == 0) {
1380
2.35k
            return BROTLI_DECODER_SUCCESS;
1381
2.35k
          }
1382
62.3k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
1383
64.7k
        }
1384
2.46k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1385
2.46k
      }
1386
      /* Fall through. */
1387
1388
4.92k
      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1389
4.92k
        BrotliDecoderErrorCode result;
1390
4.92k
        result = WriteRingBuffer(
1391
4.92k
            s, available_out, next_out, total_out, BROTLI_FALSE);
1392
4.92k
        if (result != BROTLI_DECODER_SUCCESS) {
1393
2.46k
          return result;
1394
2.46k
        }
1395
2.46k
        if (s->ringbuffer_size == 1 << s->window_bits) {
1396
2.46k
          s->max_distance = s->max_backward_distance;
1397
2.46k
        }
1398
2.46k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1399
2.46k
        break;
1400
4.92k
      }
1401
69.6k
    }
1402
69.6k
  }
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.5k
    BrotliDecoderState* s) {
1414
19.5k
  int window_size = 1 << s->window_bits;
1415
19.5k
  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.5k
  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
1419
19.5k
  int output_size;
1420
1421
  /* If maximum is already reached, no further extension is retired. */
1422
19.5k
  if (s->ringbuffer_size == window_size) {
1423
3.14k
    return;
1424
3.14k
  }
1425
1426
  /* Metadata blocks does not touch ring buffer. */
1427
16.4k
  if (s->is_metadata) {
1428
0
    return;
1429
0
  }
1430
1431
16.4k
  if (!s->ringbuffer) {
1432
6.49k
    output_size = 0;
1433
9.93k
  } else {
1434
9.93k
    output_size = s->pos;
1435
9.93k
  }
1436
16.4k
  output_size += s->meta_block_remaining_len;
1437
16.4k
  min_size = min_size < output_size ? output_size : min_size;
1438
1439
16.4k
  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
87.9k
    while ((new_ringbuffer_size >> 1) >= min_size) {
1444
71.5k
      new_ringbuffer_size >>= 1;
1445
71.5k
    }
1446
16.4k
  }
1447
1448
16.4k
  s->new_ringbuffer_size = new_ringbuffer_size;
1449
16.4k
}
1450
1451
/* Reads 1..256 2-bit context modes. */
1452
17.6k
static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1453
17.6k
  BrotliBitReader* br = &s->br;
1454
17.6k
  int i = s->loop_counter;
1455
1456
51.7k
  while (i < (int)s->num_block_types[0]) {
1457
35.8k
    uint32_t bits;
1458
35.8k
    if (!BrotliSafeReadBits(br, 2, &bits)) {
1459
1.69k
      s->loop_counter = i;
1460
1.69k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1461
1.69k
    }
1462
34.1k
    s->context_modes[i] = (uint8_t)bits;
1463
34.1k
    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1464
34.1k
    i++;
1465
34.1k
  }
1466
15.9k
  return BROTLI_DECODER_SUCCESS;
1467
17.6k
}
1468
1469
126M
static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1470
126M
  int offset = s->distance_code - 3;
1471
126M
  if (s->distance_code <= 3) {
1472
    /* Compensate double distance-ring-buffer roll for dictionary items. */
1473
44.9M
    s->distance_context = 1 >> s->distance_code;
1474
44.9M
    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
1475
44.9M
    s->dist_rb_idx -= s->distance_context;
1476
81.8M
  } else {
1477
81.8M
    int index_delta = 3;
1478
81.8M
    int delta;
1479
81.8M
    int base = s->distance_code - 10;
1480
81.8M
    if (s->distance_code < 10) {
1481
55.8M
      base = s->distance_code - 4;
1482
55.8M
    } else {
1483
25.9M
      index_delta = 2;
1484
25.9M
    }
1485
    /* Unpack one of six 4-bit values. */
1486
81.8M
    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
1487
81.8M
    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
1488
81.8M
    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
46
      s->distance_code = 0x7FFFFFFF;
1492
46
    }
1493
81.8M
  }
1494
126M
}
1495
1496
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1497
1.62G
    BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
1498
1.62G
  if (n_bits != 0) {
1499
39.0k
    return BrotliSafeReadBits(br, n_bits, val);
1500
1.62G
  } else {
1501
1.62G
    *val = 0;
1502
1.62G
    return BROTLI_TRUE;
1503
1.62G
  }
1504
1.62G
}
1505
1506
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
1507
416M
    BrotliBitReader* const br, uint32_t n_bits, uint32_t* val) {
1508
416M
  if (n_bits != 0) {
1509
19.2k
    return BrotliSafeReadBits32(br, n_bits, val);
1510
416M
  } else {
1511
416M
    *val = 0;
1512
416M
    return BROTLI_TRUE;
1513
416M
  }
1514
416M
}
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
290k
  for (j = 0; j < ndirect; ++j) {
1598
276k
    b->dist_extra_bits[i] = 0;
1599
276k
    b->dist_offset[i] = j + 1;
1600
276k
    ++i;
1601
276k
  }
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.47M
    for (j = 0; j < postfix; ++j) {
1608
1.78M
      b->dist_extra_bits[i] = (uint8_t)bits;
1609
1.78M
      b->dist_offset[i] = base + j;
1610
1.78M
      ++i;
1611
1.78M
    }
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
544M
    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1620
544M
  BrotliMetablockBodyArena* b = &s->arena.body;
1621
544M
  uint32_t code;
1622
544M
  uint32_t bits;
1623
544M
  BrotliBitReaderState memento;
1624
544M
  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1625
544M
  if (!safe) {
1626
4.51M
    code = ReadSymbol(distance_tree, br);
1627
540M
  } else {
1628
540M
    BrotliBitReaderSaveState(br, &memento);
1629
540M
    if (!SafeReadSymbol(distance_tree, br, &code)) {
1630
971
      return BROTLI_FALSE;
1631
971
    }
1632
540M
  }
1633
544M
  --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
544M
  s->distance_context = 0;
1637
544M
  if ((code & ~0xFu) == 0) {
1638
126M
    s->distance_code = (int)code;
1639
126M
    TakeDistanceFromRingBuffer(s);
1640
126M
    return BROTLI_TRUE;
1641
126M
  }
1642
417M
  if (!safe) {
1643
1.09M
    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
1644
416M
  } else {
1645
416M
    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
1646
8.81k
      ++s->block_length[2];
1647
8.81k
      BrotliBitReaderRestoreState(br, &memento);
1648
8.81k
      return BROTLI_FALSE;
1649
8.81k
    }
1650
416M
  }
1651
417M
  s->distance_code =
1652
417M
      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
1653
417M
  return BROTLI_TRUE;
1654
417M
}
1655
1656
static BROTLI_INLINE void ReadDistance(
1657
4.51M
    BrotliDecoderState* s, BrotliBitReader* br) {
1658
4.51M
  ReadDistanceInternal(0, s, br);
1659
4.51M
}
1660
1661
static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
1662
540M
    BrotliDecoderState* s, BrotliBitReader* br) {
1663
540M
  return ReadDistanceInternal(1, s, br);
1664
540M
}
1665
1666
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
1667
925M
    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1668
925M
  uint32_t cmd_code;
1669
925M
  uint32_t insert_len_extra = 0;
1670
925M
  uint32_t copy_length;
1671
925M
  CmdLutElement v;
1672
925M
  BrotliBitReaderState memento;
1673
925M
  if (!safe) {
1674
110M
    cmd_code = ReadSymbol(s->htree_command, br);
1675
814M
  } else {
1676
814M
    BrotliBitReaderSaveState(br, &memento);
1677
814M
    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
1678
3.12k
      return BROTLI_FALSE;
1679
3.12k
    }
1680
814M
  }
1681
925M
  v = kCmdLut[cmd_code];
1682
925M
  s->distance_code = v.distance_code;
1683
925M
  s->distance_context = v.context;
1684
925M
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1685
925M
  *insert_length = v.insert_len_offset;
1686
925M
  if (!safe) {
1687
110M
    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1688
17.4k
      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
1689
17.4k
    }
1690
110M
    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
1691
814M
  } else {
1692
814M
    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1693
814M
        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1694
12.8k
      BrotliBitReaderRestoreState(br, &memento);
1695
12.8k
      return BROTLI_FALSE;
1696
12.8k
    }
1697
814M
  }
1698
925M
  s->copy_length = (int)copy_length + v.copy_len_offset;
1699
925M
  --s->block_length[1];
1700
925M
  *insert_length += (int)insert_len_extra;
1701
925M
  return BROTLI_TRUE;
1702
925M
}
1703
1704
static BROTLI_INLINE void ReadCommand(
1705
110M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1706
110M
  ReadCommandInternal(0, s, br, insert_length);
1707
110M
}
1708
1709
static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
1710
814M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1711
814M
  return ReadCommandInternal(1, s, br, insert_length);
1712
814M
}
1713
1714
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
1715
3.92G
    int safe, BrotliBitReader* const br, size_t num) {
1716
3.92G
  if (safe) {
1717
3.33G
    return BROTLI_TRUE;
1718
3.33G
  }
1719
593M
  return BrotliCheckInputAmount(br, num);
1720
3.92G
}
1721
1722
#define BROTLI_SAFE(METHOD)                       \
1723
1.47G
  {                                               \
1724
1.47G
    if (safe) {                                   \
1725
1.35G
      if (!Safe##METHOD) {                        \
1726
52.1k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
1727
52.1k
        goto saveStateAndReturn;                  \
1728
52.1k
      }                                           \
1729
1.35G
    } else {                                      \
1730
115M
      METHOD;                                     \
1731
115M
    }                                             \
1732
1.47G
  }
1733
1734
static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
1735
669k
    int safe, BrotliDecoderState* s) {
1736
669k
  int pos = s->pos;
1737
669k
  int i = s->loop_counter;
1738
669k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1739
669k
  BrotliBitReader* br = &s->br;
1740
1741
669k
  if (!CheckInputAmount(safe, br, 28)) {
1742
287k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1743
287k
    goto saveStateAndReturn;
1744
287k
  }
1745
382k
  if (!safe) {
1746
59.6k
    BROTLI_UNUSED(BrotliWarmupBitReader(br));
1747
59.6k
  }
1748
1749
  /* Jump into state machine. */
1750
382k
  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
1751
123k
    goto CommandBegin;
1752
258k
  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
1753
81.4k
    goto CommandInner;
1754
177k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
1755
57.0k
    goto CommandPostDecodeLiterals;
1756
120k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
1757
120k
    goto CommandPostWrapCopy;
1758
120k
  } else {
1759
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);
1760
0
  }
1761
1762
925M
CommandBegin:
1763
925M
  if (safe) {
1764
814M
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1765
814M
  }
1766
925M
  if (!CheckInputAmount(safe, br, 28)) {  /* 156 bits + 7 bytes */
1767
11.9k
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1768
11.9k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1769
11.9k
    goto saveStateAndReturn;
1770
11.9k
  }
1771
925M
  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
1772
24.2k
    BROTLI_SAFE(DecodeCommandBlockSwitch(s));
1773
17.6k
    goto CommandBegin;
1774
24.2k
  }
1775
  /* Read the insert/copy length in the command. */
1776
925M
  BROTLI_SAFE(ReadCommand(s, br, &i));
1777
925M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
1778
925M
              pos, i, s->copy_length));
1779
925M
  if (i == 0) {
1780
46.7M
    goto CommandPostDecodeLiterals;
1781
46.7M
  }
1782
878M
  s->meta_block_remaining_len -= i;
1783
1784
878M
CommandInner:
1785
878M
  if (safe) {
1786
772M
    s->state = BROTLI_STATE_COMMAND_INNER;
1787
772M
  }
1788
  /* Read the literals in the command. */
1789
878M
  if (s->trivial_literal_context) {
1790
866M
    uint32_t bits;
1791
866M
    uint32_t value;
1792
866M
    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
1793
2.90G
    do {
1794
2.90G
      if (!CheckInputAmount(safe, br, 28)) {  /* 162 bits + 7 bytes */
1795
10.3k
        s->state = BROTLI_STATE_COMMAND_INNER;
1796
10.3k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1797
10.3k
        goto saveStateAndReturn;
1798
10.3k
      }
1799
2.90G
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
1800
41.0k
        BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
1801
36.0k
        PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
1802
36.0k
        if (!s->trivial_literal_context) goto CommandInner;
1803
36.0k
      }
1804
2.90G
      if (!safe) {
1805
460M
        s->ringbuffer[pos] =
1806
460M
            (uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value);
1807
2.44G
      } else {
1808
2.44G
        uint32_t literal;
1809
2.44G
        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
1810
955
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1811
955
          goto saveStateAndReturn;
1812
955
        }
1813
2.44G
        s->ringbuffer[pos] = (uint8_t)literal;
1814
2.44G
      }
1815
2.90G
      --s->block_length[0];
1816
2.90G
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
1817
2.90G
      ++pos;
1818
2.90G
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
1819
63.8k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
1820
63.8k
        --i;
1821
63.8k
        goto saveStateAndReturn;
1822
63.8k
      }
1823
2.90G
    } while (--i != 0);
1824
866M
  } else {
1825
11.9M
    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
1826
11.9M
    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
1827
92.4M
    do {
1828
92.4M
      const HuffmanCode* hc;
1829
92.4M
      uint8_t context;
1830
92.4M
      if (!CheckInputAmount(safe, br, 28)) {  /* 162 bits + 7 bytes */
1831
12.2k
        s->state = BROTLI_STATE_COMMAND_INNER;
1832
12.2k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1833
12.2k
        goto saveStateAndReturn;
1834
12.2k
      }
1835
92.4M
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
1836
14.9k
        BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
1837
11.7k
        if (s->trivial_literal_context) goto CommandInner;
1838
11.7k
      }
1839
92.4M
      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
1840
92.4M
      BROTLI_LOG_UINT(context);
1841
92.4M
      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
1842
92.4M
      p2 = p1;
1843
92.4M
      if (!safe) {
1844
21.7M
        p1 = (uint8_t)ReadSymbol(hc, br);
1845
70.6M
      } else {
1846
70.6M
        uint32_t literal;
1847
70.6M
        if (!SafeReadSymbol(hc, br, &literal)) {
1848
4.21k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1849
4.21k
          goto saveStateAndReturn;
1850
4.21k
        }
1851
70.6M
        p1 = (uint8_t)literal;
1852
70.6M
      }
1853
92.4M
      s->ringbuffer[pos] = p1;
1854
92.4M
      --s->block_length[0];
1855
92.4M
      BROTLI_LOG_UINT(s->context_map_slice[context]);
1856
92.4M
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
1857
92.4M
      ++pos;
1858
92.4M
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
1859
18.7k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
1860
18.7k
        --i;
1861
18.7k
        goto saveStateAndReturn;
1862
18.7k
      }
1863
92.4M
    } while (--i != 0);
1864
11.9M
  }
1865
878M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
1866
878M
  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
1867
7.32k
    s->state = BROTLI_STATE_METABLOCK_DONE;
1868
7.32k
    goto saveStateAndReturn;
1869
7.32k
  }
1870
1871
925M
CommandPostDecodeLiterals:
1872
925M
  if (safe) {
1873
814M
    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
1874
814M
  }
1875
925M
  if (s->distance_code >= 0) {
1876
    /* Implicit distance case. */
1877
380M
    s->distance_context = s->distance_code ? 0 : 1;
1878
380M
    --s->dist_rb_idx;
1879
380M
    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
1880
544M
  } else {
1881
    /* Read distance code in the command, unless it was implicitly zero. */
1882
544M
    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
1883
35.3k
      BROTLI_SAFE(DecodeDistanceBlockSwitch(s));
1884
23.6k
    }
1885
544M
    BROTLI_SAFE(ReadDistance(s, br));
1886
544M
  }
1887
925M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
1888
925M
              pos, s->distance_code));
1889
925M
  if (s->max_distance != s->max_backward_distance) {
1890
250M
    s->max_distance =
1891
250M
        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
1892
250M
  }
1893
925M
  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
925M
  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
33.2M
    if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
1901
46
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
1902
46
          "len: %d bytes left: %d\n",
1903
46
          pos, s->distance_code, i, s->meta_block_remaining_len));
1904
46
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
1905
46
    }
1906
33.2M
    if (i >= BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
1907
33.2M
        i <= BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
1908
33.2M
      int address = s->distance_code - s->max_distance - 1;
1909
33.2M
      const BrotliDictionary* words = s->dictionary;
1910
33.2M
      const BrotliTransforms* transforms = s->transforms;
1911
33.2M
      int offset = (int)s->dictionary->offsets_by_length[i];
1912
33.2M
      uint32_t shift = s->dictionary->size_bits_by_length[i];
1913
1914
33.2M
      int mask = (int)BitMask(shift);
1915
33.2M
      int word_idx = address & mask;
1916
33.2M
      int transform_idx = address >> shift;
1917
      /* Compensate double distance-ring-buffer roll. */
1918
33.2M
      s->dist_rb_idx += s->distance_context;
1919
33.2M
      offset += word_idx * i;
1920
33.2M
      if (BROTLI_PREDICT_FALSE(!words->data)) {
1921
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
1922
0
      }
1923
33.2M
      if (transform_idx < (int)transforms->num_transforms) {
1924
33.2M
        const uint8_t* word = &words->data[offset];
1925
33.2M
        int len = i;
1926
33.2M
        if (transform_idx == transforms->cutOffTransforms[0]) {
1927
33.2M
          memcpy(&s->ringbuffer[pos], word, (size_t)len);
1928
33.2M
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
1929
33.2M
                      len, word));
1930
33.2M
        } else {
1931
33.5k
          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
1932
33.5k
              transforms, transform_idx);
1933
33.5k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
1934
33.5k
                      " transform_idx = %d, transformed: [%.*s]\n",
1935
33.5k
                      i, word, transform_idx, len, &s->ringbuffer[pos]));
1936
33.5k
        }
1937
33.2M
        pos += len;
1938
33.2M
        s->meta_block_remaining_len -= len;
1939
33.2M
        if (pos >= s->ringbuffer_size) {
1940
75.5k
          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
1941
75.5k
          goto saveStateAndReturn;
1942
75.5k
        }
1943
33.2M
      } else {
1944
134
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
1945
134
            "len: %d bytes left: %d\n",
1946
134
            pos, s->distance_code, i, s->meta_block_remaining_len));
1947
134
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
1948
134
      }
1949
33.2M
    } else {
1950
97
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
1951
97
          "len: %d bytes left: %d\n",
1952
97
          pos, s->distance_code, i, s->meta_block_remaining_len));
1953
97
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
1954
97
    }
1955
892M
  } else {
1956
892M
    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
1957
892M
    uint8_t* copy_dst = &s->ringbuffer[pos];
1958
892M
    uint8_t* copy_src = &s->ringbuffer[src_start];
1959
892M
    int dst_end = pos + i;
1960
892M
    int src_end = src_start + i;
1961
    /* Update the recent distances cache. */
1962
892M
    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
1963
892M
    ++s->dist_rb_idx;
1964
892M
    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
892M
    memmove16(copy_dst, copy_src);
1969
892M
    if (src_end > pos && dst_end > src_start) {
1970
      /* Regions intersect. */
1971
321M
      goto CommandPostWrapCopy;
1972
321M
    }
1973
570M
    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
1974
      /* At least one region wraps. */
1975
143k
      goto CommandPostWrapCopy;
1976
143k
    }
1977
570M
    pos += i;
1978
570M
    if (i > 16) {
1979
4.28k
      if (i > 32) {
1980
1.69k
        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
1981
2.58k
      } else {
1982
        /* This branch covers about 45% cases.
1983
           Fixed size short copy allows more compiler optimizations. */
1984
2.58k
        memmove16(copy_dst + 16, copy_src + 16);
1985
2.58k
      }
1986
4.28k
    }
1987
570M
  }
1988
603M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
1989
603M
  if (s->meta_block_remaining_len <= 0) {
1990
    /* Next metablock, if any. */
1991
1.90k
    s->state = BROTLI_STATE_METABLOCK_DONE;
1992
1.90k
    goto saveStateAndReturn;
1993
603M
  } else {
1994
603M
    goto CommandBegin;
1995
603M
  }
1996
321M
CommandPostWrapCopy:
1997
321M
  {
1998
321M
    int wrap_guard = s->ringbuffer_size - pos;
1999
3.54G
    while (--i >= 0) {
2000
3.21G
      s->ringbuffer[pos] =
2001
3.21G
          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
2002
3.21G
      ++pos;
2003
3.21G
      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
2004
120k
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
2005
120k
        goto saveStateAndReturn;
2006
120k
      }
2007
3.21G
    }
2008
321M
  }
2009
321M
  if (s->meta_block_remaining_len <= 0) {
2010
    /* Next metablock, if any. */
2011
2.19k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2012
2.19k
    goto saveStateAndReturn;
2013
321M
  } else {
2014
321M
    goto CommandBegin;
2015
321M
  }
2016
2017
669k
saveStateAndReturn:
2018
669k
  s->pos = pos;
2019
669k
  s->loop_counter = i;
2020
669k
  return result;
2021
321M
}
2022
2023
#undef BROTLI_SAFE
2024
2025
static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
2026
347k
    BrotliDecoderState* s) {
2027
347k
  return ProcessCommandsInternal(0, s);
2028
347k
}
2029
2030
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
2031
322k
    BrotliDecoderState* s) {
2032
322k
  return ProcessCommandsInternal(1, s);
2033
322k
}
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
617k
    size_t* available_out, uint8_t** next_out, size_t* total_out) {
2072
617k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2073
617k
  BrotliBitReader* br = &s->br;
2074
  /* Ensure that |total_out| is set, even if no data will ever be pushed out. */
2075
617k
  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
617k
  if ((int)s->error_code < 0) {
2080
0
    return BROTLI_DECODER_RESULT_ERROR;
2081
0
  }
2082
617k
  if (*available_out && (!next_out || !*next_out)) {
2083
0
    return SaveErrorCode(
2084
0
        s, BROTLI_FAILURE(BROTLI_DECODER_ERROR_INVALID_ARGUMENTS));
2085
0
  }
2086
617k
  if (!*available_out) next_out = 0;
2087
617k
  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
2088
606k
    br->avail_in = *available_in;
2089
606k
    br->next_in = *next_in;
2090
606k
  } 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
10.7k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2095
10.7k
    br->next_in = &s->buffer.u8[0];
2096
10.7k
  }
2097
  /* State machine */
2098
1.96M
  for (;;) {
2099
1.96M
    if (result != BROTLI_DECODER_SUCCESS) {
2100
      /* Error, needs more input/output. */
2101
633k
      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2102
290k
        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
2103
208k
          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
2104
208k
              available_out, next_out, total_out, BROTLI_TRUE);
2105
          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
2106
208k
          if ((int)intermediate_result < 0) {
2107
10
            result = intermediate_result;
2108
10
            break;
2109
10
          }
2110
208k
        }
2111
290k
        if (s->buffer_length != 0) {  /* Used with internal buffer. */
2112
19.4k
          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
5.70k
            s->buffer_length = 0;
2117
            /* Switch to input stream and restart. */
2118
5.70k
            result = BROTLI_DECODER_SUCCESS;
2119
5.70k
            br->avail_in = *available_in;
2120
5.70k
            br->next_in = *next_in;
2121
5.70k
            continue;
2122
13.7k
          } else if (*available_in != 0) {
2123
            /* Not enough data in buffer, but can take one more byte from
2124
               input stream. */
2125
10.7k
            result = BROTLI_DECODER_SUCCESS;
2126
10.7k
            s->buffer.u8[s->buffer_length] = **next_in;
2127
10.7k
            s->buffer_length++;
2128
10.7k
            br->avail_in = s->buffer_length;
2129
10.7k
            (*next_in)++;
2130
10.7k
            (*available_in)--;
2131
            /* Retry with more data in buffer. */
2132
10.7k
            continue;
2133
10.7k
          }
2134
          /* Can't finish reading and no more input. */
2135
3.05k
          break;
2136
270k
        } else {  /* Input stream doesn't contain enough input. */
2137
          /* Copy tail to internal buffer and return. */
2138
270k
          *next_in = br->next_in;
2139
270k
          *available_in = br->avail_in;
2140
278k
          while (*available_in) {
2141
7.83k
            s->buffer.u8[s->buffer_length] = **next_in;
2142
7.83k
            s->buffer_length++;
2143
7.83k
            (*next_in)++;
2144
7.83k
            (*available_in)--;
2145
7.83k
          }
2146
270k
          break;
2147
270k
        }
2148
        /* Unreachable. */
2149
290k
      }
2150
2151
      /* Fail or needs more output. */
2152
2153
343k
      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.98k
        s->buffer_length = 0;
2157
341k
      } 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
341k
        BrotliBitReaderUnload(br);
2162
341k
        *available_in = br->avail_in;
2163
341k
        *next_in = br->next_in;
2164
341k
      }
2165
343k
      break;
2166
633k
    }
2167
1.32M
    switch (s->state) {
2168
11.6k
      case BROTLI_STATE_UNINITED:
2169
        /* Prepare to the first read. */
2170
11.6k
        if (!BrotliWarmupBitReader(br)) {
2171
4.54k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2172
4.54k
          break;
2173
4.54k
        }
2174
        /* Decode window size. */
2175
7.07k
        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
2176
7.07k
        if (result != BROTLI_DECODER_SUCCESS) {
2177
2
          break;
2178
2
        }
2179
7.07k
        if (s->large_window) {
2180
0
          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
2181
0
          break;
2182
0
        }
2183
7.07k
        s->state = BROTLI_STATE_INITIALIZE;
2184
7.07k
        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
7.07k
      case BROTLI_STATE_INITIALIZE:
2200
7.07k
        BROTLI_LOG_UINT(s->window_bits);
2201
        /* Maximum distance, see section 9.1. of the spec. */
2202
7.07k
        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
7.07k
        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
2206
7.07k
            sizeof(HuffmanCode) * 3 *
2207
7.07k
                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2208
7.07k
        if (s->block_type_trees == 0) {
2209
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES);
2210
0
          break;
2211
0
        }
2212
7.07k
        s->block_len_trees =
2213
7.07k
            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
2214
2215
7.07k
        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2216
      /* Fall through. */
2217
2218
26.0k
      case BROTLI_STATE_METABLOCK_BEGIN:
2219
26.0k
        BrotliDecoderStateMetablockBegin(s);
2220
26.0k
        BROTLI_LOG_UINT(s->pos);
2221
26.0k
        s->state = BROTLI_STATE_METABLOCK_HEADER;
2222
      /* Fall through. */
2223
2224
51.8k
      case BROTLI_STATE_METABLOCK_HEADER:
2225
51.8k
        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
2226
51.8k
        if (result != BROTLI_DECODER_SUCCESS) {
2227
26.1k
          break;
2228
26.1k
        }
2229
25.6k
        BROTLI_LOG_UINT(s->is_last_metablock);
2230
25.6k
        BROTLI_LOG_UINT(s->meta_block_remaining_len);
2231
25.6k
        BROTLI_LOG_UINT(s->is_metadata);
2232
25.6k
        BROTLI_LOG_UINT(s->is_uncompressed);
2233
25.6k
        if (s->is_metadata || s->is_uncompressed) {
2234
8.51k
          if (!BrotliJumpToByteBoundary(br)) {
2235
43
            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
2236
43
            break;
2237
43
          }
2238
8.51k
        }
2239
25.5k
        if (s->is_metadata) {
2240
5.72k
          s->state = BROTLI_STATE_METADATA;
2241
5.72k
          break;
2242
5.72k
        }
2243
19.8k
        if (s->meta_block_remaining_len == 0) {
2244
287
          s->state = BROTLI_STATE_METABLOCK_DONE;
2245
287
          break;
2246
287
        }
2247
19.5k
        BrotliCalculateRingBufferSize(s);
2248
19.5k
        if (s->is_uncompressed) {
2249
2.75k
          s->state = BROTLI_STATE_UNCOMPRESSED;
2250
2.75k
          break;
2251
2.75k
        }
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.6k
      case BROTLI_STATE_HUFFMAN_CODE_0:
2271
68.6k
        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.34k
          break;
2279
3.34k
        }
2280
49.2k
        s->num_block_types[s->loop_counter]++;
2281
49.2k
        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2282
49.2k
        if (s->num_block_types[s->loop_counter] < 2) {
2283
43.7k
          s->loop_counter++;
2284
43.7k
          break;
2285
43.7k
        }
2286
5.49k
        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2287
      /* Fall through. */
2288
2289
9.60k
      case BROTLI_STATE_HUFFMAN_CODE_1: {
2290
9.60k
        uint32_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
2291
9.60k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2292
9.60k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2293
9.60k
            &s->block_type_trees[tree_offset], NULL, s);
2294
9.60k
        if (result != BROTLI_DECODER_SUCCESS) break;
2295
5.09k
        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2296
5.09k
      }
2297
      /* Fall through. */
2298
2299
11.1k
      case BROTLI_STATE_HUFFMAN_CODE_2: {
2300
11.1k
        uint32_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
2301
11.1k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2302
11.1k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2303
11.1k
            &s->block_len_trees[tree_offset], NULL, s);
2304
11.1k
        if (result != BROTLI_DECODER_SUCCESS) break;
2305
4.87k
        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2306
4.87k
      }
2307
      /* Fall through. */
2308
2309
6.17k
      case BROTLI_STATE_HUFFMAN_CODE_3: {
2310
6.17k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2311
6.17k
        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2312
6.17k
            &s->block_len_trees[tree_offset], br)) {
2313
1.39k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2314
1.39k
          break;
2315
1.39k
        }
2316
4.78k
        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2317
4.78k
        s->loop_counter++;
2318
4.78k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2319
4.78k
        break;
2320
6.17k
      }
2321
2322
67.1k
      case BROTLI_STATE_UNCOMPRESSED: {
2323
67.1k
        result = CopyUncompressedBlockToOutput(
2324
67.1k
            available_out, next_out, total_out, s);
2325
67.1k
        if (result != BROTLI_DECODER_SUCCESS) {
2326
64.8k
          break;
2327
64.8k
        }
2328
2.35k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2329
2.35k
        break;
2330
67.1k
      }
2331
2332
19.7k
      case BROTLI_STATE_METADATA:
2333
678k
        for (; s->meta_block_remaining_len > 0; --s->meta_block_remaining_len) {
2334
673k
          uint32_t bits;
2335
          /* Read one byte and ignore it. */
2336
673k
          if (!BrotliSafeReadBits(br, 8, &bits)) {
2337
14.1k
            result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2338
14.1k
            break;
2339
14.1k
          }
2340
673k
        }
2341
19.7k
        if (result == BROTLI_DECODER_SUCCESS) {
2342
5.61k
          s->state = BROTLI_STATE_METABLOCK_DONE;
2343
5.61k
        }
2344
19.7k
        break;
2345
2346
22.9k
      case BROTLI_STATE_METABLOCK_HEADER_2: {
2347
22.9k
        uint32_t bits;
2348
22.9k
        if (!BrotliSafeReadBits(br, 6, &bits)) {
2349
6.95k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2350
6.95k
          break;
2351
6.95k
        }
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.6k
      case BROTLI_STATE_CONTEXT_MODES:
2369
17.6k
        result = ReadContextModes(s);
2370
17.6k
        if (result != BROTLI_DECODER_SUCCESS) {
2371
1.69k
          break;
2372
1.69k
        }
2373
15.9k
        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2374
      /* Fall through. */
2375
2376
27.0k
      case BROTLI_STATE_CONTEXT_MAP_1:
2377
27.0k
        result = DecodeContextMap(
2378
27.0k
            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2379
27.0k
            &s->num_literal_htrees, &s->context_map, s);
2380
27.0k
        if (result != BROTLI_DECODER_SUCCESS) {
2381
11.4k
          break;
2382
11.4k
        }
2383
15.5k
        DetectTrivialLiteralBlockTypes(s);
2384
15.5k
        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2385
      /* Fall through. */
2386
2387
18.2k
      case BROTLI_STATE_CONTEXT_MAP_2: {
2388
18.2k
        uint32_t npostfix = s->distance_postfix_bits;
2389
18.2k
        uint32_t ndirect = s->num_direct_distance_codes;
2390
18.2k
        uint32_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2391
18.2k
            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
2392
18.2k
        uint32_t distance_alphabet_size_limit = distance_alphabet_size_max;
2393
18.2k
        BROTLI_BOOL allocation_success = BROTLI_TRUE;
2394
18.2k
        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.2k
        result = DecodeContextMap(
2402
18.2k
            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2403
18.2k
            &s->num_dist_htrees, &s->dist_context_map, s);
2404
18.2k
        if (result != BROTLI_DECODER_SUCCESS) {
2405
2.90k
          break;
2406
2.90k
        }
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
120k
      case BROTLI_STATE_TREE_GROUP: {
2426
120k
        HuffmanTreeGroup* hgroup = NULL;
2427
120k
        switch (s->loop_counter) {
2428
52.1k
          case 0: hgroup = &s->literal_hgroup; break;
2429
33.6k
          case 1: hgroup = &s->insert_copy_hgroup; break;
2430
34.9k
          case 2: hgroup = &s->distance_hgroup; break;
2431
0
          default: return SaveErrorCode(s, BROTLI_FAILURE(
2432
0
              BROTLI_DECODER_ERROR_UNREACHABLE));
2433
120k
        }
2434
120k
        result = HuffmanTreeGroupDecode(hgroup, s);
2435
120k
        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
111k
      case BROTLI_STATE_COMMAND_BEGIN:
2457
      /* Fall through. */
2458
170k
      case BROTLI_STATE_COMMAND_INNER:
2459
      /* Fall through. */
2460
227k
      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2461
      /* Fall through. */
2462
347k
      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2463
347k
        result = ProcessCommands(s);
2464
347k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2465
322k
          result = SafeProcessCommands(s);
2466
322k
        }
2467
347k
        break;
2468
2469
164k
      case BROTLI_STATE_COMMAND_INNER_WRITE:
2470
      /* Fall through. */
2471
377k
      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2472
      /* Fall through. */
2473
617k
      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2474
617k
        result = WriteRingBuffer(
2475
617k
            s, available_out, next_out, total_out, BROTLI_FALSE);
2476
617k
        if (result != BROTLI_DECODER_SUCCESS) {
2477
339k
          break;
2478
339k
        }
2479
277k
        WrapRingBuffer(s);
2480
277k
        if (s->ringbuffer_size == 1 << s->window_bits) {
2481
277k
          s->max_distance = s->max_backward_distance;
2482
277k
        }
2483
277k
        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
2484
75.4k
          if (s->meta_block_remaining_len == 0) {
2485
            /* Next metablock, if any. */
2486
28
            s->state = BROTLI_STATE_METABLOCK_DONE;
2487
75.4k
          } else {
2488
75.4k
            s->state = BROTLI_STATE_COMMAND_BEGIN;
2489
75.4k
          }
2490
75.4k
          break;
2491
202k
        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2492
120k
          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2493
120k
        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2494
82.4k
          if (s->loop_counter == 0) {
2495
36.5k
            if (s->meta_block_remaining_len == 0) {
2496
238
              s->state = BROTLI_STATE_METABLOCK_DONE;
2497
36.3k
            } else {
2498
36.3k
              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2499
36.3k
            }
2500
36.5k
            break;
2501
36.5k
          }
2502
45.8k
          s->state = BROTLI_STATE_COMMAND_INNER;
2503
45.8k
        }
2504
165k
        break;
2505
2506
165k
      case BROTLI_STATE_METABLOCK_DONE:
2507
19.9k
        if (s->meta_block_remaining_len < 0) {
2508
515
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
2509
515
          break;
2510
515
        }
2511
19.4k
        BrotliDecoderStateCleanupAfterMetablock(s);
2512
19.4k
        if (!s->is_last_metablock) {
2513
19.0k
          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2514
19.0k
          break;
2515
19.0k
        }
2516
424
        if (!BrotliJumpToByteBoundary(br)) {
2517
54
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2518
54
          break;
2519
54
        }
2520
370
        if (s->buffer_length == 0) {
2521
368
          BrotliBitReaderUnload(br);
2522
368
          *available_in = br->avail_in;
2523
368
          *next_in = br->next_in;
2524
368
        }
2525
370
        s->state = BROTLI_STATE_DONE;
2526
      /* Fall through. */
2527
2528
393
      case BROTLI_STATE_DONE:
2529
393
        if (s->ringbuffer != 0) {
2530
62
          result = WriteRingBuffer(
2531
62
              s, available_out, next_out, total_out, BROTLI_TRUE);
2532
62
          if (result != BROTLI_DECODER_SUCCESS) {
2533
38
            break;
2534
38
          }
2535
62
        }
2536
355
        return SaveErrorCode(s, result);
2537
1.32M
    }
2538
1.32M
  }
2539
617k
  return SaveErrorCode(s, result);
2540
617k
}
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
615k
const uint8_t* BrotliDecoderTakeOutput(BrotliDecoderState* s, size_t* size) {
2552
615k
  uint8_t* result = 0;
2553
615k
  size_t available_out = *size ? *size : 1u << 24;
2554
615k
  size_t requested_out = available_out;
2555
615k
  BrotliDecoderErrorCode status;
2556
615k
  if ((s->ringbuffer == 0) || ((int)s->error_code < 0)) {
2557
82.4k
    *size = 0;
2558
82.4k
    return 0;
2559
82.4k
  }
2560
533k
  WrapRingBuffer(s);
2561
533k
  status = WriteRingBuffer(s, &available_out, &result, 0, BROTLI_TRUE);
2562
  /* Either WriteRingBuffer returns those "success" codes... */
2563
533k
  if (status == BROTLI_DECODER_SUCCESS ||
2564
533k
      status == BROTLI_DECODER_NEEDS_MORE_OUTPUT) {
2565
533k
    *size = requested_out - available_out;
2566
533k
  } 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
533k
  return result;
2574
615k
}
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