Coverage Report

Created: 2026-08-14 06:57

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
790
#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
435M
#define HUFFMAN_TABLE_BITS 8U
41
6.29k
#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.80k
    BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
117
2.80k
  s->error_code = (int)e;
118
2.80k
  s->used_input += consumed_input;
119
2.80k
  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.80k
  switch (e) {
124
640
    case BROTLI_DECODER_SUCCESS:
125
640
      return BROTLI_DECODER_RESULT_SUCCESS;
126
127
1.30k
    case BROTLI_DECODER_NEEDS_MORE_INPUT:
128
1.30k
      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
129
130
67
    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
131
67
      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
132
133
790
    default:
134
790
      return BROTLI_DECODER_RESULT_ERROR;
135
2.80k
  }
136
2.80k
}
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.49k
                                               BrotliBitReader* br) {
142
2.49k
  brotli_reg_t n;
143
2.49k
  BROTLI_BOOL large_window = s->large_window;
144
2.49k
  s->large_window = BROTLI_FALSE;
145
2.49k
  BrotliTakeBits(br, 1, &n);
146
2.49k
  if (n == 0) {
147
956
    s->window_bits = 16;
148
956
    return BROTLI_DECODER_SUCCESS;
149
956
  }
150
1.53k
  BrotliTakeBits(br, 3, &n);
151
1.53k
  if (n != 0) {
152
1.16k
    s->window_bits = (17u + n) & 63u;
153
1.16k
    return BROTLI_DECODER_SUCCESS;
154
1.16k
  }
155
366
  BrotliTakeBits(br, 3, &n);
156
366
  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
364
  if (n != 0) {
169
317
    s->window_bits = (8u + n) & 63u;
170
317
    return BROTLI_DECODER_SUCCESS;
171
317
  }
172
47
  s->window_bits = 17;
173
47
  return BROTLI_DECODER_SUCCESS;
174
364
}
175
176
54.2M
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
54.2M
  uint32_t buffer[4];
181
54.2M
  memcpy(buffer, src, 16);
182
54.2M
  memcpy(dst, buffer, 16);
183
54.2M
#endif
184
54.2M
}
185
186
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
187
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
188
32.4k
    BrotliDecoderState* s, BrotliBitReader* br, brotli_reg_t* value) {
189
32.4k
  brotli_reg_t bits;
190
32.4k
  switch (s->substate_decode_uint8) {
191
32.4k
    case BROTLI_STATE_DECODE_UINT8_NONE:
192
32.4k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
193
9
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
194
9
      }
195
32.4k
      if (bits == 0) {
196
27.0k
        *value = 0;
197
27.0k
        return BROTLI_DECODER_SUCCESS;
198
27.0k
      }
199
    /* Fall through. */
200
201
5.37k
    case BROTLI_STATE_DECODE_UINT8_SHORT:
202
5.37k
      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
5.36k
      if (bits == 0) {
207
761
        *value = 1;
208
761
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
209
761
        return BROTLI_DECODER_SUCCESS;
210
761
      }
211
      /* Use output value as a temporary storage. It MUST be persisted. */
212
4.60k
      *value = bits;
213
    /* Fall through. */
214
215
4.60k
    case BROTLI_STATE_DECODE_UINT8_LONG:
216
4.60k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
217
4
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
218
4
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
219
4
      }
220
4.60k
      *value = (1U << *value) + bits;
221
4.60k
      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
222
4.60k
      return BROTLI_DECODER_SUCCESS;
223
224
0
    default:
225
0
      return
226
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
227
32.4k
  }
228
32.4k
}
229
230
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
231
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
232
68.4k
    BrotliDecoderState* s, BrotliBitReader* br) {
233
68.4k
  brotli_reg_t bits;
234
68.4k
  int i;
235
189k
  for (;;) {
236
189k
    switch (s->substate_metablock_header) {
237
68.4k
      case BROTLI_STATE_METABLOCK_HEADER_NONE:
238
68.4k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
239
2
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
240
2
        }
241
68.4k
        s->is_last_metablock = bits ? 1 : 0;
242
68.4k
        s->meta_block_remaining_len = 0;
243
68.4k
        s->is_uncompressed = 0;
244
68.4k
        s->is_metadata = 0;
245
68.4k
        if (!s->is_last_metablock) {
246
67.4k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
247
67.4k
          break;
248
67.4k
        }
249
1.00k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
250
      /* Fall through. */
251
252
1.00k
      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
253
1.00k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
254
1
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
255
1
        }
256
1.00k
        if (bits) {
257
111
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
258
111
          return BROTLI_DECODER_SUCCESS;
259
111
        }
260
890
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
261
      /* Fall through. */
262
263
68.3k
      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
264
68.3k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
265
41
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
266
41
        }
267
68.3k
        s->size_nibbles = (uint8_t)(bits + 4);
268
68.3k
        s->loop_counter = 0;
269
68.3k
        if (bits == 3) {
270
53.2k
          s->is_metadata = 1;
271
53.2k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
272
53.2k
          break;
273
53.2k
        }
274
15.0k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
275
      /* Fall through. */
276
277
15.0k
      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
278
15.0k
        i = s->loop_counter;
279
76.4k
        for (; i < (int)s->size_nibbles; ++i) {
280
61.4k
          if (!BrotliSafeReadBits(br, 4, &bits)) {
281
71
            s->loop_counter = i;
282
71
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
283
71
          }
284
61.3k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
285
701
              bits == 0) {
286
6
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
287
6
          }
288
61.3k
          s->meta_block_remaining_len |= (int)(bits << (i * 4));
289
61.3k
        }
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.1k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
297
1
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
298
1
          }
299
14.1k
          s->is_uncompressed = bits ? 1 : 0;
300
14.1k
        }
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
53.2k
      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
306
53.2k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
307
0
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
308
0
        }
309
53.2k
        if (bits != 0) {
310
6
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
311
6
        }
312
53.2k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
313
      /* Fall through. */
314
315
53.2k
      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
316
53.2k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
317
2
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
318
2
        }
319
53.2k
        if (bits == 0) {
320
41.5k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
321
41.5k
          return BROTLI_DECODER_SUCCESS;
322
41.5k
        }
323
11.6k
        s->size_nibbles = (uint8_t)bits;
324
11.6k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
325
      /* Fall through. */
326
327
11.6k
      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
328
11.6k
        i = s->loop_counter;
329
23.3k
        for (; i < (int)s->size_nibbles; ++i) {
330
11.7k
          if (!BrotliSafeReadBits(br, 8, &bits)) {
331
3
            s->loop_counter = i;
332
3
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
333
3
          }
334
11.7k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
335
71
              bits == 0) {
336
1
            return BROTLI_FAILURE(
337
1
                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
338
1
          }
339
11.7k
          s->meta_block_remaining_len |= (int)(bits << (i * 8));
340
11.7k
        }
341
11.6k
        ++s->meta_block_remaining_len;
342
11.6k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
343
11.6k
        return BROTLI_DECODER_SUCCESS;
344
345
0
      default:
346
0
        return
347
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
348
189k
    }
349
189k
  }
350
68.4k
}
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
425M
                                               BrotliBitReader* br) {
359
425M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
360
425M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
361
425M
  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
362
326k
    brotli_reg_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
363
326k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
364
326k
    BROTLI_HC_ADJUST_TABLE_INDEX(table,
365
326k
        BROTLI_HC_FAST_LOAD_VALUE(table) +
366
326k
        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
367
326k
  }
368
425M
  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
369
425M
  return BROTLI_HC_FAST_LOAD_VALUE(table);
370
425M
}
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
60.1M
                                             BrotliBitReader* br) {
376
60.1M
  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
377
60.1M
}
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
10.1M
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
383
10.1M
  brotli_reg_t val;
384
10.1M
  brotli_reg_t available_bits = BrotliGetAvailableBits(br);
385
10.1M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
386
10.1M
  if (available_bits == 0) {
387
6.12k
    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
388
5.96k
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
389
5.96k
      return BROTLI_TRUE;
390
5.96k
    }
391
161
    return BROTLI_FALSE;  /* No valid bits at all. */
392
6.12k
  }
393
10.1M
  val = BrotliGetBitsUnmasked(br);
394
10.1M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
395
10.1M
  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
396
10.1M
    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
397
10.1M
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
398
10.1M
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
399
10.1M
      return BROTLI_TRUE;
400
10.1M
    } else {
401
66
      return BROTLI_FALSE;  /* Not enough bits for the first level. */
402
66
    }
403
10.1M
  }
404
117
  if (available_bits <= HUFFMAN_TABLE_BITS) {
405
11
    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
406
11
  }
407
408
  /* Speculatively drop HUFFMAN_TABLE_BITS. */
409
106
  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
410
106
  available_bits -= HUFFMAN_TABLE_BITS;
411
106
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
412
106
  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
413
6
    return BROTLI_FALSE;  /* Not enough bits for the second level. */
414
6
  }
415
416
100
  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
417
100
  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
418
100
  return BROTLI_TRUE;
419
106
}
420
421
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
422
375M
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
423
375M
  brotli_reg_t val;
424
375M
  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
425
364M
    *result = DecodeSymbol(val, table, br);
426
364M
    return BROTLI_TRUE;
427
364M
  }
428
10.1M
  return SafeDecodeSymbol(table, br, result);
429
375M
}
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
166M
                                        brotli_reg_t* value) {
437
166M
  if (safe) {
438
20.1M
    return;
439
20.1M
  }
440
145M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
441
145M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
442
145M
  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
443
145M
  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
444
145M
}
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
125M
                                                  brotli_reg_t* value) {
452
125M
  brotli_reg_t result = *value;
453
125M
  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
454
6.29k
    brotli_reg_t val = BrotliGet16BitsUnmasked(br);
455
6.29k
    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
456
6.29k
    brotli_reg_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
457
6.29k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
458
6.29k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
459
6.29k
    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
460
6.29k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
461
6.29k
    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
462
125M
  } else {
463
125M
    BrotliDropBits(br, *bits);
464
125M
  }
465
125M
  PreloadSymbol(0, table, br, bits, value);
466
125M
  return result;
467
125M
}
468
469
25.3k
static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) {
470
25.3k
  brotli_reg_t result = 0;
471
197k
  while (x) {
472
171k
    x >>= 1;
473
171k
    ++result;
474
171k
  }
475
25.3k
  return result;
476
25.3k
}
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
25.3k
    BrotliDecoderState* s) {
484
  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
485
25.3k
  BrotliBitReader* br = &s->br;
486
25.3k
  BrotliMetablockHeaderArena* h = &s->arena.header;
487
25.3k
  brotli_reg_t max_bits = Log2Floor(alphabet_size_max - 1);
488
25.3k
  brotli_reg_t i = h->sub_loop_counter;
489
25.3k
  brotli_reg_t num_symbols = h->symbol;
490
70.9k
  while (i <= num_symbols) {
491
45.6k
    brotli_reg_t v;
492
45.6k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
493
17
      h->sub_loop_counter = i;
494
17
      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
495
17
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
496
17
    }
497
45.6k
    if (v >= alphabet_size_limit) {
498
11
      return
499
11
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
500
11
    }
501
45.5k
    h->symbols_lists_array[i] = (uint16_t)v;
502
45.5k
    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
503
45.5k
    ++i;
504
45.5k
  }
505
506
45.5k
  for (i = 0; i < num_symbols; ++i) {
507
20.2k
    brotli_reg_t k = i + 1;
508
48.6k
    for (; k <= num_symbols; ++k) {
509
28.3k
      if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) {
510
6
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
511
6
      }
512
28.3k
    }
513
20.2k
  }
514
515
25.3k
  return BROTLI_DECODER_SUCCESS;
516
25.3k
}
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
670k
    uint16_t* code_length_histo, int* next_symbol) {
528
670k
  *repeat = 0;
529
670k
  if (code_len != 0) {  /* code_len == 1..15 */
530
434k
    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
531
434k
    next_symbol[code_len] = (int)(*symbol);
532
434k
    *prev_code_len = code_len;
533
434k
    *space -= 32768U >> code_len;
534
434k
    code_length_histo[code_len]++;
535
434k
    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
536
434k
        (int)*symbol, (int)code_len));
537
434k
  }
538
670k
  (*symbol)++;
539
670k
}
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
160k
    uint16_t* code_length_histo, int* next_symbol) {
556
160k
  brotli_reg_t old_repeat;
557
160k
  brotli_reg_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
558
160k
  brotli_reg_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
559
160k
  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
560
86.4k
    new_len = *prev_code_len;
561
86.4k
    extra_bits = 2;
562
86.4k
  }
563
160k
  if (*repeat_code_len != new_len) {
564
64.9k
    *repeat = 0;
565
64.9k
    *repeat_code_len = new_len;
566
64.9k
  }
567
160k
  old_repeat = *repeat;
568
160k
  if (*repeat > 0) {
569
49.5k
    *repeat -= 2;
570
49.5k
    *repeat <<= extra_bits;
571
49.5k
  }
572
160k
  *repeat += repeat_delta + 3U;
573
160k
  repeat_delta = *repeat - old_repeat;
574
160k
  if (*symbol + repeat_delta > alphabet_size) {
575
62
    BROTLI_DUMP();
576
62
    *symbol = alphabet_size;
577
62
    *space = 0xFFFFF;
578
62
    return;
579
62
  }
580
160k
  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
581
160k
      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
582
160k
  if (*repeat_code_len != 0) {
583
86.4k
    brotli_reg_t last = *symbol + repeat_delta;
584
86.4k
    int next = next_symbol[*repeat_code_len];
585
583k
    do {
586
583k
      symbol_lists[next] = (uint16_t)*symbol;
587
583k
      next = (int)*symbol;
588
583k
    } while (++(*symbol) != last);
589
86.4k
    next_symbol[*repeat_code_len] = next;
590
86.4k
    *space -= repeat_delta << (15 - *repeat_code_len);
591
86.4k
    code_length_histo[*repeat_code_len] =
592
86.4k
        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
593
86.4k
  } else {
594
74.0k
    *symbol += repeat_delta;
595
74.0k
  }
596
160k
}
597
598
/* Reads and decodes symbol codelengths. */
599
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
600
12.6k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
601
12.6k
  BrotliBitReader* br = &s->br;
602
12.6k
  BrotliMetablockHeaderArena* h = &s->arena.header;
603
12.6k
  brotli_reg_t symbol = h->symbol;
604
12.6k
  brotli_reg_t repeat = h->repeat;
605
12.6k
  brotli_reg_t space = h->space;
606
12.6k
  brotli_reg_t prev_code_len = h->prev_code_len;
607
12.6k
  brotli_reg_t repeat_code_len = h->repeat_code_len;
608
12.6k
  uint16_t* symbol_lists = h->symbol_lists;
609
12.6k
  uint16_t* code_length_histo = h->code_length_histo;
610
12.6k
  int* next_symbol = h->next_symbol;
611
12.6k
  if (!BrotliWarmupBitReader(br)) {
612
6
    return BROTLI_DECODER_NEEDS_MORE_INPUT;
613
6
  }
614
816k
  while (symbol < alphabet_size && space > 0) {
615
804k
    const HuffmanCode* p = h->table;
616
804k
    brotli_reg_t code_len;
617
804k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
618
804k
    if (!BrotliCheckInputAmount(br)) {
619
384
      h->symbol = symbol;
620
384
      h->repeat = repeat;
621
384
      h->prev_code_len = prev_code_len;
622
384
      h->repeat_code_len = repeat_code_len;
623
384
      h->space = space;
624
384
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
625
384
    }
626
804k
    BrotliFillBitWindow16(br);
627
804k
    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
628
804k
        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
629
804k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
630
804k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
631
804k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
632
644k
      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
633
644k
          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
634
644k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
635
159k
      brotli_reg_t extra_bits =
636
159k
          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
637
159k
      brotli_reg_t repeat_delta =
638
159k
          BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
639
159k
      BrotliDropBits(br, extra_bits);
640
159k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
641
159k
          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
642
159k
          symbol_lists, code_length_histo, next_symbol);
643
159k
    }
644
804k
  }
645
12.2k
  h->space = space;
646
12.2k
  return BROTLI_DECODER_SUCCESS;
647
12.6k
}
648
649
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
650
390
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
651
390
  BrotliBitReader* br = &s->br;
652
390
  BrotliMetablockHeaderArena* h = &s->arena.header;
653
390
  BROTLI_BOOL get_byte = BROTLI_FALSE;
654
29.4k
  while (h->symbol < alphabet_size && h->space > 0) {
655
29.0k
    const HuffmanCode* p = h->table;
656
29.0k
    brotli_reg_t code_len;
657
29.0k
    brotli_reg_t available_bits;
658
29.0k
    brotli_reg_t bits = 0;
659
29.0k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
660
29.0k
    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
661
29.0k
    get_byte = BROTLI_FALSE;
662
29.0k
    available_bits = BrotliGetAvailableBits(br);
663
29.0k
    if (available_bits != 0) {
664
27.1k
      bits = (uint32_t)BrotliGetBitsUnmasked(br);
665
27.1k
    }
666
29.0k
    BROTLI_HC_ADJUST_TABLE_INDEX(p,
667
29.0k
        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
668
29.0k
    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
669
1.40k
      get_byte = BROTLI_TRUE;
670
1.40k
      continue;
671
1.40k
    }
672
27.6k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
673
27.6k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
674
26.4k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
675
26.4k
      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
676
26.4k
          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
677
26.4k
          h->next_symbol);
678
26.4k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
679
1.16k
      brotli_reg_t extra_bits = code_len - 14U;
680
1.16k
      brotli_reg_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
681
1.16k
          BitMask(extra_bits);
682
1.16k
      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
683
249
        get_byte = BROTLI_TRUE;
684
249
        continue;
685
249
      }
686
914
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
687
914
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
688
914
          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
689
914
          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
690
914
          h->next_symbol);
691
914
    }
692
27.6k
  }
693
347
  return BROTLI_DECODER_SUCCESS;
694
390
}
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
12.8k
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
699
12.8k
  BrotliBitReader* br = &s->br;
700
12.8k
  BrotliMetablockHeaderArena* h = &s->arena.header;
701
12.8k
  brotli_reg_t num_codes = h->repeat;
702
12.8k
  brotli_reg_t space = h->space;
703
12.8k
  brotli_reg_t i = h->sub_loop_counter;
704
114k
  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
705
114k
    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
706
114k
    brotli_reg_t ix;
707
114k
    brotli_reg_t v;
708
114k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
709
118
      brotli_reg_t available_bits = BrotliGetAvailableBits(br);
710
118
      if (available_bits != 0) {
711
93
        ix = BrotliGetBitsUnmasked(br) & 0xF;
712
93
      } else {
713
25
        ix = 0;
714
25
      }
715
118
      if (kCodeLengthPrefixLength[ix] > available_bits) {
716
66
        h->sub_loop_counter = i;
717
66
        h->repeat = num_codes;
718
66
        h->space = space;
719
66
        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
720
66
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
721
66
      }
722
118
    }
723
114k
    v = kCodeLengthPrefixValue[ix];
724
114k
    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
725
114k
    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
726
114k
    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
727
114k
    if (v != 0) {
728
91.4k
      space = space - (32U >> v);
729
91.4k
      ++num_codes;
730
91.4k
      ++h->code_length_histo[v];
731
91.4k
      if (space - 1U >= 32U) {
732
        /* space is 0 or wrapped around. */
733
12.4k
        break;
734
12.4k
      }
735
91.4k
    }
736
114k
  }
737
12.7k
  if (!(num_codes == 1 || space == 0)) {
738
127
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
739
127
  }
740
12.6k
  return BROTLI_DECODER_SUCCESS;
741
12.7k
}
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
38.2k
                                              BrotliDecoderState* s) {
759
38.2k
  BrotliBitReader* br = &s->br;
760
38.2k
  BrotliMetablockHeaderArena* h = &s->arena.header;
761
  /* State machine. */
762
51.0k
  for (;;) {
763
51.0k
    switch (h->substate_huffman) {
764
38.2k
      case BROTLI_STATE_HUFFMAN_NONE:
765
38.2k
        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
766
9
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
767
9
        }
768
38.1k
        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
38.1k
        if (h->sub_loop_counter != 1) {
773
12.8k
          h->space = 32;
774
12.8k
          h->repeat = 0;  /* num_codes */
775
12.8k
          memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) *
776
12.8k
              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
777
12.8k
          memset(&h->code_length_code_lengths[0], 0,
778
12.8k
              sizeof(h->code_length_code_lengths));
779
12.8k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
780
12.8k
          continue;
781
12.8k
        }
782
      /* Fall through. */
783
784
25.3k
      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
785
        /* Read symbols, codes & code lengths directly. */
786
25.3k
        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
787
4
          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
788
4
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
789
4
        }
790
25.3k
        h->sub_loop_counter = 0;
791
      /* Fall through. */
792
793
25.3k
      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
794
25.3k
        BrotliDecoderErrorCode result =
795
25.3k
            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
796
25.3k
        if (result != BROTLI_DECODER_SUCCESS) {
797
34
          return result;
798
34
        }
799
25.3k
      }
800
      /* Fall through. */
801
802
25.3k
      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
803
25.3k
        brotli_reg_t table_size;
804
25.3k
        if (h->symbol == 3) {
805
933
          brotli_reg_t bits;
806
933
          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
932
          h->symbol += bits;
811
932
        }
812
25.3k
        BROTLI_LOG_UINT(h->symbol);
813
25.3k
        table_size = BrotliBuildSimpleHuffmanTable(table, HUFFMAN_TABLE_BITS,
814
25.3k
                                                   h->symbols_lists_array,
815
25.3k
                                                   (uint32_t)h->symbol);
816
25.3k
        if (opt_table_size) {
817
17.2k
          *opt_table_size = table_size;
818
17.2k
        }
819
25.3k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
820
25.3k
        return BROTLI_DECODER_SUCCESS;
821
25.3k
      }
822
823
      /* Decode Huffman-coded code lengths. */
824
12.8k
      case BROTLI_STATE_HUFFMAN_COMPLEX: {
825
12.8k
        brotli_reg_t i;
826
12.8k
        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
827
12.8k
        if (result != BROTLI_DECODER_SUCCESS) {
828
193
          return result;
829
193
        }
830
12.6k
        BrotliBuildCodeLengthsHuffmanTable(h->table,
831
12.6k
                                           h->code_length_code_lengths,
832
12.6k
                                           h->code_length_histo);
833
12.6k
        memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo));
834
215k
        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
835
202k
          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
836
202k
          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
837
202k
        }
838
839
12.6k
        h->symbol = 0;
840
12.6k
        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
841
12.6k
        h->repeat = 0;
842
12.6k
        h->repeat_code_len = 0;
843
12.6k
        h->space = 32768;
844
12.6k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
845
12.6k
      }
846
      /* Fall through. */
847
848
12.6k
      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
849
12.6k
        brotli_reg_t table_size;
850
12.6k
        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
851
12.6k
            alphabet_size_limit, s);
852
12.6k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
853
390
          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
854
390
        }
855
12.6k
        if (result != BROTLI_DECODER_SUCCESS) {
856
43
          return result;
857
43
        }
858
859
12.6k
        if (h->space != 0) {
860
139
          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
861
139
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
862
139
        }
863
12.4k
        table_size = BrotliBuildHuffmanTable(
864
12.4k
            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
865
12.4k
        if (opt_table_size) {
866
11.1k
          *opt_table_size = table_size;
867
11.1k
        }
868
12.4k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
869
12.4k
        return BROTLI_DECODER_SUCCESS;
870
12.6k
      }
871
872
0
      default:
873
0
        return
874
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
875
51.0k
    }
876
51.0k
  }
877
38.2k
}
878
879
/* Decodes a block length by reading 3..39 bits. */
880
static BROTLI_INLINE brotli_reg_t ReadBlockLength(const HuffmanCode* table,
881
468k
                                                  BrotliBitReader* br) {
882
468k
  brotli_reg_t code;
883
468k
  brotli_reg_t nbits;
884
468k
  code = ReadSymbol(table, br);
885
468k
  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
886
468k
  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
887
468k
}
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
11.8k
    BrotliBitReader* br) {
894
11.8k
  brotli_reg_t index;
895
11.8k
  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
896
11.8k
    if (!SafeReadSymbol(table, br, &index)) {
897
34
      return BROTLI_FALSE;
898
34
    }
899
11.8k
  } else {
900
0
    index = s->block_length_index;
901
0
  }
902
11.7k
  {
903
11.7k
    brotli_reg_t bits;
904
11.7k
    brotli_reg_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
905
11.7k
    brotli_reg_t offset = _kBrotliPrefixCodeRanges[index].offset;
906
11.7k
    if (!BrotliSafeReadBits(br, nbits, &bits)) {
907
71
      s->block_length_index = index;
908
71
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
909
71
      return BROTLI_FALSE;
910
71
    }
911
11.7k
    *result = offset + bits;
912
11.7k
    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
913
11.7k
    return BROTLI_TRUE;
914
11.7k
  }
915
11.7k
}
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
853
    uint8_t* v, brotli_reg_t v_len, BrotliDecoderState* state) {
933
  /* Reinitialize elements that could have been changed. */
934
853
  brotli_reg_t i = 1;
935
853
  brotli_reg_t upper_bound = state->mtf_upper_bound;
936
853
  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
937
853
  uint8_t* mtf_u8 = (uint8_t*)mtf;
938
  /* Load endian-aware constant. */
939
853
  const uint8_t b0123[4] = {0, 1, 2, 3};
940
853
  uint32_t pattern;
941
853
  memcpy(&pattern, &b0123, 4);
942
943
  /* Initialize list using 4 consequent values pattern. */
944
853
  mtf[0] = pattern;
945
47.1k
  do {
946
47.1k
    pattern += 0x04040404;  /* Advance all 4 values by 4. */
947
47.1k
    mtf[i] = pattern;
948
47.1k
    i++;
949
47.1k
  } while (i <= upper_bound);
950
951
  /* Transform the input. */
952
853
  upper_bound = 0;
953
256k
  for (i = 0; i < v_len; ++i) {
954
255k
    int index = v[i];
955
255k
    uint8_t value = mtf_u8[index];
956
255k
    upper_bound |= v[i];
957
255k
    v[i] = value;
958
255k
    mtf_u8[-1] = value;
959
1.46M
    do {
960
1.46M
      index--;
961
1.46M
      mtf_u8[index + 1] = mtf_u8[index];
962
1.46M
    } while (index >= 0);
963
255k
  }
964
  /* Remember amount of elements to be reinitialized. */
965
853
  state->mtf_upper_bound = upper_bound >> 2;
966
853
}
967
968
/* Decodes a series of Huffman table using ReadHuffmanCode function. */
969
static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
970
18.6k
    HuffmanTreeGroup* group, BrotliDecoderState* s) {
971
18.6k
  BrotliMetablockHeaderArena* h = &s->arena.header;
972
18.6k
  if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
973
18.6k
    h->next = group->codes;
974
18.6k
    h->htree_index = 0;
975
18.6k
    h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
976
18.6k
  }
977
47.0k
  while (h->htree_index < group->num_htrees) {
978
28.6k
    brotli_reg_t table_size;
979
28.6k
    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
980
28.6k
        group->alphabet_size_limit, h->next, &table_size, s);
981
28.6k
    if (result != BROTLI_DECODER_SUCCESS) return result;
982
28.3k
    group->htrees[h->htree_index] = h->next;
983
28.3k
    h->next += table_size;
984
28.3k
    ++h->htree_index;
985
28.3k
  }
986
18.4k
  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
987
18.4k
  return BROTLI_DECODER_SUCCESS;
988
18.6k
}
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
12.8k
                                               BrotliDecoderState* s) {
1002
12.8k
  BrotliBitReader* br = &s->br;
1003
12.8k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1004
12.8k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1005
1006
12.8k
  switch ((int)h->substate_context_map) {
1007
12.8k
    case BROTLI_STATE_CONTEXT_MAP_NONE:
1008
12.8k
      result = DecodeVarLenUint8(s, br, num_htrees);
1009
12.8k
      if (result != BROTLI_DECODER_SUCCESS) {
1010
9
        return result;
1011
9
      }
1012
12.7k
      (*num_htrees)++;
1013
12.7k
      h->context_index = 0;
1014
12.7k
      BROTLI_LOG_UINT(context_map_size);
1015
12.7k
      BROTLI_LOG_UINT(*num_htrees);
1016
12.7k
      *context_map_arg =
1017
12.7k
          (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
1018
12.7k
      if (*context_map_arg == 0) {
1019
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
1020
0
      }
1021
12.7k
      if (*num_htrees <= 1) {
1022
11.7k
        memset(*context_map_arg, 0, (size_t)context_map_size);
1023
11.7k
        return BROTLI_DECODER_SUCCESS;
1024
11.7k
      }
1025
1.03k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
1026
    /* Fall through. */
1027
1028
1.03k
    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
1029
1.03k
      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.03k
      if (!BrotliSafeGetBits(br, 5, &bits)) {
1033
6
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1034
6
      }
1035
1.02k
      if ((bits & 1) != 0) { /* Use RLE for zeros. */
1036
792
        h->max_run_length_prefix = (bits >> 1) + 1;
1037
792
        BrotliDropBits(br, 5);
1038
792
      } else {
1039
234
        h->max_run_length_prefix = 0;
1040
234
        BrotliDropBits(br, 1);
1041
234
      }
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
974
      h->code = 0xFFFF;
1053
974
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
1054
974
    }
1055
    /* Fall through. */
1056
1057
974
    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
1058
974
      brotli_reg_t context_index = h->context_index;
1059
974
      brotli_reg_t max_run_length_prefix = h->max_run_length_prefix;
1060
974
      uint8_t* context_map = *context_map_arg;
1061
974
      brotli_reg_t code = h->code;
1062
974
      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
1063
151k
      while (context_index < context_map_size || skip_preamble) {
1064
150k
        if (!skip_preamble) {
1065
150k
          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
1066
22
            h->code = 0xFFFF;
1067
22
            h->context_index = context_index;
1068
22
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1069
22
          }
1070
150k
          BROTLI_LOG_UINT(code);
1071
1072
150k
          if (code == 0) {
1073
25.2k
            context_map[context_index++] = 0;
1074
25.2k
            continue;
1075
25.2k
          }
1076
125k
          if (code > max_run_length_prefix) {
1077
106k
            context_map[context_index++] =
1078
106k
                (uint8_t)(code - max_run_length_prefix);
1079
106k
            continue;
1080
106k
          }
1081
125k
        } else {
1082
0
          skip_preamble = BROTLI_FALSE;
1083
0
        }
1084
        /* RLE sub-stage. */
1085
18.7k
        {
1086
18.7k
          brotli_reg_t reps;
1087
18.7k
          if (!BrotliSafeReadBits(br, code, &reps)) {
1088
7
            h->code = code;
1089
7
            h->context_index = context_index;
1090
7
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1091
7
          }
1092
18.7k
          reps += 1U << code;
1093
18.7k
          BROTLI_LOG_UINT(reps);
1094
18.7k
          if (context_index + reps > context_map_size) {
1095
19
            return
1096
19
                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
1097
19
          }
1098
145k
          do {
1099
145k
            context_map[context_index++] = 0;
1100
145k
          } while (--reps);
1101
18.6k
        }
1102
18.6k
      }
1103
974
    }
1104
    /* Fall through. */
1105
1106
926
    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1107
926
      brotli_reg_t bits;
1108
926
      if (!BrotliSafeReadBits(br, 1, &bits)) {
1109
3
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
1110
3
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1111
3
      }
1112
923
      if (bits != 0) {
1113
853
        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
1114
853
      }
1115
923
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
1116
923
      return BROTLI_DECODER_SUCCESS;
1117
926
    }
1118
1119
0
    default:
1120
0
      return
1121
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1122
12.8k
  }
1123
12.8k
}
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
476k
    int safe, BrotliDecoderState* s, int tree_type) {
1129
476k
  brotli_reg_t max_block_type = s->num_block_types[tree_type];
1130
476k
  const HuffmanCode* type_tree = &s->block_type_trees[
1131
476k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
1132
476k
  const HuffmanCode* len_tree = &s->block_len_trees[
1133
476k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1134
476k
  BrotliBitReader* br = &s->br;
1135
476k
  brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1136
476k
  brotli_reg_t block_type;
1137
476k
  if (max_block_type <= 1) {
1138
0
    return BROTLI_FALSE;
1139
0
  }
1140
1141
  /* Read 0..15 + 3..39 bits. */
1142
476k
  if (!safe) {
1143
468k
    block_type = ReadSymbol(type_tree, br);
1144
468k
    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1145
468k
  } else {
1146
7.66k
    BrotliBitReaderState memento;
1147
7.66k
    BrotliBitReaderSaveState(br, &memento);
1148
7.66k
    if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE;
1149
7.63k
    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1150
100
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1151
100
      BrotliBitReaderRestoreState(br, &memento);
1152
100
      return BROTLI_FALSE;
1153
100
    }
1154
7.63k
  }
1155
1156
476k
  if (block_type == 1) {
1157
63.4k
    block_type = ringbuffer[1] + 1;
1158
412k
  } else if (block_type == 0) {
1159
365k
    block_type = ringbuffer[0];
1160
365k
  } else {
1161
47.0k
    block_type -= 2;
1162
47.0k
  }
1163
476k
  if (block_type >= max_block_type) {
1164
17.6k
    block_type -= max_block_type;
1165
17.6k
  }
1166
476k
  ringbuffer[0] = ringbuffer[1];
1167
476k
  ringbuffer[1] = block_type;
1168
476k
  return BROTLI_TRUE;
1169
476k
}
1170
1171
static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
1172
6.36k
    BrotliDecoderState* s) {
1173
6.36k
  size_t i;
1174
57.3k
  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1175
27.9k
  for (i = 0; i < s->num_block_types[0]; i++) {
1176
21.5k
    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1177
21.5k
    size_t error = 0;
1178
21.5k
    size_t sample = s->context_map[offset];
1179
21.5k
    size_t j;
1180
366k
    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1181
      /* NOLINTNEXTLINE(bugprone-macro-repeated-side-effects) */
1182
345k
      BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
1183
345k
    }
1184
21.5k
    if (error == 0) {
1185
17.6k
      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1186
17.6k
    }
1187
21.5k
  }
1188
6.36k
}
1189
1190
59.5k
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1191
59.5k
  uint8_t context_mode;
1192
59.5k
  size_t trivial;
1193
59.5k
  brotli_reg_t block_type = s->block_type_rb[1];
1194
59.5k
  brotli_reg_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1195
59.5k
  s->context_map_slice = s->context_map + context_offset;
1196
59.5k
  trivial = s->trivial_literal_contexts[block_type >> 5];
1197
59.5k
  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1198
59.5k
  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1199
59.5k
  context_mode = s->context_modes[block_type] & 3;
1200
59.5k
  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
1201
59.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
53.4k
    int safe, BrotliDecoderState* s) {
1207
53.4k
  if (!DecodeBlockTypeAndLength(safe, s, 0)) {
1208
57
    return BROTLI_FALSE;
1209
57
  }
1210
53.4k
  PrepareLiteralDecoding(s);
1211
53.4k
  return BROTLI_TRUE;
1212
53.4k
}
1213
1214
50.2k
static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1215
50.2k
  DecodeLiteralBlockSwitchInternal(0, s);
1216
50.2k
}
1217
1218
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch(
1219
3.20k
    BrotliDecoderState* s) {
1220
3.20k
  return DecodeLiteralBlockSwitchInternal(1, s);
1221
3.20k
}
1222
1223
/* Block switch for insert/copy length.
1224
   Reads 3..54 bits. */
1225
static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal(
1226
394k
    int safe, BrotliDecoderState* s) {
1227
394k
  if (!DecodeBlockTypeAndLength(safe, s, 1)) {
1228
37
    return BROTLI_FALSE;
1229
37
  }
1230
394k
  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
1231
394k
  return BROTLI_TRUE;
1232
394k
}
1233
1234
392k
static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1235
392k
  DecodeCommandBlockSwitchInternal(0, s);
1236
392k
}
1237
1238
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch(
1239
2.10k
    BrotliDecoderState* s) {
1240
2.10k
  return DecodeCommandBlockSwitchInternal(1, s);
1241
2.10k
}
1242
1243
/* Block switch for distance codes.
1244
   Reads 3..54 bits. */
1245
static BROTLI_INLINE BROTLI_BOOL DecodeDistanceBlockSwitchInternal(
1246
28.2k
    int safe, BrotliDecoderState* s) {
1247
28.2k
  if (!DecodeBlockTypeAndLength(safe, s, 2)) {
1248
35
    return BROTLI_FALSE;
1249
35
  }
1250
28.2k
  s->dist_context_map_slice = s->dist_context_map +
1251
28.2k
      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
1252
28.2k
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1253
28.2k
  return BROTLI_TRUE;
1254
28.2k
}
1255
1256
25.9k
static void BROTLI_NOINLINE DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
1257
25.9k
  DecodeDistanceBlockSwitchInternal(0, s);
1258
25.9k
}
1259
1260
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
1261
2.34k
    BrotliDecoderState* s) {
1262
2.34k
  return DecodeDistanceBlockSwitchInternal(1, s);
1263
2.34k
}
1264
1265
12.4k
static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
1266
12.4k
  size_t pos = wrap && s->pos > s->ringbuffer_size ?
1267
11.1k
      (size_t)s->ringbuffer_size : (size_t)(s->pos);
1268
12.4k
  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
1269
12.4k
  return partial_pos_rb - s->partial_pos_out;
1270
12.4k
}
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
12.4k
    size_t* total_out, BROTLI_BOOL force) {
1278
12.4k
  uint8_t* start =
1279
12.4k
      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
1280
12.4k
  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1281
12.4k
  size_t num_written = *available_out;
1282
12.4k
  if (num_written > to_write) {
1283
11.2k
    num_written = to_write;
1284
11.2k
  }
1285
12.4k
  if (s->meta_block_remaining_len < 0) {
1286
99
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
1287
99
  }
1288
12.3k
  if (next_out && !*next_out) {
1289
0
    *next_out = start;
1290
12.3k
  } else {
1291
12.3k
    if (next_out) {
1292
12.3k
      memcpy(*next_out, start, num_written);
1293
12.3k
      *next_out += num_written;
1294
12.3k
    }
1295
12.3k
  }
1296
12.3k
  *available_out -= num_written;
1297
12.3k
  BROTLI_LOG_UINT(to_write);
1298
12.3k
  BROTLI_LOG_UINT(num_written);
1299
12.3k
  s->partial_pos_out += num_written;
1300
12.3k
  if (total_out) {
1301
12.3k
    *total_out = s->partial_pos_out;
1302
12.3k
  }
1303
12.3k
  if (num_written < to_write) {
1304
456
    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
1305
451
      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
1306
451
    } else {
1307
5
      return BROTLI_DECODER_SUCCESS;
1308
5
    }
1309
456
  }
1310
  /* Wrap ring buffer only if it has reached its maximal size. */
1311
11.8k
  if (s->ringbuffer_size == (1 << s->window_bits) &&
1312
11.1k
      s->pos >= s->ringbuffer_size) {
1313
10.9k
    s->pos -= s->ringbuffer_size;
1314
10.9k
    s->rb_roundtrips++;
1315
10.9k
    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1316
10.9k
  }
1317
11.8k
  return BROTLI_DECODER_SUCCESS;
1318
12.3k
}
1319
1320
10.9k
static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1321
10.9k
  if (s->should_wrap_ringbuffer) {
1322
1.32k
    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1323
1.32k
    s->should_wrap_ringbuffer = 0;
1324
1.32k
  }
1325
10.9k
}
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.4k
    return BROTLI_TRUE;
1339
12.4k
  }
1340
1341
2.04k
  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
1342
2.04k
      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
1343
2.04k
  if (s->ringbuffer == 0) {
1344
    /* Restore previous value. */
1345
0
    s->ringbuffer = old_ringbuffer;
1346
0
    return BROTLI_FALSE;
1347
0
  }
1348
2.04k
  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1349
2.04k
  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
1350
1351
2.04k
  if (!!old_ringbuffer) {
1352
187
    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1353
187
    BROTLI_DECODER_FREE(s, old_ringbuffer);
1354
187
  }
1355
1356
2.04k
  s->ringbuffer_size = s->new_ringbuffer_size;
1357
2.04k
  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1358
2.04k
  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1359
1360
2.04k
  return BROTLI_TRUE;
1361
2.04k
}
1362
1363
static BrotliDecoderErrorCode BROTLI_NOINLINE
1364
53.2k
SkipMetadataBlock(BrotliDecoderState* s) {
1365
53.2k
  BrotliBitReader* br = &s->br;
1366
1367
53.2k
  if (s->meta_block_remaining_len == 0) {
1368
41.5k
    return BROTLI_DECODER_SUCCESS;
1369
41.5k
  }
1370
1371
11.6k
  BROTLI_DCHECK((BrotliGetAvailableBits(br) & 7) == 0);
1372
1373
  /* Drain accumulator. */
1374
11.6k
  if (BrotliGetAvailableBits(br) >= 8) {
1375
2.11k
    uint8_t buffer[8];
1376
2.11k
    int nbytes = (int)(BrotliGetAvailableBits(br)) >> 3;
1377
2.11k
    BROTLI_DCHECK(nbytes <= 8);
1378
2.11k
    if (nbytes > s->meta_block_remaining_len) {
1379
554
      nbytes = s->meta_block_remaining_len;
1380
554
    }
1381
2.11k
    BrotliCopyBytes(buffer, br, (size_t)nbytes);
1382
2.11k
    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.11k
    s->meta_block_remaining_len -= nbytes;
1387
2.11k
    if (s->meta_block_remaining_len == 0) {
1388
852
      return BROTLI_DECODER_SUCCESS;
1389
852
    }
1390
2.11k
  }
1391
1392
  /* Direct access to metadata is possible. */
1393
10.7k
  int nbytes = (int)BrotliGetRemainingBytes(br);
1394
10.7k
  if (nbytes > s->meta_block_remaining_len) {
1395
10.7k
    nbytes = s->meta_block_remaining_len;
1396
10.7k
  }
1397
10.7k
  if (nbytes > 0) {
1398
10.7k
    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
10.7k
    BrotliDropBytes(br, (size_t)nbytes);
1403
10.7k
    s->meta_block_remaining_len -= nbytes;
1404
10.7k
    if (s->meta_block_remaining_len == 0) {
1405
10.7k
      return BROTLI_DECODER_SUCCESS;
1406
10.7k
    }
1407
10.7k
  }
1408
1409
50
  BROTLI_DCHECK(BrotliGetRemainingBytes(br) == 0);
1410
1411
50
  return BROTLI_DECODER_NEEDS_MORE_INPUT;
1412
10.7k
}
1413
1414
static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1415
    size_t* available_out, uint8_t** next_out, size_t* total_out,
1416
8.39k
    BrotliDecoderState* s) {
1417
  /* TODO(eustas): avoid allocation for single uncompressed block. */
1418
8.39k
  if (!BrotliEnsureRingBuffer(s)) {
1419
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
1420
0
  }
1421
1422
  /* State machine */
1423
8.42k
  for (;;) {
1424
8.42k
    switch (s->substate_uncompressed) {
1425
8.42k
      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1426
8.42k
        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1427
8.42k
        if (nbytes > s->meta_block_remaining_len) {
1428
8.34k
          nbytes = s->meta_block_remaining_len;
1429
8.34k
        }
1430
8.42k
        if (s->pos + nbytes > s->ringbuffer_size) {
1431
31
          nbytes = s->ringbuffer_size - s->pos;
1432
31
        }
1433
        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1434
8.42k
        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1435
8.42k
        s->pos += nbytes;
1436
8.42k
        s->meta_block_remaining_len -= nbytes;
1437
8.42k
        if (s->pos < 1 << s->window_bits) {
1438
8.39k
          if (s->meta_block_remaining_len == 0) {
1439
8.34k
            return BROTLI_DECODER_SUCCESS;
1440
8.34k
          }
1441
52
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
1442
8.39k
        }
1443
31
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1444
31
      }
1445
      /* Fall through. */
1446
1447
31
      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1448
31
        BrotliDecoderErrorCode result;
1449
31
        result = WriteRingBuffer(
1450
31
            s, available_out, next_out, total_out, BROTLI_FALSE);
1451
31
        if (result != BROTLI_DECODER_SUCCESS) {
1452
1
          return result;
1453
1
        }
1454
30
        if (s->ringbuffer_size == 1 << s->window_bits) {
1455
30
          s->max_distance = s->max_backward_distance;
1456
30
        }
1457
30
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1458
30
        break;
1459
31
      }
1460
8.42k
    }
1461
8.42k
  }
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
19.0k
static int GetCompoundDictionarySize(BrotliDecoderState* s) {
1526
19.0k
  return s->compound_dictionary ? s->compound_dictionary->total_size : 0;
1527
19.0k
}
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
904
    return;
1592
904
  }
1593
1594
  /* Metadata blocks does not touch ring buffer. */
1595
14.1k
  if (s->is_metadata) {
1596
0
    return;
1597
0
  }
1598
1599
14.1k
  if (!s->ringbuffer) {
1600
2.30k
    output_size = 0;
1601
11.7k
  } else {
1602
11.7k
    output_size = s->pos;
1603
11.7k
  }
1604
14.1k
  output_size += s->meta_block_remaining_len;
1605
14.1k
  min_size = min_size < output_size ? output_size : min_size;
1606
1607
14.1k
  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
77.9k
    while ((new_ringbuffer_size >> 1) >= min_size) {
1612
63.8k
      new_ringbuffer_size >>= 1;
1613
63.8k
    }
1614
14.1k
  }
1615
1616
14.1k
  s->new_ringbuffer_size = new_ringbuffer_size;
1617
14.1k
}
1618
1619
/* Reads 1..256 2-bit context modes. */
1620
6.44k
static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1621
6.44k
  BrotliBitReader* br = &s->br;
1622
6.44k
  int i = s->loop_counter;
1623
1624
28.6k
  while (i < (int)s->num_block_types[0]) {
1625
22.1k
    brotli_reg_t bits;
1626
22.1k
    if (!BrotliSafeReadBits(br, 2, &bits)) {
1627
10
      s->loop_counter = i;
1628
10
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1629
10
    }
1630
22.1k
    s->context_modes[i] = (uint8_t)bits;
1631
22.1k
    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1632
22.1k
    i++;
1633
22.1k
  }
1634
6.43k
  return BROTLI_DECODER_SUCCESS;
1635
6.44k
}
1636
1637
12.1M
static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1638
12.1M
  int offset = s->distance_code - 3;
1639
12.1M
  if (s->distance_code <= 3) {
1640
    /* Compensate double distance-ring-buffer roll for dictionary items. */
1641
7.38M
    s->distance_context = 1 >> s->distance_code;
1642
7.38M
    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
1643
7.38M
    s->dist_rb_idx -= s->distance_context;
1644
7.38M
  } else {
1645
4.75M
    int index_delta = 3;
1646
4.75M
    int delta;
1647
4.75M
    int base = s->distance_code - 10;
1648
4.75M
    if (s->distance_code < 10) {
1649
3.98M
      base = s->distance_code - 4;
1650
3.98M
    } else {
1651
765k
      index_delta = 2;
1652
765k
    }
1653
    /* Unpack one of six 4-bit values. */
1654
4.75M
    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
1655
4.75M
    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
1656
4.75M
    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
26
      s->distance_code = 0x7FFFFFFF;
1660
26
    }
1661
4.75M
  }
1662
12.1M
}
1663
1664
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1665
42.6M
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1666
42.6M
  if (n_bits != 0) {
1667
11.5k
    return BrotliSafeReadBits(br, n_bits, val);
1668
42.6M
  } else {
1669
42.6M
    *val = 0;
1670
42.6M
    return BROTLI_TRUE;
1671
42.6M
  }
1672
42.6M
}
1673
1674
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
1675
12.1M
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1676
12.1M
  if (n_bits != 0) {
1677
3.92k
    return BrotliSafeReadBits32(br, n_bits, val);
1678
12.1M
  } else {
1679
12.1M
    *val = 0;
1680
12.1M
    return BROTLI_TRUE;
1681
12.1M
  }
1682
12.1M
}
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
6.08k
static void CalculateDistanceLut(BrotliDecoderState* s) {
1752
6.08k
  BrotliMetablockBodyArena* b = &s->arena.body;
1753
6.08k
  brotli_reg_t npostfix = s->distance_postfix_bits;
1754
6.08k
  brotli_reg_t ndirect = s->num_direct_distance_codes;
1755
6.08k
  brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
1756
6.08k
  brotli_reg_t postfix = 1u << npostfix;
1757
6.08k
  brotli_reg_t j;
1758
6.08k
  brotli_reg_t bits = 1;
1759
6.08k
  brotli_reg_t half = 0;
1760
1761
  /* Skip short codes. */
1762
6.08k
  brotli_reg_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
1763
1764
  /* Fill direct codes. */
1765
50.2k
  for (j = 0; j < ndirect; ++j) {
1766
44.1k
    b->dist_extra_bits[i] = 0;
1767
44.1k
    b->dist_offset[i] = j + 1;
1768
44.1k
    ++i;
1769
44.1k
  }
1770
1771
  /* Fill regular distance codes. */
1772
298k
  while (i < alphabet_size_limit) {
1773
292k
    brotli_reg_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
1774
    /* Always fill the complete group. */
1775
788k
    for (j = 0; j < postfix; ++j) {
1776
496k
      b->dist_extra_bits[i] = (uint8_t)bits;
1777
496k
      b->dist_offset[i] = base + j;
1778
496k
      ++i;
1779
496k
    }
1780
292k
    bits = bits + half;
1781
292k
    half = half ^ 1;
1782
292k
  }
1783
6.08k
}
1784
1785
/* Precondition: s->distance_code < 0. */
1786
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
1787
33.3M
    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1788
33.3M
  BrotliMetablockBodyArena* b = &s->arena.body;
1789
33.3M
  brotli_reg_t code;
1790
33.3M
  brotli_reg_t bits;
1791
33.3M
  BrotliBitReaderState memento;
1792
33.3M
  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1793
33.3M
  if (!safe) {
1794
13.1M
    code = ReadSymbol(distance_tree, br);
1795
20.1M
  } else {
1796
20.1M
    BrotliBitReaderSaveState(br, &memento);
1797
20.1M
    if (!SafeReadSymbol(distance_tree, br, &code)) {
1798
26
      return BROTLI_FALSE;
1799
26
    }
1800
20.1M
  }
1801
33.3M
  --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
33.3M
  s->distance_context = 0;
1805
33.3M
  if ((code & ~0xFu) == 0) {
1806
12.1M
    s->distance_code = (int)code;
1807
12.1M
    TakeDistanceFromRingBuffer(s);
1808
12.1M
    return BROTLI_TRUE;
1809
12.1M
  }
1810
21.1M
  if (!safe) {
1811
9.02M
    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
1812
12.1M
  } else {
1813
12.1M
    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
1814
142
      ++s->block_length[2];
1815
142
      BrotliBitReaderRestoreState(br, &memento);
1816
142
      return BROTLI_FALSE;
1817
142
    }
1818
12.1M
  }
1819
21.1M
  s->distance_code =
1820
21.1M
      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
1821
21.1M
  return BROTLI_TRUE;
1822
21.1M
}
1823
1824
static BROTLI_INLINE void ReadDistance(
1825
13.1M
    BrotliDecoderState* s, BrotliBitReader* br) {
1826
13.1M
  ReadDistanceInternal(0, s, br);
1827
13.1M
}
1828
1829
static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
1830
20.1M
    BrotliDecoderState* s, BrotliBitReader* br) {
1831
20.1M
  return ReadDistanceInternal(1, s, br);
1832
20.1M
}
1833
1834
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
1835
54.3M
    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1836
54.3M
  brotli_reg_t cmd_code;
1837
54.3M
  brotli_reg_t insert_len_extra = 0;
1838
54.3M
  brotli_reg_t copy_length;
1839
54.3M
  CmdLutElement v;
1840
54.3M
  BrotliBitReaderState memento;
1841
54.3M
  if (!safe) {
1842
33.0M
    cmd_code = ReadSymbol(s->htree_command, br);
1843
33.0M
  } else {
1844
21.3M
    BrotliBitReaderSaveState(br, &memento);
1845
21.3M
    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
1846
51
      return BROTLI_FALSE;
1847
51
    }
1848
21.3M
  }
1849
54.3M
  v = kCmdLut[cmd_code];
1850
54.3M
  s->distance_code = v.distance_code;
1851
54.3M
  s->distance_context = v.context;
1852
54.3M
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1853
54.3M
  *insert_length = v.insert_len_offset;
1854
54.3M
  if (!safe) {
1855
33.0M
    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1856
168k
      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
1857
168k
    }
1858
33.0M
    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
1859
33.0M
  } else {
1860
21.3M
    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1861
21.3M
        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1862
141
      BrotliBitReaderRestoreState(br, &memento);
1863
141
      return BROTLI_FALSE;
1864
141
    }
1865
21.3M
  }
1866
54.3M
  s->copy_length = (int)copy_length + v.copy_len_offset;
1867
54.3M
  --s->block_length[1];
1868
54.3M
  *insert_length += (int)insert_len_extra;
1869
54.3M
  return BROTLI_TRUE;
1870
54.3M
}
1871
1872
static BROTLI_INLINE void ReadCommand(
1873
33.0M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1874
33.0M
  ReadCommandInternal(0, s, br, insert_length);
1875
33.0M
}
1876
1877
static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
1878
21.3M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1879
21.3M
  return ReadCommandInternal(1, s, br, insert_length);
1880
21.3M
}
1881
1882
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
1883
526M
    int safe, BrotliBitReader* const br) {
1884
526M
  if (safe) {
1885
354M
    return BROTLI_TRUE;
1886
354M
  }
1887
171M
  return BrotliCheckInputAmount(br);
1888
526M
}
1889
1890
#define BROTLI_SAFE(METHOD)                       \
1891
88.1M
  {                                               \
1892
88.1M
    if (safe) {                                   \
1893
41.5M
      if (!Safe##METHOD) {                        \
1894
489
        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
1895
489
        goto saveStateAndReturn;                  \
1896
489
      }                                           \
1897
46.6M
    } else {                                      \
1898
46.6M
      METHOD;                                     \
1899
46.6M
    }                                             \
1900
88.1M
  }
1901
1902
static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
1903
19.0k
    int safe, BrotliDecoderState* s) {
1904
19.0k
  int pos = s->pos;
1905
19.0k
  int i = s->loop_counter;
1906
19.0k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1907
19.0k
  BrotliBitReader* br = &s->br;
1908
19.0k
  int compound_dictionary_size = GetCompoundDictionarySize(s);
1909
1910
19.0k
  if (!CheckInputAmount(safe, br)) {
1911
1.16k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1912
1.16k
    goto saveStateAndReturn;
1913
1.16k
  }
1914
17.8k
  if (!safe) {
1915
15.8k
    BROTLI_UNUSED(BrotliWarmupBitReader(br));
1916
15.8k
  }
1917
1918
  /* Jump into state machine. */
1919
17.8k
  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
1920
7.85k
    goto CommandBegin;
1921
10.0k
  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
1922
2.70k
    goto CommandInner;
1923
7.32k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
1924
1.36k
    goto CommandPostDecodeLiterals;
1925
5.96k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
1926
5.96k
    goto CommandPostWrapCopy;
1927
5.96k
  } else {
1928
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1929
0
  }
1930
1931
54.7M
CommandBegin:
1932
54.7M
  if (safe) {
1933
21.3M
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1934
21.3M
  }
1935
54.7M
  if (!CheckInputAmount(safe, br)) {
1936
285
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1937
285
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1938
285
    goto saveStateAndReturn;
1939
285
  }
1940
54.7M
  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
1941
394k
    BROTLI_SAFE(DecodeCommandBlockSwitch(s));
1942
394k
    goto CommandBegin;
1943
394k
  }
1944
  /* Read the insert/copy length in the command. */
1945
54.3M
  BROTLI_SAFE(ReadCommand(s, br, &i));
1946
54.3M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
1947
54.3M
              pos, i, s->copy_length));
1948
54.3M
  if (i == 0) {
1949
8.44M
    goto CommandPostDecodeLiterals;
1950
8.44M
  }
1951
45.9M
  s->meta_block_remaining_len -= i;
1952
1953
45.9M
CommandInner:
1954
45.9M
  if (safe) {
1955
20.1M
    s->state = BROTLI_STATE_COMMAND_INNER;
1956
20.1M
  }
1957
  /* Read the literals in the command. */
1958
45.9M
  if (s->trivial_literal_context) {
1959
40.8M
    brotli_reg_t bits;
1960
40.8M
    brotli_reg_t value;
1961
40.8M
    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
1962
458M
    do {
1963
458M
      if (!CheckInputAmount(safe, br)) {
1964
256
        s->state = BROTLI_STATE_COMMAND_INNER;
1965
256
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1966
256
        goto saveStateAndReturn;
1967
256
      }
1968
458M
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
1969
21.0k
        goto NextLiteralBlock;
1970
21.0k
      }
1971
458M
      if (!safe) {
1972
125M
        s->ringbuffer[pos] =
1973
125M
            (uint8_t)ReadPreloadedSymbol(s->literal_htree, br, &bits, &value);
1974
333M
      } else {
1975
333M
        brotli_reg_t literal;
1976
333M
        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
1977
45
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1978
45
          goto saveStateAndReturn;
1979
45
        }
1980
333M
        s->ringbuffer[pos] = (uint8_t)literal;
1981
333M
      }
1982
458M
      --s->block_length[0];
1983
458M
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
1984
458M
      ++pos;
1985
458M
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
1986
2.87k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
1987
2.87k
        --i;
1988
2.87k
        goto saveStateAndReturn;
1989
2.87k
      }
1990
458M
    } while (--i != 0);
1991
40.8M
  } else {
1992
5.18M
    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
1993
5.18M
    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
1994
13.2M
    do {
1995
13.2M
      const HuffmanCode* hc;
1996
13.2M
      uint8_t context;
1997
13.2M
      if (!CheckInputAmount(safe, br)) {
1998
296
        s->state = BROTLI_STATE_COMMAND_INNER;
1999
296
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2000
296
        goto saveStateAndReturn;
2001
296
      }
2002
13.2M
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2003
32.4k
        goto NextLiteralBlock;
2004
32.4k
      }
2005
13.2M
      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
2006
13.2M
      BROTLI_LOG_UINT(context);
2007
13.2M
      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
2008
13.2M
      p2 = p1;
2009
13.2M
      if (!safe) {
2010
13.0M
        p1 = (uint8_t)ReadSymbol(hc, br);
2011
13.0M
      } else {
2012
258k
        brotli_reg_t literal;
2013
258k
        if (!SafeReadSymbol(hc, br, &literal)) {
2014
37
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2015
37
          goto saveStateAndReturn;
2016
37
        }
2017
258k
        p1 = (uint8_t)literal;
2018
258k
      }
2019
13.2M
      s->ringbuffer[pos] = p1;
2020
13.2M
      --s->block_length[0];
2021
13.2M
      BROTLI_LOG_UINT(s->context_map_slice[context]);
2022
13.2M
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
2023
13.2M
      ++pos;
2024
13.2M
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2025
683
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2026
683
        --i;
2027
683
        goto saveStateAndReturn;
2028
683
      }
2029
13.2M
    } while (--i != 0);
2030
5.18M
  }
2031
45.9M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2032
45.9M
  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
2033
2.07k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2034
2.07k
    goto saveStateAndReturn;
2035
2.07k
  }
2036
2037
54.3M
CommandPostDecodeLiterals:
2038
54.3M
  if (safe) {
2039
21.3M
    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2040
21.3M
  }
2041
54.3M
  if (s->distance_code >= 0) {
2042
    /* Implicit distance case. */
2043
21.0M
    s->distance_context = s->distance_code ? 0 : 1;
2044
21.0M
    --s->dist_rb_idx;
2045
21.0M
    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
2046
33.3M
  } else {
2047
    /* Read distance code in the command, unless it was implicitly zero. */
2048
33.3M
    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
2049
28.2k
      BROTLI_SAFE(DecodeDistanceBlockSwitch(s));
2050
28.2k
    }
2051
33.3M
    BROTLI_SAFE(ReadDistance(s, br));
2052
33.3M
  }
2053
54.3M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
2054
54.3M
              pos, s->distance_code));
2055
54.3M
  if (s->max_distance != s->max_backward_distance) {
2056
53.2M
    s->max_distance =
2057
53.2M
        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
2058
53.2M
  }
2059
54.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
54.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
194k
    if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
2067
26
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2068
26
          "len: %d bytes left: %d\n",
2069
26
          pos, s->distance_code, i, s->meta_block_remaining_len));
2070
26
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
2071
26
    }
2072
194k
    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
194k
    } else if (i >= SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
2084
194k
               i <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
2085
194k
      uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2086
194k
      uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2087
194k
      uint8_t dict_id = s->dictionary->context_based ?
2088
0
          s->dictionary->context_map[BROTLI_CONTEXT(p1, p2, s->context_lookup)]
2089
194k
          : 0;
2090
194k
      const BrotliDictionary* words = s->dictionary->words[dict_id];
2091
194k
      const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
2092
194k
      int offset = (int)words->offsets_by_length[i];
2093
194k
      brotli_reg_t shift = words->size_bits_by_length[i];
2094
194k
      int address =
2095
194k
          s->distance_code - s->max_distance - 1 - compound_dictionary_size;
2096
194k
      int mask = (int)BitMask(shift);
2097
194k
      int word_idx = address & mask;
2098
194k
      int transform_idx = address >> shift;
2099
      /* Compensate double distance-ring-buffer roll. */
2100
194k
      s->dist_rb_idx += s->distance_context;
2101
194k
      offset += word_idx * i;
2102
      /* If the distance is out of bound, select a next static dictionary if
2103
         there exist multiple. */
2104
194k
      if ((transform_idx >= (int)transforms->num_transforms ||
2105
194k
          words->size_bits_by_length[i] == 0) &&
2106
107
          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
194k
      if (BROTLI_PREDICT_FALSE(words->size_bits_by_length[i] == 0)) {
2136
33
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2137
33
            "len: %d bytes left: %d\n",
2138
33
            pos, s->distance_code, i, s->meta_block_remaining_len));
2139
33
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2140
33
      }
2141
194k
      if (BROTLI_PREDICT_FALSE(!words->data)) {
2142
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
2143
0
      }
2144
194k
      if (transform_idx < (int)transforms->num_transforms) {
2145
194k
        const uint8_t* word = &words->data[offset];
2146
194k
        int len = i;
2147
194k
        if (transform_idx == transforms->cutOffTransforms[0]) {
2148
95.7k
          memcpy(&s->ringbuffer[pos], word, (size_t)len);
2149
95.7k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
2150
95.7k
                      len, word));
2151
99.0k
        } else {
2152
99.0k
          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
2153
99.0k
              transforms, transform_idx);
2154
99.0k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
2155
99.0k
                      " transform_idx = %d, transformed: [%.*s]\n",
2156
99.0k
                      i, word, transform_idx, len, &s->ringbuffer[pos]));
2157
99.0k
          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
99.0k
        }
2162
194k
        pos += len;
2163
194k
        s->meta_block_remaining_len -= len;
2164
194k
        if (pos >= s->ringbuffer_size) {
2165
1.49k
          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
2166
1.49k
          goto saveStateAndReturn;
2167
1.49k
        }
2168
194k
      } else {
2169
74
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2170
74
            "len: %d bytes left: %d\n",
2171
74
            pos, s->distance_code, i, s->meta_block_remaining_len));
2172
74
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
2173
74
      }
2174
194k
    } else {
2175
64
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2176
64
          "len: %d bytes left: %d\n",
2177
64
          pos, s->distance_code, i, s->meta_block_remaining_len));
2178
64
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2179
64
    }
2180
54.1M
  } else {
2181
54.1M
    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
2182
54.1M
    uint8_t* copy_dst = &s->ringbuffer[pos];
2183
54.1M
    uint8_t* copy_src = &s->ringbuffer[src_start];
2184
54.1M
    int dst_end = pos + i;
2185
54.1M
    int src_end = src_start + i;
2186
    /* Update the recent distances cache. */
2187
54.1M
    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
2188
54.1M
    ++s->dist_rb_idx;
2189
54.1M
    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
54.1M
    memmove16(copy_dst, copy_src);
2194
54.1M
    if (src_end > pos && dst_end > src_start) {
2195
      /* Regions intersect. */
2196
4.40M
      goto CommandPostWrapCopy;
2197
4.40M
    }
2198
49.7M
    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
2199
      /* At least one region wraps. */
2200
6.08k
      goto CommandPostWrapCopy;
2201
6.08k
    }
2202
49.7M
    pos += i;
2203
49.7M
    if (i > 16) {
2204
55.8k
      if (i > 32) {
2205
33.3k
        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
2206
33.3k
      } else {
2207
        /* This branch covers about 45% cases.
2208
           Fixed size short copy allows more compiler optimizations. */
2209
22.5k
        memmove16(copy_dst + 16, copy_src + 16);
2210
22.5k
      }
2211
55.8k
    }
2212
49.7M
  }
2213
49.9M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2214
49.9M
  if (s->meta_block_remaining_len <= 0) {
2215
    /* Next metablock, if any. */
2216
1.88k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2217
1.88k
    goto saveStateAndReturn;
2218
49.9M
  } else {
2219
49.9M
    goto CommandBegin;
2220
49.9M
  }
2221
4.41M
CommandPostWrapCopy:
2222
4.41M
  {
2223
4.41M
    int wrap_guard = s->ringbuffer_size - pos;
2224
981M
    while (--i >= 0) {
2225
976M
      s->ringbuffer[pos] =
2226
976M
          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
2227
976M
      ++pos;
2228
976M
      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
2229
6.04k
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
2230
6.04k
        goto saveStateAndReturn;
2231
6.04k
      }
2232
976M
    }
2233
4.41M
  }
2234
4.41M
  if (s->meta_block_remaining_len <= 0) {
2235
    /* Next metablock, if any. */
2236
1.21k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2237
1.21k
    goto saveStateAndReturn;
2238
4.41M
  } else {
2239
4.41M
    goto CommandBegin;
2240
4.41M
  }
2241
2242
53.4k
NextLiteralBlock:
2243
53.4k
  BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
2244
53.4k
  goto CommandInner;
2245
2246
18.8k
saveStateAndReturn:
2247
18.8k
  s->pos = pos;
2248
18.8k
  s->loop_counter = i;
2249
18.8k
  return result;
2250
53.4k
}
2251
2252
#undef BROTLI_SAFE
2253
2254
static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
2255
17.0k
    BrotliDecoderState* s) {
2256
17.0k
  return ProcessCommandsInternal(0, s);
2257
17.0k
}
2258
2259
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
2260
1.99k
    BrotliDecoderState* s) {
2261
1.99k
  return ProcessCommandsInternal(1, s);
2262
1.99k
}
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.80k
    uint8_t decoded_buffer[BROTLI_ARRAY_PARAM(*decoded_size)]) {
2269
2.80k
  BrotliDecoderState s;
2270
2.80k
  BrotliDecoderResult result;
2271
2.80k
  size_t total_out = 0;
2272
2.80k
  size_t available_in = encoded_size;
2273
2.80k
  const uint8_t* next_in = encoded_buffer;
2274
2.80k
  size_t available_out = *decoded_size;
2275
2.80k
  uint8_t* next_out = decoded_buffer;
2276
2.80k
  if (!BrotliDecoderStateInit(&s, 0, 0, 0)) {
2277
0
    return BROTLI_DECODER_RESULT_ERROR;
2278
0
  }
2279
2.80k
  result = BrotliDecoderDecompressStream(
2280
2.80k
      &s, &available_in, &next_in, &available_out, &next_out, &total_out);
2281
2.80k
  *decoded_size = total_out;
2282
2.80k
  BrotliDecoderStateCleanup(&s);
2283
2.80k
  if (result != BROTLI_DECODER_RESULT_SUCCESS) {
2284
2.16k
    result = BROTLI_DECODER_RESULT_ERROR;
2285
2.16k
  }
2286
2.80k
  return result;
2287
2.80k
}
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.80k
    size_t* available_out, uint8_t** next_out, size_t* total_out) {
2303
2.80k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2304
2.80k
  BrotliBitReader* br = &s->br;
2305
2.80k
  size_t input_size = *available_in;
2306
2.80k
#define BROTLI_SAVE_ERROR_CODE(code) \
2307
2.80k
    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.80k
  if (total_out) {
2310
2.80k
    *total_out = s->partial_pos_out;
2311
2.80k
  }
2312
  /* Do not try to process further in a case of unrecoverable error. */
2313
2.80k
  if ((int)s->error_code < 0) {
2314
0
    return BROTLI_DECODER_RESULT_ERROR;
2315
0
  }
2316
2.80k
  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.80k
  if (!*available_out) next_out = 0;
2321
2.80k
  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
2322
2.80k
    BrotliBitReaderSetInput(br, *next_in, *available_in);
2323
2.80k
  } 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
262k
  for (;;) {
2332
262k
    if (result != BROTLI_DECODER_SUCCESS) {
2333
      /* Error, needs more input/output. */
2334
2.16k
      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2335
1.32k
        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
2336
678
          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
2337
678
              available_out, next_out, total_out, BROTLI_TRUE);
2338
          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
2339
678
          if ((int)intermediate_result < 0) {
2340
24
            result = intermediate_result;
2341
24
            break;
2342
24
          }
2343
678
        }
2344
1.30k
        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.30k
        } else {  /* Input stream doesn't contain enough input. */
2370
          /* Copy tail to internal buffer and return. */
2371
1.30k
          *next_in = br->next_in;
2372
1.30k
          *available_in = BrotliBitReaderGetAvailIn(br);
2373
1.34k
          while (*available_in) {
2374
46
            s->buffer.u8[s->buffer_length] = **next_in;
2375
46
            s->buffer_length++;
2376
46
            (*next_in)++;
2377
46
            (*available_in)--;
2378
46
          }
2379
1.30k
          break;
2380
1.30k
        }
2381
        /* Unreachable. */
2382
1.30k
      }
2383
2384
      /* Fail or needs more output. */
2385
2386
833
      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
833
      } 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
833
        BrotliBitReaderUnload(br);
2395
833
        *available_in = BrotliBitReaderGetAvailIn(br);
2396
833
        *next_in = br->next_in;
2397
833
      }
2398
833
      break;
2399
2.16k
    }
2400
260k
    switch (s->state) {
2401
2.80k
      case BROTLI_STATE_UNINITED:
2402
        /* Prepare to the first read. */
2403
2.80k
        if (!BrotliWarmupBitReader(br)) {
2404
310
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2405
310
          break;
2406
310
        }
2407
        /* Decode window size. */
2408
2.49k
        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
2409
2.49k
        if (result != BROTLI_DECODER_SUCCESS) {
2410
2
          break;
2411
2
        }
2412
2.48k
        if (s->large_window) {
2413
0
          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
2414
0
          break;
2415
0
        }
2416
2.48k
        s->state = BROTLI_STATE_INITIALIZE;
2417
2.48k
        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.48k
      case BROTLI_STATE_INITIALIZE:
2436
2.48k
        BROTLI_LOG_UINT(s->window_bits);
2437
        /* Maximum distance, see section 9.1. of the spec. */
2438
2.48k
        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.48k
        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
2442
2.48k
            sizeof(HuffmanCode) * 3 *
2443
2.48k
                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2444
2.48k
        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.48k
        s->block_len_trees =
2449
2.48k
            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
2450
2451
2.48k
        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2452
      /* Fall through. */
2453
2454
68.4k
      case BROTLI_STATE_METABLOCK_BEGIN:
2455
68.4k
        BrotliDecoderStateMetablockBegin(s);
2456
68.4k
        BROTLI_LOG_UINT(s->pos);
2457
68.4k
        s->state = BROTLI_STATE_METABLOCK_HEADER;
2458
      /* Fall through. */
2459
2460
68.4k
      case BROTLI_STATE_METABLOCK_HEADER:
2461
68.4k
        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
2462
68.4k
        if (result != BROTLI_DECODER_SUCCESS) {
2463
134
          break;
2464
134
        }
2465
68.3k
        BROTLI_LOG_UINT(s->is_last_metablock);
2466
68.3k
        BROTLI_LOG_UINT(s->meta_block_remaining_len);
2467
68.3k
        BROTLI_LOG_UINT(s->is_metadata);
2468
68.3k
        BROTLI_LOG_UINT(s->is_uncompressed);
2469
68.3k
        if (s->is_metadata || s->is_uncompressed) {
2470
61.6k
          if (!BrotliJumpToByteBoundary(br)) {
2471
19
            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
2472
19
            break;
2473
19
          }
2474
61.6k
        }
2475
68.3k
        if (s->is_metadata) {
2476
53.2k
          s->state = BROTLI_STATE_METADATA;
2477
53.2k
          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
53.2k
          break;
2482
53.2k
        }
2483
15.1k
        if (s->meta_block_remaining_len == 0) {
2484
111
          s->state = BROTLI_STATE_METABLOCK_DONE;
2485
111
          break;
2486
111
        }
2487
15.0k
        BrotliCalculateRingBufferSize(s);
2488
15.0k
        if (s->is_uncompressed) {
2489
8.39k
          s->state = BROTLI_STATE_UNCOMPRESSED;
2490
8.39k
          break;
2491
8.39k
        }
2492
6.61k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER;
2493
      /* Fall through. */
2494
2495
6.61k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: {
2496
6.61k
        BrotliMetablockHeaderArena* h = &s->arena.header;
2497
6.61k
        s->loop_counter = 0;
2498
        /* Initialize compressed metablock header arena. */
2499
6.61k
        h->sub_loop_counter = 0;
2500
        /* Make small negative indexes addressable. */
2501
6.61k
        h->symbol_lists =
2502
6.61k
            &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
2503
6.61k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
2504
6.61k
        h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
2505
6.61k
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
2506
6.61k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2507
6.61k
      }
2508
      /* Fall through. */
2509
2510
26.0k
      case BROTLI_STATE_HUFFMAN_CODE_0:
2511
26.0k
        if (s->loop_counter >= 3) {
2512
6.45k
          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
2513
6.45k
          break;
2514
6.45k
        }
2515
        /* Reads 1..11 bits. */
2516
19.6k
        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
2517
19.6k
        if (result != BROTLI_DECODER_SUCCESS) {
2518
10
          break;
2519
10
        }
2520
19.6k
        s->num_block_types[s->loop_counter]++;
2521
19.6k
        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2522
19.6k
        if (s->num_block_types[s->loop_counter] < 2) {
2523
15.2k
          s->loop_counter++;
2524
15.2k
          break;
2525
15.2k
        }
2526
4.32k
        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2527
      /* Fall through. */
2528
2529
4.32k
      case BROTLI_STATE_HUFFMAN_CODE_1: {
2530
4.32k
        brotli_reg_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
2531
4.32k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2532
4.32k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2533
4.32k
            &s->block_type_trees[tree_offset], NULL, s);
2534
4.32k
        if (result != BROTLI_DECODER_SUCCESS) break;
2535
4.24k
        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2536
4.24k
      }
2537
      /* Fall through. */
2538
2539
4.24k
      case BROTLI_STATE_HUFFMAN_CODE_2: {
2540
4.24k
        brotli_reg_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
2541
4.24k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2542
4.24k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2543
4.24k
            &s->block_len_trees[tree_offset], NULL, s);
2544
4.24k
        if (result != BROTLI_DECODER_SUCCESS) break;
2545
4.19k
        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2546
4.19k
      }
2547
      /* Fall through. */
2548
2549
4.19k
      case BROTLI_STATE_HUFFMAN_CODE_3: {
2550
4.19k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2551
4.19k
        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2552
4.19k
            &s->block_len_trees[tree_offset], br)) {
2553
5
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2554
5
          break;
2555
5
        }
2556
4.18k
        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2557
4.18k
        s->loop_counter++;
2558
4.18k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2559
4.18k
        break;
2560
4.19k
      }
2561
2562
8.39k
      case BROTLI_STATE_UNCOMPRESSED: {
2563
8.39k
        result = CopyUncompressedBlockToOutput(
2564
8.39k
            available_out, next_out, total_out, s);
2565
8.39k
        if (result != BROTLI_DECODER_SUCCESS) {
2566
53
          break;
2567
53
        }
2568
8.34k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2569
8.34k
        break;
2570
8.39k
      }
2571
2572
53.2k
      case BROTLI_STATE_METADATA:
2573
53.2k
        result = SkipMetadataBlock(s);
2574
53.2k
        if (result != BROTLI_DECODER_SUCCESS) {
2575
50
          break;
2576
50
        }
2577
53.1k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2578
53.1k
        break;
2579
2580
6.45k
      case BROTLI_STATE_METABLOCK_HEADER_2: {
2581
6.45k
        brotli_reg_t bits;
2582
6.45k
        if (!BrotliSafeReadBits(br, 6, &bits)) {
2583
11
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2584
11
          break;
2585
11
        }
2586
6.44k
        s->distance_postfix_bits = bits & BitMask(2);
2587
6.44k
        bits >>= 2;
2588
6.44k
        s->num_direct_distance_codes = bits << s->distance_postfix_bits;
2589
6.44k
        BROTLI_LOG_UINT(s->num_direct_distance_codes);
2590
6.44k
        BROTLI_LOG_UINT(s->distance_postfix_bits);
2591
6.44k
        s->context_modes =
2592
6.44k
            (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
2593
6.44k
        if (s->context_modes == 0) {
2594
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
2595
0
          break;
2596
0
        }
2597
6.44k
        s->loop_counter = 0;
2598
6.44k
        s->state = BROTLI_STATE_CONTEXT_MODES;
2599
6.44k
      }
2600
      /* Fall through. */
2601
2602
6.44k
      case BROTLI_STATE_CONTEXT_MODES:
2603
6.44k
        result = ReadContextModes(s);
2604
6.44k
        if (result != BROTLI_DECODER_SUCCESS) {
2605
10
          break;
2606
10
        }
2607
6.43k
        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2608
      /* Fall through. */
2609
2610
6.43k
      case BROTLI_STATE_CONTEXT_MAP_1:
2611
6.43k
        result = DecodeContextMap(
2612
6.43k
            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2613
6.43k
            &s->num_literal_htrees, &s->context_map, s);
2614
6.43k
        if (result != BROTLI_DECODER_SUCCESS) {
2615
71
          break;
2616
71
        }
2617
6.36k
        DetectTrivialLiteralBlockTypes(s);
2618
6.36k
        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2619
      /* Fall through. */
2620
2621
6.36k
      case BROTLI_STATE_CONTEXT_MAP_2: {
2622
6.36k
        brotli_reg_t npostfix = s->distance_postfix_bits;
2623
6.36k
        brotli_reg_t ndirect = s->num_direct_distance_codes;
2624
6.36k
        brotli_reg_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2625
6.36k
            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
2626
6.36k
        brotli_reg_t distance_alphabet_size_limit = distance_alphabet_size_max;
2627
6.36k
        BROTLI_BOOL allocation_success = BROTLI_TRUE;
2628
6.36k
        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
6.36k
        result = DecodeContextMap(
2637
6.36k
            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2638
6.36k
            &s->num_dist_htrees, &s->dist_context_map, s);
2639
6.36k
        if (result != BROTLI_DECODER_SUCCESS) {
2640
47
          break;
2641
47
        }
2642
6.32k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2643
6.32k
            s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
2644
6.32k
            BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
2645
6.32k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2646
6.32k
            s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
2647
6.32k
            BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
2648
6.32k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2649
6.32k
            s, &s->distance_hgroup, distance_alphabet_size_max,
2650
6.32k
            distance_alphabet_size_limit, s->num_dist_htrees);
2651
6.32k
        if (!allocation_success) {
2652
0
          return BROTLI_SAVE_ERROR_CODE(
2653
0
              BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
2654
0
        }
2655
6.32k
        s->loop_counter = 0;
2656
6.32k
        s->state = BROTLI_STATE_TREE_GROUP;
2657
6.32k
      }
2658
      /* Fall through. */
2659
2660
18.6k
      case BROTLI_STATE_TREE_GROUP: {
2661
18.6k
        HuffmanTreeGroup* hgroup = NULL;
2662
18.6k
        switch (s->loop_counter) {
2663
6.32k
          case 0: hgroup = &s->literal_hgroup; break;
2664
6.19k
          case 1: hgroup = &s->insert_copy_hgroup; break;
2665
6.13k
          case 2: hgroup = &s->distance_hgroup; break;
2666
0
          default: return BROTLI_SAVE_ERROR_CODE(BROTLI_FAILURE(
2667
18.6k
              BROTLI_DECODER_ERROR_UNREACHABLE));  /* COV_NF_LINE */
2668
18.6k
        }
2669
18.6k
        result = HuffmanTreeGroupDecode(hgroup, s);
2670
18.6k
        if (result != BROTLI_DECODER_SUCCESS) break;
2671
18.4k
        s->loop_counter++;
2672
18.4k
        if (s->loop_counter < 3) {
2673
12.3k
          break;
2674
12.3k
        }
2675
6.08k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY;
2676
6.08k
      }
2677
      /* Fall through. */
2678
2679
6.08k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY:
2680
6.08k
        PrepareLiteralDecoding(s);
2681
6.08k
        s->dist_context_map_slice = s->dist_context_map;
2682
6.08k
        s->htree_command = s->insert_copy_hgroup.htrees[0];
2683
6.08k
        if (!BrotliEnsureRingBuffer(s)) {
2684
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
2685
0
          break;
2686
0
        }
2687
6.08k
        CalculateDistanceLut(s);
2688
6.08k
        s->state = BROTLI_STATE_COMMAND_BEGIN;
2689
      /* Fall through. */
2690
2691
7.57k
      case BROTLI_STATE_COMMAND_BEGIN:
2692
      /* Fall through. */
2693
9.72k
      case BROTLI_STATE_COMMAND_INNER:
2694
      /* Fall through. */
2695
11.0k
      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2696
      /* Fall through. */
2697
17.0k
      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2698
17.0k
        result = ProcessCommands(s);
2699
17.0k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2700
1.99k
          result = SafeProcessCommands(s);
2701
1.99k
        }
2702
17.0k
        break;
2703
2704
3.56k
      case BROTLI_STATE_COMMAND_INNER_WRITE:
2705
      /* Fall through. */
2706
5.05k
      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2707
      /* Fall through. */
2708
11.1k
      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2709
11.1k
        result = WriteRingBuffer(
2710
11.1k
            s, available_out, next_out, total_out, BROTLI_FALSE);
2711
11.1k
        if (result != BROTLI_DECODER_SUCCESS) {
2712
134
          break;
2713
134
        }
2714
10.9k
        WrapRingBuffer(s);
2715
10.9k
        if (s->ringbuffer_size == 1 << s->window_bits) {
2716
10.9k
          s->max_distance = s->max_backward_distance;
2717
10.9k
        }
2718
10.9k
        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
2719
1.48k
          BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
2720
1.48k
          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.48k
          if (s->meta_block_remaining_len == 0) {
2725
            /* Next metablock, if any. */
2726
0
            s->state = BROTLI_STATE_METABLOCK_DONE;
2727
1.48k
          } else {
2728
1.48k
            s->state = BROTLI_STATE_COMMAND_BEGIN;
2729
1.48k
          }
2730
1.48k
          break;
2731
9.48k
        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2732
5.96k
          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2733
5.96k
        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2734
3.51k
          if (s->loop_counter == 0) {
2735
1.36k
            if (s->meta_block_remaining_len == 0) {
2736
5
              s->state = BROTLI_STATE_METABLOCK_DONE;
2737
1.36k
            } else {
2738
1.36k
              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2739
1.36k
            }
2740
1.36k
            break;
2741
1.36k
          }
2742
2.15k
          s->state = BROTLI_STATE_COMMAND_INNER;
2743
2.15k
        }
2744
8.11k
        break;
2745
2746
66.8k
      case BROTLI_STATE_METABLOCK_DONE:
2747
66.8k
        if (s->meta_block_remaining_len < 0) {
2748
136
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
2749
136
          break;
2750
136
        }
2751
66.6k
        BrotliDecoderStateCleanupAfterMetablock(s);
2752
66.6k
        if (!s->is_last_metablock) {
2753
66.0k
          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2754
66.0k
          break;
2755
66.0k
        }
2756
669
        if (!BrotliJumpToByteBoundary(br)) {
2757
22
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2758
22
          break;
2759
22
        }
2760
647
        if (s->buffer_length == 0) {
2761
647
          BrotliBitReaderUnload(br);
2762
647
          *available_in = BrotliBitReaderGetAvailIn(br);
2763
647
          *next_in = br->next_in;
2764
647
        }
2765
647
        s->state = BROTLI_STATE_DONE;
2766
      /* Fall through. */
2767
2768
647
      case BROTLI_STATE_DONE:
2769
647
        if (s->ringbuffer != 0) {
2770
629
          result = WriteRingBuffer(
2771
629
              s, available_out, next_out, total_out, BROTLI_TRUE);
2772
629
          if (result != BROTLI_DECODER_SUCCESS) {
2773
7
            break;
2774
7
          }
2775
629
        }
2776
640
        return BROTLI_SAVE_ERROR_CODE(result);
2777
260k
    }
2778
260k
  }
2779
2.16k
  return BROTLI_SAVE_ERROR_CODE(result);
2780
2.80k
#undef BROTLI_SAVE_ERROR_CODE
2781
2.80k
}
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