Coverage Report

Created: 2025-07-09 06:30

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