Coverage Report

Created: 2026-06-16 07:20

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
470
#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
1.23M
#define HUFFMAN_TABLE_BITS 8U
39
103k
#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
1.03k
    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
81
1.03k
  BrotliDecoderState* state = 0;
82
1.03k
  if (!BrotliDecoderEnsureStaticInit()) {
83
0
    BROTLI_DUMP();
84
0
    return 0;
85
0
  }
86
1.03k
  if (!alloc_func && !free_func) {
87
1.03k
    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
88
1.03k
  } else if (alloc_func && free_func) {
89
0
    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
90
0
  }
91
1.03k
  if (state == 0) {
92
0
    BROTLI_DUMP();
93
0
    return 0;
94
0
  }
95
1.03k
  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
1.03k
  return state;
105
1.03k
}
106
107
/* Deinitializes and frees BrotliDecoderState instance. */
108
1.03k
void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
109
1.03k
  if (!state) {
110
0
    return;
111
1.03k
  } else {
112
1.03k
    brotli_free_func free_func = state->free_func;
113
1.03k
    void* opaque = state->memory_manager_opaque;
114
1.03k
    BrotliDecoderStateCleanup(state);
115
1.03k
    free_func(opaque, state);
116
1.03k
  }
117
1.03k
}
118
119
/* Saves error code and converts it to BrotliDecoderResult. */
120
static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
121
1.03k
    BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
122
1.03k
  s->error_code = (int)e;
123
1.03k
  s->used_input += consumed_input;
124
1.03k
  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
1.03k
  switch (e) {
129
60
    case BROTLI_DECODER_SUCCESS:
130
60
      return BROTLI_DECODER_RESULT_SUCCESS;
131
132
507
    case BROTLI_DECODER_NEEDS_MORE_INPUT:
133
507
      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
470
    default:
139
470
      return BROTLI_DECODER_RESULT_ERROR;
140
1.03k
  }
141
1.03k
}
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
1.03k
                                               BrotliBitReader* br) {
147
1.03k
  brotli_reg_t n;
148
1.03k
  BROTLI_BOOL large_window = s->large_window;
149
1.03k
  s->large_window = BROTLI_FALSE;
150
1.03k
  BrotliTakeBits(br, 1, &n);
151
1.03k
  if (n == 0) {
152
585
    s->window_bits = 16;
153
585
    return BROTLI_DECODER_SUCCESS;
154
585
  }
155
450
  BrotliTakeBits(br, 3, &n);
156
450
  if (n != 0) {
157
95
    s->window_bits = (17u + n) & 63u;
158
95
    return BROTLI_DECODER_SUCCESS;
159
95
  }
160
355
  BrotliTakeBits(br, 3, &n);
161
355
  if (n == 1) {
162
2
    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
2
    } else {
170
2
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
171
2
    }
172
2
  }
173
353
  if (n != 0) {
174
106
    s->window_bits = (8u + n) & 63u;
175
106
    return BROTLI_DECODER_SUCCESS;
176
106
  }
177
247
  s->window_bits = 17;
178
247
  return BROTLI_DECODER_SUCCESS;
179
353
}
180
181
604k
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
604k
  uint32_t buffer[4];
186
604k
  memcpy(buffer, src, 16);
187
604k
  memcpy(dst, buffer, 16);
188
604k
#endif
189
604k
}
190
191
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
192
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
193
4.65k
    BrotliDecoderState* s, BrotliBitReader* br, brotli_reg_t* value) {
194
4.65k
  brotli_reg_t bits;
195
4.65k
  switch (s->substate_decode_uint8) {
196
4.65k
    case BROTLI_STATE_DECODE_UINT8_NONE:
197
4.65k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
198
2
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
199
2
      }
200
4.65k
      if (bits == 0) {
201
3.92k
        *value = 0;
202
3.92k
        return BROTLI_DECODER_SUCCESS;
203
3.92k
      }
204
    /* Fall through. */
205
206
732
    case BROTLI_STATE_DECODE_UINT8_SHORT:
207
732
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
208
3
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
209
3
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
210
3
      }
211
729
      if (bits == 0) {
212
44
        *value = 1;
213
44
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
214
44
        return BROTLI_DECODER_SUCCESS;
215
44
      }
216
      /* Use output value as a temporary storage. It MUST be persisted. */
217
685
      *value = bits;
218
    /* Fall through. */
219
220
685
    case BROTLI_STATE_DECODE_UINT8_LONG:
221
685
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
222
3
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
223
3
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
224
3
      }
225
682
      *value = ((brotli_reg_t)1U << *value) + bits;
226
682
      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
227
682
      return BROTLI_DECODER_SUCCESS;
228
229
0
    default:
230
0
      return
231
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
232
4.65k
  }
233
4.65k
}
234
235
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
236
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
237
1.25k
    BrotliDecoderState* s, BrotliBitReader* br) {
238
1.25k
  brotli_reg_t bits;
239
1.25k
  int i;
240
2.28k
  for (;;) {
241
2.28k
    switch (s->substate_metablock_header) {
242
1.25k
      case BROTLI_STATE_METABLOCK_HEADER_NONE:
243
1.25k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
244
2
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
245
2
        }
246
1.25k
        s->is_last_metablock = bits ? 1 : 0;
247
1.25k
        s->meta_block_remaining_len = 0;
248
1.25k
        s->is_uncompressed = 0;
249
1.25k
        s->is_metadata = 0;
250
1.25k
        if (!s->is_last_metablock) {
251
899
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
252
899
          break;
253
899
        }
254
353
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
255
      /* Fall through. */
256
257
353
      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
258
353
        if (!BrotliSafeReadBits(br, 1, &bits)) {
259
1
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
260
1
        }
261
352
        if (bits) {
262
40
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
263
40
          return BROTLI_DECODER_SUCCESS;
264
40
        }
265
312
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
266
      /* Fall through. */
267
268
1.21k
      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
269
1.21k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
270
2
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
271
2
        }
272
1.20k
        s->size_nibbles = (uint8_t)(bits + 4);
273
1.20k
        s->loop_counter = 0;
274
1.20k
        if (bits == 3) {
275
133
          s->is_metadata = 1;
276
133
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
277
133
          break;
278
133
        }
279
1.07k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
280
      /* Fall through. */
281
282
1.07k
      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
283
1.07k
        i = s->loop_counter;
284
5.69k
        for (; i < (int)s->size_nibbles; ++i) {
285
4.63k
          if (!BrotliSafeReadBits(br, 4, &bits)) {
286
5
            s->loop_counter = i;
287
5
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
288
5
          }
289
4.62k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
290
234
              bits == 0) {
291
4
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
292
4
          }
293
4.62k
          s->meta_block_remaining_len |= (int)(bits << (i * 4));
294
4.62k
        }
295
1.06k
        s->substate_metablock_header =
296
1.06k
            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
297
      /* Fall through. */
298
299
1.06k
      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
300
1.06k
        if (!s->is_last_metablock) {
301
796
          if (!BrotliSafeReadBits(br, 1, &bits)) {
302
1
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
303
1
          }
304
795
          s->is_uncompressed = bits ? 1 : 0;
305
795
        }
306
1.06k
        ++s->meta_block_remaining_len;
307
1.06k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
308
1.06k
        return BROTLI_DECODER_SUCCESS;
309
310
133
      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
311
133
        if (!BrotliSafeReadBits(br, 1, &bits)) {
312
1
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
313
1
        }
314
132
        if (bits != 0) {
315
4
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
316
4
        }
317
128
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
318
      /* Fall through. */
319
320
128
      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
321
128
        if (!BrotliSafeReadBits(br, 2, &bits)) {
322
1
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
323
1
        }
324
127
        if (bits == 0) {
325
42
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
326
42
          return BROTLI_DECODER_SUCCESS;
327
42
        }
328
85
        s->size_nibbles = (uint8_t)bits;
329
85
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
330
      /* Fall through. */
331
332
85
      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
333
85
        i = s->loop_counter;
334
197
        for (; i < (int)s->size_nibbles; ++i) {
335
116
          if (!BrotliSafeReadBits(br, 8, &bits)) {
336
2
            s->loop_counter = i;
337
2
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
338
2
          }
339
114
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
340
22
              bits == 0) {
341
2
            return BROTLI_FAILURE(
342
2
                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
343
2
          }
344
112
          s->meta_block_remaining_len |= (int)(bits << (i * 8));
345
112
        }
346
81
        ++s->meta_block_remaining_len;
347
81
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
348
81
        return BROTLI_DECODER_SUCCESS;
349
350
0
      default:
351
0
        return
352
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
353
2.28k
    }
354
2.28k
  }
355
1.25k
}
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
998k
                                               BrotliBitReader* br) {
364
998k
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
365
998k
  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
366
998k
  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
367
9.26k
    brotli_reg_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
368
9.26k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
369
9.26k
    BROTLI_HC_ADJUST_TABLE_INDEX(table,
370
9.26k
        BROTLI_HC_FAST_LOAD_VALUE(table) +
371
9.26k
        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
372
9.26k
  }
373
998k
  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
374
998k
  return BROTLI_HC_FAST_LOAD_VALUE(table);
375
998k
}
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
806k
                                             BrotliBitReader* br) {
381
806k
  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
382
806k
}
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
6.88k
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
388
6.88k
  brotli_reg_t val;
389
6.88k
  brotli_reg_t available_bits = BrotliGetAvailableBits(br);
390
6.88k
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
391
6.88k
  if (available_bits == 0) {
392
1.16k
    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
393
1.02k
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
394
1.02k
      return BROTLI_TRUE;
395
1.02k
    }
396
131
    return BROTLI_FALSE;  /* No valid bits at all. */
397
1.16k
  }
398
5.72k
  val = BrotliGetBitsUnmasked(br);
399
5.72k
  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
400
5.72k
  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
401
5.70k
    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
402
5.54k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
403
5.54k
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
404
5.54k
      return BROTLI_TRUE;
405
5.54k
    } else {
406
156
      return BROTLI_FALSE;  /* Not enough bits for the first level. */
407
156
    }
408
5.70k
  }
409
29
  if (available_bits <= HUFFMAN_TABLE_BITS) {
410
15
    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
411
15
  }
412
413
  /* Speculatively drop HUFFMAN_TABLE_BITS. */
414
14
  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
415
14
  available_bits -= HUFFMAN_TABLE_BITS;
416
14
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
417
14
  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
418
5
    return BROTLI_FALSE;  /* Not enough bits for the second level. */
419
5
  }
420
421
9
  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
422
9
  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
423
9
  return BROTLI_TRUE;
424
14
}
425
426
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
427
198k
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
428
198k
  brotli_reg_t val;
429
198k
  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
430
191k
    *result = DecodeSymbol(val, table, br);
431
191k
    return BROTLI_TRUE;
432
191k
  }
433
6.88k
  return SafeDecodeSymbol(table, br, result);
434
198k
}
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
2.54M
                                        brotli_reg_t* value) {
442
2.54M
  if (safe) {
443
13.3k
    return;
444
13.3k
  }
445
2.52M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
446
2.52M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
447
2.52M
  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
448
2.52M
  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
449
2.52M
}
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
2.10M
                                                  brotli_reg_t* value) {
457
2.10M
  brotli_reg_t result = *value;
458
2.10M
  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
459
103k
    brotli_reg_t val = BrotliGet16BitsUnmasked(br);
460
103k
    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
461
103k
    brotli_reg_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
462
103k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
463
103k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
464
103k
    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
465
103k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
466
103k
    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
467
2.00M
  } else {
468
2.00M
    BrotliDropBits(br, *bits);
469
2.00M
  }
470
2.10M
  PreloadSymbol(0, table, br, bits, value);
471
2.10M
  return result;
472
2.10M
}
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
757k
                                                        const int limit) {
484
  /* Calculate range where CheckInputAmount is always true.
485
     Start with the number of bytes we can read. */
486
757k
  int64_t new_lim = br->guard_in - br->next_in;
487
  /* Convert to bits, since symbols use variable number of bits. */
488
757k
  new_lim *= 8;
489
  /* At most 15 bits per symbol, so this is safe. */
490
757k
  new_lim /= 15;
491
757k
  const int kMaximalOverread = 4;
492
757k
  int pos_limit = limit;
493
757k
  int copies = 0;
494
757k
  if ((new_lim - kMaximalOverread) <= limit) {
495
    // Safe cast, since new_lim is already < num_steps
496
9.41k
    pos_limit = (int)(new_lim - kMaximalOverread);
497
9.41k
  }
498
757k
  if (pos_limit < 0) {
499
5.56k
    pos_limit = 0;
500
5.56k
  }
501
757k
  copies = pos_limit;
502
757k
  pos_limit += pos;
503
  /* Fast path, caller made sure it is safe to write,
504
     we verified that is is safe to read. */
505
2.66M
  for (; pos < pos_limit; pos++) {
506
1.90M
    BROTLI_DCHECK(BrotliCheckInputAmount(br));
507
1.90M
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
508
1.90M
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
509
1.90M
  }
510
  /* Do the remainder, caller made sure it is safe to write,
511
     we need to bverify that it is safe to read. */
512
957k
  while (BrotliCheckInputAmount(br) && copies < limit) {
513
199k
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
514
199k
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
515
199k
    pos++;
516
199k
    copies++;
517
199k
  }
518
757k
  return copies;
519
757k
}
520
521
2.32k
static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) {
522
2.32k
  brotli_reg_t result = 0;
523
18.5k
  while (x) {
524
16.2k
    x >>= 1;
525
16.2k
    ++result;
526
16.2k
  }
527
2.32k
  return result;
528
2.32k
}
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
2.32k
    BrotliDecoderState* s) {
536
  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
537
2.32k
  BrotliBitReader* br = &s->br;
538
2.32k
  BrotliMetablockHeaderArena* h = &s->arena.header;
539
2.32k
  brotli_reg_t max_bits = Log2Floor(alphabet_size_max - 1);
540
2.32k
  brotli_reg_t i = h->sub_loop_counter;
541
2.32k
  brotli_reg_t num_symbols = h->symbol;
542
7.40k
  while (i <= num_symbols) {
543
5.08k
    brotli_reg_t v;
544
5.08k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
545
3
      h->sub_loop_counter = i;
546
3
      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
547
3
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
548
3
    }
549
5.08k
    if (v >= alphabet_size_limit) {
550
8
      return
551
8
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
552
8
    }
553
5.07k
    h->symbols_lists_array[i] = (uint16_t)v;
554
5.07k
    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
555
5.07k
    ++i;
556
5.07k
  }
557
558
5.05k
  for (i = 0; i < num_symbols; ++i) {
559
2.74k
    brotli_reg_t k = i + 1;
560
6.79k
    for (; k <= num_symbols; ++k) {
561
4.05k
      if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) {
562
8
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
563
8
      }
564
4.05k
    }
565
2.74k
  }
566
567
2.30k
  return BROTLI_DECODER_SUCCESS;
568
2.31k
}
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
103k
    uint16_t* code_length_histo, int* next_symbol) {
580
103k
  *repeat = 0;
581
103k
  if (code_len != 0) {  /* code_len == 1..15 */
582
98.7k
    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
583
98.7k
    next_symbol[code_len] = (int)(*symbol);
584
98.7k
    *prev_code_len = code_len;
585
98.7k
    *space -= 32768U >> code_len;
586
98.7k
    code_length_histo[code_len]++;
587
98.7k
    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
588
98.7k
        (int)*symbol, (int)code_len));
589
98.7k
  }
590
103k
  (*symbol)++;
591
103k
}
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
7.49k
    uint16_t* code_length_histo, int* next_symbol) {
608
7.49k
  brotli_reg_t old_repeat;
609
7.49k
  brotli_reg_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
610
7.49k
  brotli_reg_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
611
7.49k
  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
612
5.05k
    new_len = *prev_code_len;
613
5.05k
    extra_bits = 2;
614
5.05k
  }
615
7.49k
  if (*repeat_code_len != new_len) {
616
3.10k
    *repeat = 0;
617
3.10k
    *repeat_code_len = new_len;
618
3.10k
  }
619
7.49k
  old_repeat = *repeat;
620
7.49k
  if (*repeat > 0) {
621
1.03k
    *repeat -= 2;
622
1.03k
    *repeat <<= extra_bits;
623
1.03k
  }
624
7.49k
  *repeat += repeat_delta + 3U;
625
7.49k
  repeat_delta = *repeat - old_repeat;
626
7.49k
  if (*symbol + repeat_delta > alphabet_size) {
627
49
    BROTLI_DUMP();
628
49
    *symbol = alphabet_size;
629
49
    *space = 0xFFFFF;
630
49
    return;
631
49
  }
632
7.44k
  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
633
7.44k
      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
634
7.44k
  if (*repeat_code_len != 0) {
635
5.03k
    brotli_reg_t last = *symbol + repeat_delta;
636
5.03k
    int next = next_symbol[*repeat_code_len];
637
40.0k
    do {
638
40.0k
      symbol_lists[next] = (uint16_t)*symbol;
639
40.0k
      next = (int)*symbol;
640
40.0k
    } while (++(*symbol) != last);
641
5.03k
    next_symbol[*repeat_code_len] = next;
642
5.03k
    *space -= repeat_delta << (15 - *repeat_code_len);
643
5.03k
    code_length_histo[*repeat_code_len] =
644
5.03k
        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
645
5.03k
  } else {
646
2.40k
    *symbol += repeat_delta;
647
2.40k
  }
648
7.44k
}
649
650
/* Reads and decodes symbol codelengths. */
651
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
652
1.24k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
653
1.24k
  BrotliBitReader* br = &s->br;
654
1.24k
  BrotliMetablockHeaderArena* h = &s->arena.header;
655
1.24k
  brotli_reg_t symbol = h->symbol;
656
1.24k
  brotli_reg_t repeat = h->repeat;
657
1.24k
  brotli_reg_t space = h->space;
658
1.24k
  brotli_reg_t prev_code_len = h->prev_code_len;
659
1.24k
  brotli_reg_t repeat_code_len = h->repeat_code_len;
660
1.24k
  uint16_t* symbol_lists = h->symbol_lists;
661
1.24k
  uint16_t* code_length_histo = h->code_length_histo;
662
1.24k
  int* next_symbol = h->next_symbol;
663
1.24k
  if (!BrotliWarmupBitReader(br)) {
664
0
    return BROTLI_DECODER_NEEDS_MORE_INPUT;
665
0
  }
666
105k
  while (symbol < alphabet_size && space > 0) {
667
104k
    const HuffmanCode* p = h->table;
668
104k
    brotli_reg_t code_len;
669
104k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
670
104k
    if (!BrotliCheckInputAmount(br)) {
671
134
      h->symbol = symbol;
672
134
      h->repeat = repeat;
673
134
      h->prev_code_len = prev_code_len;
674
134
      h->repeat_code_len = repeat_code_len;
675
134
      h->space = space;
676
134
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
677
134
    }
678
104k
    BrotliFillBitWindow16(br);
679
104k
    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
680
104k
        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
681
104k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
682
104k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
683
104k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
684
97.3k
      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
685
97.3k
          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
686
97.3k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
687
7.08k
      brotli_reg_t extra_bits =
688
7.08k
          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
689
7.08k
      brotli_reg_t repeat_delta =
690
7.08k
          BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
691
7.08k
      BrotliDropBits(br, extra_bits);
692
7.08k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
693
7.08k
          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
694
7.08k
          symbol_lists, code_length_histo, next_symbol);
695
7.08k
    }
696
104k
  }
697
1.11k
  h->space = space;
698
1.11k
  return BROTLI_DECODER_SUCCESS;
699
1.24k
}
700
701
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
702
134
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
703
134
  BrotliBitReader* br = &s->br;
704
134
  BrotliMetablockHeaderArena* h = &s->arena.header;
705
134
  BROTLI_BOOL get_byte = BROTLI_FALSE;
706
7.93k
  while (h->symbol < alphabet_size && h->space > 0) {
707
7.83k
    const HuffmanCode* p = h->table;
708
7.83k
    brotli_reg_t code_len;
709
7.83k
    brotli_reg_t available_bits;
710
7.83k
    brotli_reg_t bits = 0;
711
7.83k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
712
7.83k
    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
713
7.80k
    get_byte = BROTLI_FALSE;
714
7.80k
    available_bits = BrotliGetAvailableBits(br);
715
7.80k
    if (available_bits != 0) {
716
7.52k
      bits = (uint32_t)BrotliGetBitsUnmasked(br);
717
7.52k
    }
718
7.80k
    BROTLI_HC_ADJUST_TABLE_INDEX(p,
719
7.80k
        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
720
7.80k
    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
721
657
      get_byte = BROTLI_TRUE;
722
657
      continue;
723
657
    }
724
7.14k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
725
7.14k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
726
6.60k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
727
6.60k
      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
728
6.60k
          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
729
6.60k
          h->next_symbol);
730
6.60k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
731
538
      brotli_reg_t extra_bits = code_len - 14U;
732
538
      brotli_reg_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
733
538
          BitMask(extra_bits);
734
538
      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
735
127
        get_byte = BROTLI_TRUE;
736
127
        continue;
737
127
      }
738
411
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
739
411
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
740
411
          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
741
411
          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
742
411
          h->next_symbol);
743
411
    }
744
7.14k
  }
745
104
  return BROTLI_DECODER_SUCCESS;
746
134
}
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
1.37k
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
751
1.37k
  BrotliBitReader* br = &s->br;
752
1.37k
  BrotliMetablockHeaderArena* h = &s->arena.header;
753
1.37k
  brotli_reg_t num_codes = h->repeat;
754
1.37k
  brotli_reg_t space = h->space;
755
1.37k
  brotli_reg_t i = h->sub_loop_counter;
756
15.9k
  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
757
15.7k
    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
758
15.7k
    brotli_reg_t ix;
759
15.7k
    brotli_reg_t v;
760
15.7k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
761
33
      brotli_reg_t available_bits = BrotliGetAvailableBits(br);
762
33
      if (available_bits != 0) {
763
26
        ix = BrotliGetBitsUnmasked(br) & 0xF;
764
26
      } else {
765
7
        ix = 0;
766
7
      }
767
33
      if (kCodeLengthPrefixLength[ix] > available_bits) {
768
19
        h->sub_loop_counter = i;
769
19
        h->repeat = num_codes;
770
19
        h->space = space;
771
19
        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
772
19
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
773
19
      }
774
33
    }
775
15.7k
    v = kCodeLengthPrefixValue[ix];
776
15.7k
    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
777
15.7k
    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
778
15.7k
    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
779
15.7k
    if (v != 0) {
780
7.39k
      space = space - (32U >> v);
781
7.39k
      ++num_codes;
782
7.39k
      ++h->code_length_histo[v];
783
7.39k
      if (space - 1U >= 32U) {
784
        /* space is 0 or wrapped around. */
785
1.12k
        break;
786
1.12k
      }
787
7.39k
    }
788
15.7k
  }
789
1.36k
  if (!(num_codes == 1 || space == 0)) {
790
115
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
791
115
  }
792
1.24k
  return BROTLI_DECODER_SUCCESS;
793
1.36k
}
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
3.71k
                                              BrotliDecoderState* s) {
811
3.71k
  BrotliBitReader* br = &s->br;
812
3.71k
  BrotliMetablockHeaderArena* h = &s->arena.header;
813
  /* State machine. */
814
5.09k
  for (;;) {
815
5.09k
    switch (h->substate_huffman) {
816
3.71k
      case BROTLI_STATE_HUFFMAN_NONE:
817
3.71k
        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
818
5
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
819
5
        }
820
3.70k
        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
3.70k
        if (h->sub_loop_counter != 1) {
825
1.37k
          h->space = 32;
826
1.37k
          h->repeat = 0;  /* num_codes */
827
1.37k
          memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) *
828
1.37k
              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
829
1.37k
          memset(&h->code_length_code_lengths[0], 0,
830
1.37k
              sizeof(h->code_length_code_lengths));
831
1.37k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
832
1.37k
          continue;
833
1.37k
        }
834
      /* Fall through. */
835
836
2.33k
      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
837
        /* Read symbols, codes & code lengths directly. */
838
2.33k
        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
839
2
          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
840
2
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
841
2
        }
842
2.32k
        h->sub_loop_counter = 0;
843
      /* Fall through. */
844
845
2.32k
      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
846
2.32k
        BrotliDecoderErrorCode result =
847
2.32k
            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
848
2.32k
        if (result != BROTLI_DECODER_SUCCESS) {
849
19
          return result;
850
19
        }
851
2.32k
      }
852
      /* Fall through. */
853
854
2.30k
      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
855
2.30k
        brotli_reg_t table_size;
856
2.30k
        if (h->symbol == 3) {
857
362
          brotli_reg_t bits;
858
362
          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
361
          h->symbol += bits;
863
361
        }
864
2.30k
        BROTLI_LOG_UINT(h->symbol);
865
2.30k
        table_size = BrotliBuildSimpleHuffmanTable(table, HUFFMAN_TABLE_BITS,
866
2.30k
                                                   h->symbols_lists_array,
867
2.30k
                                                   (uint32_t)h->symbol);
868
2.30k
        if (opt_table_size) {
869
1.28k
          *opt_table_size = table_size;
870
1.28k
        }
871
2.30k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
872
2.30k
        return BROTLI_DECODER_SUCCESS;
873
2.30k
      }
874
875
      /* Decode Huffman-coded code lengths. */
876
1.37k
      case BROTLI_STATE_HUFFMAN_COMPLEX: {
877
1.37k
        brotli_reg_t i;
878
1.37k
        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
879
1.37k
        if (result != BROTLI_DECODER_SUCCESS) {
880
134
          return result;
881
134
        }
882
1.24k
        BrotliBuildCodeLengthsHuffmanTable(h->table,
883
1.24k
                                           h->code_length_code_lengths,
884
1.24k
                                           h->code_length_histo);
885
1.24k
        memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo));
886
21.1k
        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
887
19.9k
          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
888
19.9k
          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
889
19.9k
        }
890
891
1.24k
        h->symbol = 0;
892
1.24k
        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
893
1.24k
        h->repeat = 0;
894
1.24k
        h->repeat_code_len = 0;
895
1.24k
        h->space = 32768;
896
1.24k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
897
1.24k
      }
898
      /* Fall through. */
899
900
1.24k
      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
901
1.24k
        brotli_reg_t table_size;
902
1.24k
        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
903
1.24k
            alphabet_size_limit, s);
904
1.24k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
905
134
          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
906
134
        }
907
1.24k
        if (result != BROTLI_DECODER_SUCCESS) {
908
30
          return result;
909
30
        }
910
911
1.21k
        if (h->space != 0) {
912
131
          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
913
131
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
914
131
        }
915
1.08k
        table_size = BrotliBuildHuffmanTable(
916
1.08k
            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
917
1.08k
        if (opt_table_size) {
918
1.00k
          *opt_table_size = table_size;
919
1.00k
        }
920
1.08k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
921
1.08k
        return BROTLI_DECODER_SUCCESS;
922
1.21k
      }
923
924
0
      default:
925
0
        return
926
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
927
5.09k
    }
928
5.09k
  }
929
3.71k
}
930
931
/* Decodes a block length by reading 3..39 bits. */
932
static BROTLI_INLINE brotli_reg_t ReadBlockLength(const HuffmanCode* table,
933
91.2k
                                                  BrotliBitReader* br) {
934
91.2k
  brotli_reg_t code;
935
91.2k
  brotli_reg_t nbits;
936
91.2k
  code = ReadSymbol(table, br);
937
91.2k
  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
938
91.2k
  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
939
91.2k
}
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
4.09k
    BrotliBitReader* br) {
946
4.09k
  brotli_reg_t index;
947
4.09k
  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
948
4.09k
    if (!SafeReadSymbol(table, br, &index)) {
949
2
      return BROTLI_FALSE;
950
2
    }
951
4.09k
  } else {
952
0
    index = s->block_length_index;
953
0
  }
954
4.09k
  {
955
4.09k
    brotli_reg_t bits;
956
4.09k
    brotli_reg_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
957
4.09k
    brotli_reg_t offset = _kBrotliPrefixCodeRanges[index].offset;
958
4.09k
    if (!BrotliSafeReadBits(br, nbits, &bits)) {
959
30
      s->block_length_index = index;
960
30
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
961
30
      return BROTLI_FALSE;
962
30
    }
963
4.06k
    *result = offset + bits;
964
4.06k
    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
965
4.06k
    return BROTLI_TRUE;
966
4.09k
  }
967
4.09k
}
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
24
    uint8_t* v, brotli_reg_t v_len, BrotliDecoderState* state) {
985
  /* Reinitialize elements that could have been changed. */
986
24
  brotli_reg_t i = 1;
987
24
  brotli_reg_t upper_bound = state->mtf_upper_bound;
988
24
  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
989
24
  uint8_t* mtf_u8 = (uint8_t*)mtf;
990
  /* Load endian-aware constant. */
991
24
  const uint8_t b0123[4] = {0, 1, 2, 3};
992
24
  uint32_t pattern;
993
24
  memcpy(&pattern, &b0123, 4);
994
995
  /* Initialize list using 4 consequent values pattern. */
996
24
  mtf[0] = pattern;
997
1.38k
  do {
998
1.38k
    pattern += 0x04040404;  /* Advance all 4 values by 4. */
999
1.38k
    mtf[i] = pattern;
1000
1.38k
    i++;
1001
1.38k
  } while (i <= upper_bound);
1002
1003
  /* Transform the input. */
1004
24
  upper_bound = 0;
1005
32.9k
  for (i = 0; i < v_len; ++i) {
1006
32.8k
    int index = v[i];
1007
32.8k
    uint8_t value = mtf_u8[index];
1008
32.8k
    upper_bound |= v[i];
1009
32.8k
    v[i] = value;
1010
32.8k
    mtf_u8[-1] = value;
1011
330k
    do {
1012
330k
      index--;
1013
330k
      mtf_u8[index + 1] = mtf_u8[index];
1014
330k
    } while (index >= 0);
1015
32.8k
  }
1016
  /* Remember amount of elements to be reinitialized. */
1017
24
  state->mtf_upper_bound = upper_bound >> 2;
1018
24
}
1019
1020
/* Decodes a series of Huffman table using ReadHuffmanCode function. */
1021
static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
1022
2.20k
    HuffmanTreeGroup* group, BrotliDecoderState* s) {
1023
2.20k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1024
2.20k
  if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
1025
2.20k
    h->next = group->codes;
1026
2.20k
    h->htree_index = 0;
1027
2.20k
    h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
1028
2.20k
  }
1029
4.49k
  while (h->htree_index < group->num_htrees) {
1030
2.46k
    brotli_reg_t table_size;
1031
2.46k
    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
1032
2.46k
        group->alphabet_size_limit, h->next, &table_size, s);
1033
2.46k
    if (result != BROTLI_DECODER_SUCCESS) return result;
1034
2.28k
    group->htrees[h->htree_index] = h->next;
1035
2.28k
    h->next += table_size;
1036
2.28k
    ++h->htree_index;
1037
2.28k
  }
1038
2.02k
  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
1039
2.02k
  return BROTLI_DECODER_SUCCESS;
1040
2.20k
}
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
1.75k
                                               BrotliDecoderState* s) {
1054
1.75k
  BrotliBitReader* br = &s->br;
1055
1.75k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1056
1.75k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1057
1058
1.75k
  switch ((int)h->substate_context_map) {
1059
1.75k
    case BROTLI_STATE_CONTEXT_MAP_NONE:
1060
1.75k
      result = DecodeVarLenUint8(s, br, num_htrees);
1061
1.75k
      if (result != BROTLI_DECODER_SUCCESS) {
1062
5
        return result;
1063
5
      }
1064
1.74k
      (*num_htrees)++;
1065
1.74k
      h->context_index = 0;
1066
1.74k
      BROTLI_LOG_UINT(context_map_size);
1067
1.74k
      BROTLI_LOG_UINT(*num_htrees);
1068
1.74k
      *context_map_arg =
1069
1.74k
          (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
1070
1.74k
      if (*context_map_arg == 0) {
1071
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
1072
0
      }
1073
1.74k
      if (*num_htrees <= 1) {
1074
1.60k
        memset(*context_map_arg, 0, (size_t)context_map_size);
1075
1.60k
        return BROTLI_DECODER_SUCCESS;
1076
1.60k
      }
1077
140
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
1078
    /* Fall through. */
1079
1080
140
    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
1081
140
      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
140
      if (!BrotliSafeGetBits(br, 5, &bits)) {
1085
2
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1086
2
      }
1087
138
      if ((bits & 1) != 0) { /* Use RLE for zeros. */
1088
75
        h->max_run_length_prefix = (bits >> 1) + 1;
1089
75
        BrotliDropBits(br, 5);
1090
75
      } else {
1091
63
        h->max_run_length_prefix = 0;
1092
63
        BrotliDropBits(br, 1);
1093
63
      }
1094
138
      BROTLI_LOG_UINT(h->max_run_length_prefix);
1095
138
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
1096
138
    }
1097
    /* Fall through. */
1098
1099
138
    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
1100
138
      brotli_reg_t alphabet_size = *num_htrees + h->max_run_length_prefix;
1101
138
      result = ReadHuffmanCode(alphabet_size, alphabet_size,
1102
138
                               h->context_map_table, NULL, s);
1103
138
      if (result != BROTLI_DECODER_SUCCESS) return result;
1104
96
      h->code = 0xFFFF;
1105
96
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
1106
96
    }
1107
    /* Fall through. */
1108
1109
96
    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
1110
96
      brotli_reg_t context_index = h->context_index;
1111
96
      brotli_reg_t max_run_length_prefix = h->max_run_length_prefix;
1112
96
      uint8_t* context_map = *context_map_arg;
1113
96
      brotli_reg_t code = h->code;
1114
96
      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
1115
103k
      while (context_index < context_map_size || skip_preamble) {
1116
103k
        if (!skip_preamble) {
1117
103k
          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
1118
8
            h->code = 0xFFFF;
1119
8
            h->context_index = context_index;
1120
8
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1121
8
          }
1122
103k
          BROTLI_LOG_UINT(code);
1123
1124
103k
          if (code == 0) {
1125
57.7k
            context_map[context_index++] = 0;
1126
57.7k
            continue;
1127
57.7k
          }
1128
45.5k
          if (code > max_run_length_prefix) {
1129
42.5k
            context_map[context_index++] =
1130
42.5k
                (uint8_t)(code - max_run_length_prefix);
1131
42.5k
            continue;
1132
42.5k
          }
1133
45.5k
        } else {
1134
0
          skip_preamble = BROTLI_FALSE;
1135
0
        }
1136
        /* RLE sub-stage. */
1137
2.96k
        {
1138
2.96k
          brotli_reg_t reps;
1139
2.96k
          if (!BrotliSafeReadBits(br, code, &reps)) {
1140
2
            h->code = code;
1141
2
            h->context_index = context_index;
1142
2
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1143
2
          }
1144
2.96k
          reps += (brotli_reg_t)1U << code;
1145
2.96k
          BROTLI_LOG_UINT(reps);
1146
2.96k
          if (context_index + reps > context_map_size) {
1147
23
            return
1148
23
                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
1149
23
          }
1150
29.5k
          do {
1151
29.5k
            context_map[context_index++] = 0;
1152
29.5k
          } while (--reps);
1153
2.94k
        }
1154
2.94k
      }
1155
96
    }
1156
    /* Fall through. */
1157
1158
63
    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1159
63
      brotli_reg_t bits;
1160
63
      if (!BrotliSafeReadBits(br, 1, &bits)) {
1161
0
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
1162
0
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1163
0
      }
1164
63
      if (bits != 0) {
1165
24
        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
1166
24
      }
1167
63
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
1168
63
      return BROTLI_DECODER_SUCCESS;
1169
63
    }
1170
1171
0
    default:
1172
0
      return
1173
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1174
1.75k
  }
1175
1.75k
}
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
94.8k
    int safe, BrotliDecoderState* s, int tree_type) {
1181
94.8k
  brotli_reg_t max_block_type = s->num_block_types[tree_type];
1182
94.8k
  const HuffmanCode* type_tree = &s->block_type_trees[
1183
94.8k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
1184
94.8k
  const HuffmanCode* len_tree = &s->block_len_trees[
1185
94.8k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1186
94.8k
  BrotliBitReader* br = &s->br;
1187
94.8k
  brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1188
94.8k
  brotli_reg_t block_type;
1189
94.8k
  if (max_block_type <= 1) {
1190
0
    return BROTLI_FALSE;
1191
0
  }
1192
1193
  /* Read 0..15 + 3..39 bits. */
1194
94.8k
  if (!safe) {
1195
91.2k
    block_type = ReadSymbol(type_tree, br);
1196
91.2k
    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1197
91.2k
  } else {
1198
3.62k
    BrotliBitReaderState memento;
1199
3.62k
    BrotliBitReaderSaveState(br, &memento);
1200
3.62k
    if (!SafeReadSymbol(type_tree, br, &block_type)) return BROTLI_FALSE;
1201
3.60k
    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1202
30
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1203
30
      BrotliBitReaderRestoreState(br, &memento);
1204
30
      return BROTLI_FALSE;
1205
30
    }
1206
3.60k
  }
1207
1208
94.7k
  if (block_type == 1) {
1209
6.07k
    block_type = ringbuffer[1] + 1;
1210
88.7k
  } else if (block_type == 0) {
1211
353
    block_type = ringbuffer[0];
1212
88.3k
  } else {
1213
88.3k
    block_type -= 2;
1214
88.3k
  }
1215
94.7k
  if (block_type >= max_block_type) {
1216
893
    block_type -= max_block_type;
1217
893
  }
1218
94.7k
  ringbuffer[0] = ringbuffer[1];
1219
94.7k
  ringbuffer[1] = block_type;
1220
94.7k
  return BROTLI_TRUE;
1221
94.8k
}
1222
1223
static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
1224
851
    BrotliDecoderState* s) {
1225
851
  size_t i;
1226
7.65k
  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1227
18.1k
  for (i = 0; i < s->num_block_types[0]; i++) {
1228
17.3k
    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1229
17.3k
    size_t error = 0;
1230
17.3k
    size_t sample = s->context_map[offset];
1231
17.3k
    size_t j;
1232
294k
    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1233
      /* NOLINTNEXTLINE(bugprone-macro-repeated-side-effects) */
1234
277k
      BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
1235
277k
    }
1236
17.3k
    if (error == 0) {
1237
15.8k
      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1238
15.8k
    }
1239
17.3k
  }
1240
851
}
1241
1242
93.5k
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1243
93.5k
  uint8_t context_mode;
1244
93.5k
  size_t trivial;
1245
93.5k
  brotli_reg_t block_type = s->block_type_rb[1];
1246
93.5k
  brotli_reg_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1247
93.5k
  s->context_map_slice = s->context_map + context_offset;
1248
93.5k
  trivial = s->trivial_literal_contexts[block_type >> 5];
1249
93.5k
  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1250
93.5k
  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1251
93.5k
  context_mode = s->context_modes[block_type] & 3;
1252
93.5k
  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
1253
93.5k
}
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
92.9k
    int safe, BrotliDecoderState* s) {
1259
92.9k
  if (!DecodeBlockTypeAndLength(safe, s, 0)) {
1260
46
    return BROTLI_FALSE;
1261
46
  }
1262
92.8k
  PrepareLiteralDecoding(s);
1263
92.8k
  return BROTLI_TRUE;
1264
92.9k
}
1265
1266
89.4k
static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1267
89.4k
  DecodeLiteralBlockSwitchInternal(0, s);
1268
89.4k
}
1269
1270
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeLiteralBlockSwitch(
1271
3.42k
    BrotliDecoderState* s) {
1272
3.42k
  return DecodeLiteralBlockSwitchInternal(1, s);
1273
3.42k
}
1274
1275
/* Block switch for insert/copy length.
1276
   Reads 3..54 bits. */
1277
static BROTLI_INLINE BROTLI_BOOL DecodeCommandBlockSwitchInternal(
1278
1.91k
    int safe, BrotliDecoderState* s) {
1279
1.91k
  if (!DecodeBlockTypeAndLength(safe, s, 1)) {
1280
4
    return BROTLI_FALSE;
1281
4
  }
1282
1.91k
  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
1283
1.91k
  return BROTLI_TRUE;
1284
1.91k
}
1285
1286
1.71k
static void BROTLI_NOINLINE DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1287
1.71k
  DecodeCommandBlockSwitchInternal(0, s);
1288
1.71k
}
1289
1290
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeCommandBlockSwitch(
1291
204
    BrotliDecoderState* s) {
1292
204
  return DecodeCommandBlockSwitchInternal(1, s);
1293
204
}
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
1.00k
static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
1318
1.00k
  size_t pos = wrap && s->pos > s->ringbuffer_size ?
1319
1.00k
      (size_t)s->ringbuffer_size : (size_t)(s->pos);
1320
1.00k
  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
1321
1.00k
  return partial_pos_rb - s->partial_pos_out;
1322
1.00k
}
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
1.00k
    size_t* total_out, BROTLI_BOOL force) {
1330
1.00k
  uint8_t* start =
1331
1.00k
      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
1332
1.00k
  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1333
1.00k
  size_t num_written = *available_out;
1334
1.00k
  if (num_written > to_write) {
1335
1.00k
    num_written = to_write;
1336
1.00k
  }
1337
1.00k
  if (s->meta_block_remaining_len < 0) {
1338
34
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
1339
34
  }
1340
971
  if (next_out && !*next_out) {
1341
0
    *next_out = start;
1342
971
  } else {
1343
971
    if (next_out) {
1344
971
      memcpy(*next_out, start, num_written);
1345
971
      *next_out += num_written;
1346
971
    }
1347
971
  }
1348
971
  *available_out -= num_written;
1349
971
  BROTLI_LOG_UINT(to_write);
1350
971
  BROTLI_LOG_UINT(num_written);
1351
971
  s->partial_pos_out += num_written;
1352
971
  if (total_out) {
1353
0
    *total_out = s->partial_pos_out;
1354
0
  }
1355
971
  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
971
  if (s->ringbuffer_size == (1 << s->window_bits) &&
1364
699
      s->pos >= s->ringbuffer_size) {
1365
540
    s->pos -= s->ringbuffer_size;
1366
540
    s->rb_roundtrips++;
1367
540
    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1368
540
  }
1369
971
  return BROTLI_DECODER_SUCCESS;
1370
971
}
1371
1372
523
static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1373
523
  if (s->should_wrap_ringbuffer) {
1374
2
    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1375
2
    s->should_wrap_ringbuffer = 0;
1376
2
  }
1377
523
}
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
687
    BrotliDecoderState* s) {
1388
687
  uint8_t* old_ringbuffer = s->ringbuffer;
1389
687
  if (s->ringbuffer_size == s->new_ringbuffer_size) {
1390
13
    return BROTLI_TRUE;
1391
13
  }
1392
1393
674
  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
1394
674
      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
1395
674
  if (s->ringbuffer == 0) {
1396
    /* Restore previous value. */
1397
0
    s->ringbuffer = old_ringbuffer;
1398
0
    return BROTLI_FALSE;
1399
0
  }
1400
674
  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1401
674
  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
1402
1403
674
  if (!!old_ringbuffer) {
1404
55
    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1405
55
    BROTLI_DECODER_FREE(s, old_ringbuffer);
1406
55
  }
1407
1408
674
  s->ringbuffer_size = s->new_ringbuffer_size;
1409
674
  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1410
674
  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1411
1412
674
  return BROTLI_TRUE;
1413
674
}
1414
1415
static BrotliDecoderErrorCode BROTLI_NOINLINE
1416
116
SkipMetadataBlock(BrotliDecoderState* s) {
1417
116
  BrotliBitReader* br = &s->br;
1418
116
  int nbytes;
1419
1420
116
  if (s->meta_block_remaining_len == 0) {
1421
40
    return BROTLI_DECODER_SUCCESS;
1422
40
  }
1423
1424
76
  BROTLI_DCHECK((BrotliGetAvailableBits(br) & 7) == 0);
1425
1426
  /* Drain accumulator. */
1427
76
  if (BrotliGetAvailableBits(br) >= 8) {
1428
11
    uint8_t buffer[8];
1429
11
    nbytes = (int)(BrotliGetAvailableBits(br)) >> 3;
1430
11
    BROTLI_DCHECK(nbytes <= 8);
1431
11
    if (nbytes > s->meta_block_remaining_len) {
1432
2
      nbytes = s->meta_block_remaining_len;
1433
2
    }
1434
11
    BrotliCopyBytes(buffer, br, (size_t)nbytes);
1435
11
    if (s->metadata_chunk_func) {
1436
0
      s->metadata_chunk_func(s->metadata_callback_opaque, buffer,
1437
0
                             (size_t)nbytes);
1438
0
    }
1439
11
    s->meta_block_remaining_len -= nbytes;
1440
11
    if (s->meta_block_remaining_len == 0) {
1441
2
      return BROTLI_DECODER_SUCCESS;
1442
2
    }
1443
11
  }
1444
1445
  /* Direct access to metadata is possible. */
1446
74
  nbytes = (int)BrotliGetRemainingBytes(br);
1447
74
  if (nbytes > s->meta_block_remaining_len) {
1448
59
    nbytes = s->meta_block_remaining_len;
1449
59
  }
1450
74
  if (nbytes > 0) {
1451
73
    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
73
    BrotliDropBytes(br, (size_t)nbytes);
1456
73
    s->meta_block_remaining_len -= nbytes;
1457
73
    if (s->meta_block_remaining_len == 0) {
1458
59
      return BROTLI_DECODER_SUCCESS;
1459
59
    }
1460
73
  }
1461
1462
15
  BROTLI_DCHECK(BrotliGetRemainingBytes(br) == 0);
1463
1464
15
  return BROTLI_DECODER_NEEDS_MORE_INPUT;
1465
74
}
1466
1467
static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1468
    size_t* available_out, uint8_t** next_out, size_t* total_out,
1469
49
    BrotliDecoderState* s) {
1470
  /* TODO(eustas): avoid allocation for single uncompressed block. */
1471
49
  if (!BrotliEnsureRingBuffer(s)) {
1472
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
1473
0
  }
1474
1475
  /* State machine */
1476
66
  for (;;) {
1477
66
    switch (s->substate_uncompressed) {
1478
66
      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1479
66
        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1480
66
        if (nbytes > s->meta_block_remaining_len) {
1481
27
          nbytes = s->meta_block_remaining_len;
1482
27
        }
1483
66
        if (s->pos + nbytes > s->ringbuffer_size) {
1484
17
          nbytes = s->ringbuffer_size - s->pos;
1485
17
        }
1486
        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1487
66
        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1488
66
        s->pos += nbytes;
1489
66
        s->meta_block_remaining_len -= nbytes;
1490
66
        if (s->pos < 1 << s->window_bits) {
1491
49
          if (s->meta_block_remaining_len == 0) {
1492
27
            return BROTLI_DECODER_SUCCESS;
1493
27
          }
1494
22
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
1495
49
        }
1496
17
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1497
17
      }
1498
      /* Fall through. */
1499
1500
17
      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1501
17
        BrotliDecoderErrorCode result;
1502
17
        result = WriteRingBuffer(
1503
17
            s, available_out, next_out, total_out, BROTLI_FALSE);
1504
17
        if (result != BROTLI_DECODER_SUCCESS) {
1505
0
          return result;
1506
0
        }
1507
17
        if (s->ringbuffer_size == 1 << s->window_bits) {
1508
17
          s->max_distance = s->max_backward_distance;
1509
17
        }
1510
17
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1511
17
        break;
1512
17
      }
1513
66
    }
1514
66
  }
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
1.62k
static int GetCompoundDictionarySize(BrotliDecoderState* s) {
1579
1.62k
  return s->compound_dictionary ? s->compound_dictionary->total_size : 0;
1580
1.62k
}
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
1.06k
    BrotliDecoderState* s) {
1635
1.06k
  int window_size = 1 << s->window_bits;
1636
1.06k
  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
1.06k
  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
1640
1.06k
  int output_size;
1641
1642
  /* If maximum is already reached, no further extension is retired. */
1643
1.06k
  if (s->ringbuffer_size == window_size) {
1644
12
    return;
1645
12
  }
1646
1647
  /* Metadata blocks does not touch ring buffer. */
1648
1.04k
  if (s->is_metadata) {
1649
0
    return;
1650
0
  }
1651
1652
1.04k
  if (!s->ringbuffer) {
1653
962
    output_size = 0;
1654
962
  } else {
1655
87
    output_size = s->pos;
1656
87
  }
1657
1.04k
  output_size += s->meta_block_remaining_len;
1658
1.04k
  min_size = min_size < output_size ? output_size : min_size;
1659
1660
1.04k
  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
3.72k
    while ((new_ringbuffer_size >> 1) >= min_size) {
1665
2.67k
      new_ringbuffer_size >>= 1;
1666
2.67k
    }
1667
1.04k
  }
1668
1669
1.04k
  s->new_ringbuffer_size = new_ringbuffer_size;
1670
1.04k
}
1671
1672
/* Reads 1..256 2-bit context modes. */
1673
905
static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1674
905
  BrotliBitReader* br = &s->br;
1675
905
  int i = s->loop_counter;
1676
1677
19.0k
  while (i < (int)s->num_block_types[0]) {
1678
18.1k
    brotli_reg_t bits;
1679
18.1k
    if (!BrotliSafeReadBits(br, 2, &bits)) {
1680
4
      s->loop_counter = i;
1681
4
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1682
4
    }
1683
18.1k
    s->context_modes[i] = (uint8_t)bits;
1684
18.1k
    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1685
18.1k
    i++;
1686
18.1k
  }
1687
901
  return BROTLI_DECODER_SUCCESS;
1688
905
}
1689
1690
17.4k
static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1691
17.4k
  int offset = s->distance_code - 3;
1692
17.4k
  if (s->distance_code <= 3) {
1693
    /* Compensate double distance-ring-buffer roll for dictionary items. */
1694
13.1k
    s->distance_context = 1 >> s->distance_code;
1695
13.1k
    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
1696
13.1k
    s->dist_rb_idx -= s->distance_context;
1697
13.1k
  } else {
1698
4.36k
    int index_delta = 3;
1699
4.36k
    int delta;
1700
4.36k
    int base = s->distance_code - 10;
1701
4.36k
    if (s->distance_code < 10) {
1702
2.45k
      base = s->distance_code - 4;
1703
2.45k
    } else {
1704
1.91k
      index_delta = 2;
1705
1.91k
    }
1706
    /* Unpack one of six 4-bit values. */
1707
4.36k
    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
1708
4.36k
    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
1709
4.36k
    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
4.36k
  }
1715
17.4k
}
1716
1717
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1718
26.2k
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1719
26.2k
  if (n_bits != 0) {
1720
4.12k
    return BrotliSafeReadBits(br, n_bits, val);
1721
22.1k
  } else {
1722
22.1k
    *val = 0;
1723
22.1k
    return BROTLI_TRUE;
1724
22.1k
  }
1725
26.2k
}
1726
1727
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
1728
472
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1729
472
  if (n_bits != 0) {
1730
450
    return BrotliSafeReadBits32(br, n_bits, val);
1731
450
  } else {
1732
22
    *val = 0;
1733
22
    return BROTLI_TRUE;
1734
22
  }
1735
472
}
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
638
static void CalculateDistanceLut(BrotliDecoderState* s) {
1805
638
  BrotliMetablockBodyArena* b = &s->arena.body;
1806
638
  brotli_reg_t npostfix = s->distance_postfix_bits;
1807
638
  brotli_reg_t ndirect = s->num_direct_distance_codes;
1808
638
  brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
1809
638
  brotli_reg_t postfix = (brotli_reg_t)1u << npostfix;
1810
638
  brotli_reg_t j;
1811
638
  brotli_reg_t bits = 1;
1812
638
  brotli_reg_t half = 0;
1813
1814
  /* Skip short codes. */
1815
638
  brotli_reg_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
1816
1817
  /* Fill direct codes. */
1818
15.9k
  for (j = 0; j < ndirect; ++j) {
1819
15.3k
    b->dist_extra_bits[i] = 0;
1820
15.3k
    b->dist_offset[i] = j + 1;
1821
15.3k
    ++i;
1822
15.3k
  }
1823
1824
  /* Fill regular distance codes. */
1825
31.2k
  while (i < alphabet_size_limit) {
1826
30.6k
    brotli_reg_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
1827
    /* Always fill the complete group. */
1828
152k
    for (j = 0; j < postfix; ++j) {
1829
121k
      b->dist_extra_bits[i] = (uint8_t)bits;
1830
121k
      b->dist_offset[i] = base + j;
1831
121k
      ++i;
1832
121k
    }
1833
30.6k
    bits = bits + half;
1834
30.6k
    half = half ^ 1;
1835
30.6k
  }
1836
638
}
1837
1838
/* Precondition: s->distance_code < 0. */
1839
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
1840
27.9k
    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1841
27.9k
  BrotliMetablockBodyArena* b = &s->arena.body;
1842
27.9k
  brotli_reg_t code;
1843
27.9k
  brotli_reg_t bits;
1844
27.9k
  BrotliBitReaderState memento;
1845
27.9k
  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1846
27.9k
  if (!safe) {
1847
27.0k
    code = ReadSymbol(distance_tree, br);
1848
27.0k
  } else {
1849
888
    BrotliBitReaderSaveState(br, &memento);
1850
888
    if (!SafeReadSymbol(distance_tree, br, &code)) {
1851
10
      return BROTLI_FALSE;
1852
10
    }
1853
888
  }
1854
27.9k
  --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
27.9k
  s->distance_context = 0;
1858
27.9k
  if ((code & ~0xFu) == 0) {
1859
17.4k
    s->distance_code = (int)code;
1860
17.4k
    TakeDistanceFromRingBuffer(s);
1861
17.4k
    return BROTLI_TRUE;
1862
17.4k
  }
1863
10.4k
  if (!safe) {
1864
9.95k
    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
1865
9.95k
  } else {
1866
472
    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
1867
17
      ++s->block_length[2];
1868
17
      BrotliBitReaderRestoreState(br, &memento);
1869
17
      return BROTLI_FALSE;
1870
17
    }
1871
472
  }
1872
10.4k
  s->distance_code =
1873
10.4k
      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
1874
10.4k
  return BROTLI_TRUE;
1875
10.4k
}
1876
1877
static BROTLI_INLINE void ReadDistance(
1878
27.0k
    BrotliDecoderState* s, BrotliBitReader* br) {
1879
27.0k
  ReadDistanceInternal(0, s, br);
1880
27.0k
}
1881
1882
static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
1883
888
    BrotliDecoderState* s, BrotliBitReader* br) {
1884
888
  return ReadDistanceInternal(1, s, br);
1885
888
}
1886
1887
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
1888
610k
    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1889
610k
  brotli_reg_t cmd_code;
1890
610k
  brotli_reg_t insert_len_extra = 0;
1891
610k
  brotli_reg_t copy_length;
1892
610k
  CmdLutElement v;
1893
610k
  BrotliBitReaderState memento;
1894
610k
  if (!safe) {
1895
597k
    cmd_code = ReadSymbol(s->htree_command, br);
1896
597k
  } else {
1897
13.2k
    BrotliBitReaderSaveState(br, &memento);
1898
13.2k
    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
1899
75
      return BROTLI_FALSE;
1900
75
    }
1901
13.2k
  }
1902
610k
  v = kCmdLut[cmd_code];
1903
610k
  s->distance_code = v.distance_code;
1904
610k
  s->distance_context = v.context;
1905
610k
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1906
610k
  *insert_length = v.insert_len_offset;
1907
610k
  if (!safe) {
1908
597k
    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1909
113k
      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
1910
113k
    }
1911
597k
    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
1912
597k
  } else {
1913
13.1k
    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1914
13.1k
        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1915
26
      BrotliBitReaderRestoreState(br, &memento);
1916
26
      return BROTLI_FALSE;
1917
26
    }
1918
13.1k
  }
1919
610k
  s->copy_length = (int)copy_length + v.copy_len_offset;
1920
610k
  --s->block_length[1];
1921
610k
  *insert_length += (int)insert_len_extra;
1922
610k
  return BROTLI_TRUE;
1923
610k
}
1924
1925
static BROTLI_INLINE void ReadCommand(
1926
597k
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1927
597k
  ReadCommandInternal(0, s, br, insert_length);
1928
597k
}
1929
1930
static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
1931
13.2k
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1932
13.2k
  return ReadCommandInternal(1, s, br, insert_length);
1933
13.2k
}
1934
1935
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
1936
1.03M
    int safe, BrotliBitReader* const br) {
1937
1.03M
  if (safe) {
1938
13.9k
    return BROTLI_TRUE;
1939
13.9k
  }
1940
1.02M
  return BrotliCheckInputAmount(br);
1941
1.03M
}
1942
1943
#define BROTLI_SAFE(METHOD)                       \
1944
733k
  {                                               \
1945
733k
    if (safe) {                                   \
1946
17.7k
      if (!Safe##METHOD) {                        \
1947
178
        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
1948
178
        goto saveStateAndReturn;                  \
1949
178
      }                                           \
1950
715k
    } else {                                      \
1951
715k
      METHOD;                                     \
1952
715k
    }                                             \
1953
733k
  }
1954
1955
static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
1956
1.62k
    int safe, BrotliDecoderState* s) {
1957
1.62k
  int pos = s->pos;
1958
1.62k
  int i = s->loop_counter;
1959
1.62k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1960
1.62k
  BrotliBitReader* br = &s->br;
1961
1.62k
  int compound_dictionary_size = GetCompoundDictionarySize(s);
1962
1963
1.62k
  if (!CheckInputAmount(safe, br)) {
1964
44
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1965
44
    goto saveStateAndReturn;
1966
44
  }
1967
1.57k
  if (!safe) {
1968
1.11k
    BROTLI_UNUSED(BrotliWarmupBitReader(br));
1969
1.11k
  }
1970
1971
  /* Jump into state machine. */
1972
1.57k
  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
1973
730
    goto CommandBegin;
1974
849
  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
1975
416
    goto CommandInner;
1976
433
  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
1977
12
    goto CommandPostDecodeLiterals;
1978
421
  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
1979
421
    goto CommandPostWrapCopy;
1980
421
  } else {
1981
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1982
0
  }
1983
1984
612k
CommandBegin:
1985
612k
  if (safe) {
1986
13.4k
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1987
13.4k
  }
1988
612k
  if (!CheckInputAmount(safe, br)) {
1989
90
    s->state = BROTLI_STATE_COMMAND_BEGIN;
1990
90
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
1991
90
    goto saveStateAndReturn;
1992
90
  }
1993
612k
  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
1994
1.91k
    BROTLI_SAFE(DecodeCommandBlockSwitch(s));
1995
1.91k
    goto CommandBegin;
1996
1.91k
  }
1997
  /* Read the insert/copy length in the command. */
1998
610k
  BROTLI_SAFE(ReadCommand(s, br, &i));
1999
610k
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
2000
610k
              pos, i, s->copy_length));
2001
610k
  if (i == 0) {
2002
266k
    goto CommandPostDecodeLiterals;
2003
266k
  }
2004
343k
  s->meta_block_remaining_len -= i;
2005
2006
437k
CommandInner:
2007
437k
  if (safe) {
2008
13.3k
    s->state = BROTLI_STATE_COMMAND_INNER;
2009
13.3k
  }
2010
  /* Read the literals in the command. */
2011
437k
  if (s->trivial_literal_context) {
2012
437k
    brotli_reg_t bits;
2013
437k
    brotli_reg_t value;
2014
437k
    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
2015
437k
    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
423k
      int num_steps = i - 1;
2023
423k
      if (num_steps > 0 && ((brotli_reg_t)(num_steps) > s->block_length[0])) {
2024
        // Safe cast, since block_length < steps
2025
80.9k
        num_steps = (int)s->block_length[0];
2026
80.9k
      }
2027
423k
      if (s->ringbuffer_size >= pos &&
2028
423k
          (s->ringbuffer_size - pos) <= num_steps) {
2029
92
        num_steps = s->ringbuffer_size - pos - 1;
2030
92
      }
2031
423k
      if (num_steps < 0) {
2032
0
        num_steps = 0;
2033
0
      }
2034
423k
      num_steps = BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits,
2035
423k
                                                 &value, s->ringbuffer, pos,
2036
423k
                                                 num_steps);
2037
423k
      pos += num_steps;
2038
423k
      s->block_length[0] -= (brotli_reg_t)num_steps;
2039
423k
      i -= num_steps;
2040
423k
      do {
2041
423k
        if (!CheckInputAmount(safe, br)) {
2042
328
          s->state = BROTLI_STATE_COMMAND_INNER;
2043
328
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2044
328
          goto saveStateAndReturn;
2045
328
        }
2046
423k
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2047
89.4k
          goto NextLiteralBlock;
2048
89.4k
        }
2049
334k
        BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, &value,
2050
334k
                                       s->ringbuffer, pos, 1);
2051
334k
        --s->block_length[0];
2052
334k
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2053
334k
        ++pos;
2054
334k
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2055
97
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2056
97
          --i;
2057
97
          goto saveStateAndReturn;
2058
97
        }
2059
334k
      } while (--i != 0);
2060
423k
    } else { /* safe */
2061
76.8k
      do {
2062
76.8k
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2063
3.41k
          goto NextLiteralBlock;
2064
3.41k
        }
2065
73.4k
        brotli_reg_t literal;
2066
73.4k
        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
2067
189
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2068
189
          goto saveStateAndReturn;
2069
189
        }
2070
73.2k
        s->ringbuffer[pos] = (uint8_t)literal;
2071
73.2k
        --s->block_length[0];
2072
73.2k
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2073
73.2k
        ++pos;
2074
73.2k
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2075
8
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2076
8
          --i;
2077
8
          goto saveStateAndReturn;
2078
8
        }
2079
73.2k
      } while (--i != 0);
2080
13.3k
    }
2081
437k
  } else {
2082
14
    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2083
14
    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2084
36
    do {
2085
36
      const HuffmanCode* hc;
2086
36
      uint8_t context;
2087
36
      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
36
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2093
11
        goto NextLiteralBlock;
2094
11
      }
2095
25
      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
2096
25
      BROTLI_LOG_UINT(context);
2097
25
      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
2098
25
      p2 = p1;
2099
25
      if (!safe) {
2100
0
        p1 = (uint8_t)ReadSymbol(hc, br);
2101
25
      } else {
2102
25
        brotli_reg_t literal;
2103
25
        if (!SafeReadSymbol(hc, br, &literal)) {
2104
3
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2105
3
          goto saveStateAndReturn;
2106
3
        }
2107
22
        p1 = (uint8_t)literal;
2108
22
      }
2109
22
      s->ringbuffer[pos] = p1;
2110
22
      --s->block_length[0];
2111
22
      BROTLI_LOG_UINT(s->context_map_slice[context]);
2112
22
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
2113
22
      ++pos;
2114
22
      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
22
    } while (--i != 0);
2120
14
  }
2121
343k
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2122
343k
  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
2123
52
    s->state = BROTLI_STATE_METABLOCK_DONE;
2124
52
    goto saveStateAndReturn;
2125
52
  }
2126
2127
610k
CommandPostDecodeLiterals:
2128
610k
  if (safe) {
2129
13.2k
    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2130
13.2k
  }
2131
610k
  if (s->distance_code >= 0) {
2132
    /* Implicit distance case. */
2133
582k
    s->distance_context = s->distance_code ? 0 : 1;
2134
582k
    --s->dist_rb_idx;
2135
582k
    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
2136
582k
  } else {
2137
    /* Read distance code in the command, unless it was implicitly zero. */
2138
27.9k
    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
2139
0
      BROTLI_SAFE(DecodeDistanceBlockSwitch(s));
2140
0
    }
2141
27.9k
    BROTLI_SAFE(ReadDistance(s, br));
2142
27.8k
  }
2143
610k
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
2144
610k
              pos, s->distance_code));
2145
610k
  if (s->max_distance != s->max_backward_distance) {
2146
400k
    s->max_distance =
2147
400k
        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
2148
400k
  }
2149
610k
  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
610k
  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
6.62k
    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
6.61k
    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
6.61k
    } else if (i >= SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
2174
6.60k
               i <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
2175
6.58k
      uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2176
6.58k
      uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2177
6.58k
      uint8_t dict_id = s->dictionary->context_based ?
2178
0
          s->dictionary->context_map[BROTLI_CONTEXT(p1, p2, s->context_lookup)]
2179
6.58k
          : 0;
2180
6.58k
      const BrotliDictionary* words = s->dictionary->words[dict_id];
2181
6.58k
      const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
2182
6.58k
      int offset = (int)words->offsets_by_length[i];
2183
6.58k
      brotli_reg_t shift = words->size_bits_by_length[i];
2184
6.58k
      int address =
2185
6.58k
          s->distance_code - s->max_distance - 1 - compound_dictionary_size;
2186
6.58k
      int mask = (int)BitMask(shift);
2187
6.58k
      int word_idx = address & mask;
2188
6.58k
      int transform_idx = address >> shift;
2189
      /* Compensate double distance-ring-buffer roll. */
2190
6.58k
      s->dist_rb_idx += s->distance_context;
2191
6.58k
      offset += word_idx * i;
2192
      /* If the distance is out of bound, select a next static dictionary if
2193
         there exist multiple. */
2194
6.58k
      if ((transform_idx >= (int)transforms->num_transforms ||
2195
6.56k
          words->size_bits_by_length[i] == 0) &&
2196
24
          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
6.58k
      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
6.58k
      if (BROTLI_PREDICT_FALSE(!words->data)) {
2232
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
2233
0
      }
2234
6.58k
      if (transform_idx < (int)transforms->num_transforms) {
2235
6.56k
        const uint8_t* word = &words->data[offset];
2236
6.56k
        int len = i;
2237
6.56k
        if (transform_idx == transforms->cutOffTransforms[0]) {
2238
1.40k
          memcpy(&s->ringbuffer[pos], word, (size_t)len);
2239
1.40k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
2240
1.40k
                      len, word));
2241
5.15k
        } else {
2242
5.15k
          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
2243
5.15k
              transforms, transform_idx);
2244
5.15k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
2245
5.15k
                      " transform_idx = %d, transformed: [%.*s]\n",
2246
5.15k
                      i, word, transform_idx, len, &s->ringbuffer[pos]));
2247
5.15k
          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
5.15k
        }
2252
6.56k
        pos += len;
2253
6.56k
        s->meta_block_remaining_len -= len;
2254
6.56k
        if (pos >= s->ringbuffer_size) {
2255
2
          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
2256
2
          goto saveStateAndReturn;
2257
2
        }
2258
6.56k
      } else {
2259
21
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2260
21
            "len: %d bytes left: %d\n",
2261
21
            pos, s->distance_code, i, s->meta_block_remaining_len));
2262
21
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
2263
21
      }
2264
6.58k
    } else {
2265
32
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2266
32
          "len: %d bytes left: %d\n",
2267
32
          pos, s->distance_code, i, s->meta_block_remaining_len));
2268
32
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2269
32
    }
2270
603k
  } else {
2271
603k
    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
2272
603k
    uint8_t* copy_dst = &s->ringbuffer[pos];
2273
603k
    uint8_t* copy_src = &s->ringbuffer[src_start];
2274
603k
    int dst_end = pos + i;
2275
603k
    int src_end = src_start + i;
2276
    /* Update the recent distances cache. */
2277
603k
    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
2278
603k
    ++s->dist_rb_idx;
2279
603k
    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
603k
    memmove16(copy_dst, copy_src);
2284
603k
    if (src_end > pos && dst_end > src_start) {
2285
      /* Regions intersect. */
2286
293k
      goto CommandPostWrapCopy;
2287
293k
    }
2288
309k
    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
2289
      /* At least one region wraps. */
2290
241
      goto CommandPostWrapCopy;
2291
241
    }
2292
309k
    pos += i;
2293
309k
    if (i > 16) {
2294
1.70k
      if (i > 32) {
2295
648
        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
2296
1.06k
      } else {
2297
        /* This branch covers about 45% cases.
2298
           Fixed size short copy allows more compiler optimizations. */
2299
1.06k
        memmove16(copy_dst + 16, copy_src + 16);
2300
1.06k
      }
2301
1.70k
    }
2302
309k
  }
2303
316k
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2304
316k
  if (s->meta_block_remaining_len <= 0) {
2305
    /* Next metablock, if any. */
2306
31
    s->state = BROTLI_STATE_METABLOCK_DONE;
2307
31
    goto saveStateAndReturn;
2308
316k
  } else {
2309
316k
    goto CommandBegin;
2310
316k
  }
2311
294k
CommandPostWrapCopy:
2312
294k
  {
2313
294k
    int wrap_guard = s->ringbuffer_size - pos;
2314
4.08M
    while (--i >= 0) {
2315
3.79M
      s->ringbuffer[pos] =
2316
3.79M
          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
2317
3.79M
      ++pos;
2318
3.79M
      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
2319
444
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
2320
444
        goto saveStateAndReturn;
2321
444
      }
2322
3.79M
    }
2323
294k
  }
2324
293k
  if (s->meta_block_remaining_len <= 0) {
2325
    /* Next metablock, if any. */
2326
93
    s->state = BROTLI_STATE_METABLOCK_DONE;
2327
93
    goto saveStateAndReturn;
2328
293k
  } else {
2329
293k
    goto CommandBegin;
2330
293k
  }
2331
2332
92.9k
NextLiteralBlock:
2333
92.9k
  BROTLI_SAFE(DecodeLiteralBlockSwitch(s));
2334
92.8k
  goto CommandInner;
2335
2336
1.55k
saveStateAndReturn:
2337
1.55k
  s->pos = pos;
2338
1.55k
  s->loop_counter = i;
2339
1.55k
  return result;
2340
92.9k
}
2341
2342
#undef BROTLI_SAFE
2343
2344
static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
2345
1.16k
    BrotliDecoderState* s) {
2346
1.16k
  return ProcessCommandsInternal(0, s);
2347
1.16k
}
2348
2349
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
2350
462
    BrotliDecoderState* s) {
2351
462
  return ProcessCommandsInternal(1, s);
2352
462
}
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
1.03k
    size_t* available_out, uint8_t** next_out, size_t* total_out) {
2393
1.03k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2394
1.03k
  BrotliBitReader* br = &s->br;
2395
1.03k
  size_t input_size = *available_in;
2396
1.03k
#define BROTLI_SAVE_ERROR_CODE(code) \
2397
1.03k
    SaveErrorCode(s, (code), input_size - *available_in)
2398
  /* Ensure that |total_out| is set, even if no data will ever be pushed out. */
2399
1.03k
  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
1.03k
  if ((int)s->error_code < 0) {
2404
0
    return BROTLI_DECODER_RESULT_ERROR;
2405
0
  }
2406
1.03k
  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
1.03k
  if (!*available_out) next_out = 0;
2411
1.03k
  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
2412
1.03k
    BrotliBitReaderSetInput(br, *next_in, *available_in);
2413
1.03k
  } 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
9.94k
  for (;;) {
2422
9.94k
    if (result != BROTLI_DECODER_SUCCESS) {
2423
      /* Error, needs more input/output. */
2424
977
      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2425
513
        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
2426
407
          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
2427
407
              available_out, next_out, total_out, BROTLI_TRUE);
2428
          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
2429
407
          if ((int)intermediate_result < 0) {
2430
6
            result = intermediate_result;
2431
6
            break;
2432
6
          }
2433
407
        }
2434
507
        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
507
        } else {  /* Input stream doesn't contain enough input. */
2460
          /* Copy tail to internal buffer and return. */
2461
507
          *next_in = br->next_in;
2462
507
          *available_in = BrotliBitReaderGetAvailIn(br);
2463
510
          while (*available_in) {
2464
3
            s->buffer.u8[s->buffer_length] = **next_in;
2465
3
            s->buffer_length++;
2466
3
            (*next_in)++;
2467
3
            (*available_in)--;
2468
3
          }
2469
507
          break;
2470
507
        }
2471
        /* Unreachable. */
2472
507
      }
2473
2474
      /* Fail or needs more output. */
2475
2476
464
      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
464
      } 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
464
        BrotliBitReaderUnload(br);
2485
464
        *available_in = BrotliBitReaderGetAvailIn(br);
2486
464
        *next_in = br->next_in;
2487
464
      }
2488
464
      break;
2489
977
    }
2490
8.97k
    switch (s->state) {
2491
1.03k
      case BROTLI_STATE_UNINITED:
2492
        /* Prepare to the first read. */
2493
1.03k
        if (!BrotliWarmupBitReader(br)) {
2494
2
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2495
2
          break;
2496
2
        }
2497
        /* Decode window size. */
2498
1.03k
        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
2499
1.03k
        if (result != BROTLI_DECODER_SUCCESS) {
2500
2
          break;
2501
2
        }
2502
1.03k
        if (s->large_window) {
2503
0
          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
2504
0
          break;
2505
0
        }
2506
1.03k
        s->state = BROTLI_STATE_INITIALIZE;
2507
1.03k
        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
1.03k
      case BROTLI_STATE_INITIALIZE:
2526
1.03k
        BROTLI_LOG_UINT(s->window_bits);
2527
        /* Maximum distance, see section 9.1. of the spec. */
2528
1.03k
        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
1.03k
        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
2532
1.03k
            sizeof(HuffmanCode) * 3 *
2533
1.03k
                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2534
1.03k
        if (s->block_type_trees == 0) {
2535
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES);
2536
0
          break;
2537
0
        }
2538
1.03k
        s->block_len_trees =
2539
1.03k
            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
2540
2541
1.03k
        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2542
      /* Fall through. */
2543
2544
1.25k
      case BROTLI_STATE_METABLOCK_BEGIN:
2545
1.25k
        BrotliDecoderStateMetablockBegin(s);
2546
1.25k
        BROTLI_LOG_UINT(s->pos);
2547
1.25k
        s->state = BROTLI_STATE_METABLOCK_HEADER;
2548
      /* Fall through. */
2549
2550
1.25k
      case BROTLI_STATE_METABLOCK_HEADER:
2551
1.25k
        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
2552
1.25k
        if (result != BROTLI_DECODER_SUCCESS) {
2553
25
          break;
2554
25
        }
2555
1.22k
        BROTLI_LOG_UINT(s->is_last_metablock);
2556
1.22k
        BROTLI_LOG_UINT(s->meta_block_remaining_len);
2557
1.22k
        BROTLI_LOG_UINT(s->is_metadata);
2558
1.22k
        BROTLI_LOG_UINT(s->is_uncompressed);
2559
1.22k
        if (s->is_metadata || s->is_uncompressed) {
2560
177
          if (!BrotliJumpToByteBoundary(br)) {
2561
12
            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
2562
12
            break;
2563
12
          }
2564
177
        }
2565
1.21k
        if (s->is_metadata) {
2566
116
          s->state = BROTLI_STATE_METADATA;
2567
116
          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
116
          break;
2572
116
        }
2573
1.10k
        if (s->meta_block_remaining_len == 0) {
2574
40
          s->state = BROTLI_STATE_METABLOCK_DONE;
2575
40
          break;
2576
40
        }
2577
1.06k
        BrotliCalculateRingBufferSize(s);
2578
1.06k
        if (s->is_uncompressed) {
2579
49
          s->state = BROTLI_STATE_UNCOMPRESSED;
2580
49
          break;
2581
49
        }
2582
1.01k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER;
2583
      /* Fall through. */
2584
2585
1.01k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: {
2586
1.01k
        BrotliMetablockHeaderArena* h = &s->arena.header;
2587
1.01k
        s->loop_counter = 0;
2588
        /* Initialize compressed metablock header arena. */
2589
1.01k
        h->sub_loop_counter = 0;
2590
        /* Make small negative indexes addressable. */
2591
1.01k
        h->symbol_lists =
2592
1.01k
            &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
2593
1.01k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
2594
1.01k
        h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
2595
1.01k
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
2596
1.01k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2597
1.01k
      }
2598
      /* Fall through. */
2599
2600
3.81k
      case BROTLI_STATE_HUFFMAN_CODE_0:
2601
3.81k
        if (s->loop_counter >= 3) {
2602
908
          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
2603
908
          break;
2604
908
        }
2605
        /* Reads 1..11 bits. */
2606
2.90k
        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
2607
2.90k
        if (result != BROTLI_DECODER_SUCCESS) {
2608
3
          break;
2609
3
        }
2610
2.90k
        s->num_block_types[s->loop_counter]++;
2611
2.90k
        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2612
2.90k
        if (s->num_block_types[s->loop_counter] < 2) {
2613
2.31k
          s->loop_counter++;
2614
2.31k
          break;
2615
2.31k
        }
2616
586
        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2617
      /* Fall through. */
2618
2619
586
      case BROTLI_STATE_HUFFMAN_CODE_1: {
2620
586
        brotli_reg_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
2621
586
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2622
586
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2623
586
            &s->block_type_trees[tree_offset], NULL, s);
2624
586
        if (result != BROTLI_DECODER_SUCCESS) break;
2625
521
        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2626
521
      }
2627
      /* Fall through. */
2628
2629
521
      case BROTLI_STATE_HUFFMAN_CODE_2: {
2630
521
        brotli_reg_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
2631
521
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2632
521
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2633
521
            &s->block_len_trees[tree_offset], NULL, s);
2634
521
        if (result != BROTLI_DECODER_SUCCESS) break;
2635
487
        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2636
487
      }
2637
      /* Fall through. */
2638
2639
487
      case BROTLI_STATE_HUFFMAN_CODE_3: {
2640
487
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2641
487
        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2642
487
            &s->block_len_trees[tree_offset], br)) {
2643
2
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2644
2
          break;
2645
2
        }
2646
485
        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2647
485
        s->loop_counter++;
2648
485
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2649
485
        break;
2650
487
      }
2651
2652
49
      case BROTLI_STATE_UNCOMPRESSED: {
2653
49
        result = CopyUncompressedBlockToOutput(
2654
49
            available_out, next_out, total_out, s);
2655
49
        if (result != BROTLI_DECODER_SUCCESS) {
2656
22
          break;
2657
22
        }
2658
27
        s->state = BROTLI_STATE_METABLOCK_DONE;
2659
27
        break;
2660
49
      }
2661
2662
116
      case BROTLI_STATE_METADATA:
2663
116
        result = SkipMetadataBlock(s);
2664
116
        if (result != BROTLI_DECODER_SUCCESS) {
2665
15
          break;
2666
15
        }
2667
101
        s->state = BROTLI_STATE_METABLOCK_DONE;
2668
101
        break;
2669
2670
908
      case BROTLI_STATE_METABLOCK_HEADER_2: {
2671
908
        brotli_reg_t bits;
2672
908
        if (!BrotliSafeReadBits(br, 6, &bits)) {
2673
3
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2674
3
          break;
2675
3
        }
2676
905
        s->distance_postfix_bits = bits & BitMask(2);
2677
905
        bits >>= 2;
2678
905
        s->num_direct_distance_codes = bits << s->distance_postfix_bits;
2679
905
        BROTLI_LOG_UINT(s->num_direct_distance_codes);
2680
905
        BROTLI_LOG_UINT(s->distance_postfix_bits);
2681
905
        s->context_modes =
2682
905
            (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
2683
905
        if (s->context_modes == 0) {
2684
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
2685
0
          break;
2686
0
        }
2687
905
        s->loop_counter = 0;
2688
905
        s->state = BROTLI_STATE_CONTEXT_MODES;
2689
905
      }
2690
      /* Fall through. */
2691
2692
905
      case BROTLI_STATE_CONTEXT_MODES:
2693
905
        result = ReadContextModes(s);
2694
905
        if (result != BROTLI_DECODER_SUCCESS) {
2695
4
          break;
2696
4
        }
2697
901
        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2698
      /* Fall through. */
2699
2700
901
      case BROTLI_STATE_CONTEXT_MAP_1:
2701
901
        result = DecodeContextMap(
2702
901
            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2703
901
            &s->num_literal_htrees, &s->context_map, s);
2704
901
        if (result != BROTLI_DECODER_SUCCESS) {
2705
50
          break;
2706
50
        }
2707
851
        DetectTrivialLiteralBlockTypes(s);
2708
851
        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2709
      /* Fall through. */
2710
2711
851
      case BROTLI_STATE_CONTEXT_MAP_2: {
2712
851
        brotli_reg_t npostfix = s->distance_postfix_bits;
2713
851
        brotli_reg_t ndirect = s->num_direct_distance_codes;
2714
851
        brotli_reg_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2715
851
            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
2716
851
        brotli_reg_t distance_alphabet_size_limit = distance_alphabet_size_max;
2717
851
        BROTLI_BOOL allocation_success = BROTLI_TRUE;
2718
851
        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
851
        result = DecodeContextMap(
2727
851
            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2728
851
            &s->num_dist_htrees, &s->dist_context_map, s);
2729
851
        if (result != BROTLI_DECODER_SUCCESS) {
2730
32
          break;
2731
32
        }
2732
819
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2733
819
            s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
2734
819
            BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
2735
819
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2736
819
            s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
2737
819
            BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
2738
819
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2739
819
            s, &s->distance_hgroup, distance_alphabet_size_max,
2740
819
            distance_alphabet_size_limit, s->num_dist_htrees);
2741
819
        if (!allocation_success) {
2742
0
          return BROTLI_SAVE_ERROR_CODE(
2743
0
              BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
2744
0
        }
2745
819
        s->loop_counter = 0;
2746
819
        s->state = BROTLI_STATE_TREE_GROUP;
2747
819
      }
2748
      /* Fall through. */
2749
2750
2.20k
      case BROTLI_STATE_TREE_GROUP: {
2751
2.20k
        HuffmanTreeGroup* hgroup = NULL;
2752
2.20k
        switch (s->loop_counter) {
2753
819
          case 0: hgroup = &s->literal_hgroup; break;
2754
722
          case 1: hgroup = &s->insert_copy_hgroup; break;
2755
665
          case 2: hgroup = &s->distance_hgroup; break;
2756
0
          default: return BROTLI_SAVE_ERROR_CODE(BROTLI_FAILURE(
2757
2.20k
              BROTLI_DECODER_ERROR_UNREACHABLE));  /* COV_NF_LINE */
2758
2.20k
        }
2759
2.20k
        result = HuffmanTreeGroupDecode(hgroup, s);
2760
2.20k
        if (result != BROTLI_DECODER_SUCCESS) break;
2761
2.02k
        s->loop_counter++;
2762
2.02k
        if (s->loop_counter < 3) {
2763
1.38k
          break;
2764
1.38k
        }
2765
638
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY;
2766
638
      }
2767
      /* Fall through. */
2768
2769
638
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY:
2770
638
        PrepareLiteralDecoding(s);
2771
638
        s->dist_context_map_slice = s->dist_context_map;
2772
638
        s->htree_command = s->insert_copy_hgroup.htrees[0];
2773
638
        if (!BrotliEnsureRingBuffer(s)) {
2774
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
2775
0
          break;
2776
0
        }
2777
638
        CalculateDistanceLut(s);
2778
638
        s->state = BROTLI_STATE_COMMAND_BEGIN;
2779
      /* Fall through. */
2780
2781
640
      case BROTLI_STATE_COMMAND_BEGIN:
2782
      /* Fall through. */
2783
728
      case BROTLI_STATE_COMMAND_INNER:
2784
      /* Fall through. */
2785
740
      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2786
      /* Fall through. */
2787
1.16k
      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2788
1.16k
        result = ProcessCommands(s);
2789
1.16k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2790
462
          result = SafeProcessCommands(s);
2791
462
        }
2792
1.16k
        break;
2793
2794
105
      case BROTLI_STATE_COMMAND_INNER_WRITE:
2795
      /* Fall through. */
2796
107
      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2797
      /* Fall through. */
2798
551
      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2799
551
        result = WriteRingBuffer(
2800
551
            s, available_out, next_out, total_out, BROTLI_FALSE);
2801
551
        if (result != BROTLI_DECODER_SUCCESS) {
2802
28
          break;
2803
28
        }
2804
523
        WrapRingBuffer(s);
2805
523
        if (s->ringbuffer_size == 1 << s->window_bits) {
2806
523
          s->max_distance = s->max_backward_distance;
2807
523
        }
2808
523
        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
2809
2
          BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
2810
2
          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
2
          if (s->meta_block_remaining_len == 0) {
2815
            /* Next metablock, if any. */
2816
0
            s->state = BROTLI_STATE_METABLOCK_DONE;
2817
2
          } else {
2818
2
            s->state = BROTLI_STATE_COMMAND_BEGIN;
2819
2
          }
2820
2
          break;
2821
521
        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2822
421
          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2823
421
        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2824
100
          if (s->loop_counter == 0) {
2825
12
            if (s->meta_block_remaining_len == 0) {
2826
0
              s->state = BROTLI_STATE_METABLOCK_DONE;
2827
12
            } else {
2828
12
              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2829
12
            }
2830
12
            break;
2831
12
          }
2832
88
          s->state = BROTLI_STATE_COMMAND_INNER;
2833
88
        }
2834
509
        break;
2835
2836
509
      case BROTLI_STATE_METABLOCK_DONE:
2837
344
        if (s->meta_block_remaining_len < 0) {
2838
57
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
2839
57
          break;
2840
57
        }
2841
287
        BrotliDecoderStateCleanupAfterMetablock(s);
2842
287
        if (!s->is_last_metablock) {
2843
221
          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2844
221
          break;
2845
221
        }
2846
66
        if (!BrotliJumpToByteBoundary(br)) {
2847
6
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2848
6
          break;
2849
6
        }
2850
60
        if (s->buffer_length == 0) {
2851
60
          BrotliBitReaderUnload(br);
2852
60
          *available_in = BrotliBitReaderGetAvailIn(br);
2853
60
          *next_in = br->next_in;
2854
60
        }
2855
60
        s->state = BROTLI_STATE_DONE;
2856
      /* Fall through. */
2857
2858
60
      case BROTLI_STATE_DONE:
2859
60
        if (s->ringbuffer != 0) {
2860
30
          result = WriteRingBuffer(
2861
30
              s, available_out, next_out, total_out, BROTLI_TRUE);
2862
30
          if (result != BROTLI_DECODER_SUCCESS) {
2863
0
            break;
2864
0
          }
2865
30
        }
2866
60
        return BROTLI_SAVE_ERROR_CODE(result);
2867
8.97k
    }
2868
8.97k
  }
2869
977
  return BROTLI_SAVE_ERROR_CODE(result);
2870
1.03k
#undef BROTLI_SAVE_ERROR_CODE
2871
1.03k
}
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
470
BrotliDecoderErrorCode BrotliDecoderGetErrorCode(const BrotliDecoderState* s) {
2918
470
  return (BrotliDecoderErrorCode)s->error_code;
2919
470
}
2920
2921
470
const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c) {
2922
470
  switch (c) {
2923
0
#define BROTLI_ERROR_CODE_CASE_(PREFIX, NAME, CODE) \
2924
470
    case BROTLI_DECODER ## PREFIX ## NAME: return #PREFIX #NAME;
2925
0
#define BROTLI_NOTHING_
2926
470
    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
470
  }
2931
470
}
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