Coverage Report

Created: 2025-12-03 07:28

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