Coverage Report

Created: 2026-06-16 06:28

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