Coverage Report

Created: 2026-09-03 07:09

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