Coverage Report

Created: 2026-10-14 08:19

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