Coverage Report

Created: 2026-05-24 07:45

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