Coverage Report

Created: 2025-10-10 06:48

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