Coverage Report

Created: 2026-08-04 07:11

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
1.58k
#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
2.42G
#define HUFFMAN_TABLE_BITS 8U
40
6.18k
#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
5.10k
    brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
82
5.10k
  BrotliDecoderState* state = 0;
83
5.10k
  if (!BrotliDecoderEnsureStaticInit()) {
84
0
    BROTLI_DUMP();
85
0
    return 0;
86
0
  }
87
5.10k
  if (!alloc_func && !free_func) {
88
5.10k
    state = (BrotliDecoderState*)malloc(sizeof(BrotliDecoderState));
89
5.10k
  } else if (alloc_func && free_func) {
90
0
    state = (BrotliDecoderState*)alloc_func(opaque, sizeof(BrotliDecoderState));
91
0
  }
92
5.10k
  if (state == 0) {
93
0
    BROTLI_DUMP();
94
0
    return 0;
95
0
  }
96
5.10k
  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
5.10k
  return state;
106
5.10k
}
107
108
/* Deinitializes and frees BrotliDecoderState instance. */
109
5.10k
void BrotliDecoderDestroyInstance(BrotliDecoderState* state) {
110
5.10k
  if (!state) {
111
0
    return;
112
5.10k
  } else {
113
5.10k
    brotli_free_func free_func = state->free_func;
114
5.10k
    void* opaque = state->memory_manager_opaque;
115
5.10k
    BrotliDecoderStateCleanup(state);
116
5.10k
    free_func(opaque, state);
117
5.10k
  }
118
5.10k
}
119
120
/* Saves error code and converts it to BrotliDecoderResult. */
121
static BROTLI_NOINLINE BrotliDecoderResult SaveErrorCode(
122
5.68M
    BrotliDecoderState* s, BrotliDecoderErrorCode e, size_t consumed_input) {
123
5.68M
  s->error_code = (int)e;
124
5.68M
  s->used_input += consumed_input;
125
5.68M
  if ((s->buffer_length != 0) && (s->br.next_in == s->br.last_in)) {
126
    /* If internal buffer is depleted at last, reset it. */
127
1
    s->buffer_length = 0;
128
1
  }
129
5.68M
  switch (e) {
130
106
    case BROTLI_DECODER_SUCCESS:
131
106
      return BROTLI_DECODER_RESULT_SUCCESS;
132
133
2.28M
    case BROTLI_DECODER_NEEDS_MORE_INPUT:
134
2.28M
      return BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT;
135
136
3.39M
    case BROTLI_DECODER_NEEDS_MORE_OUTPUT:
137
3.39M
      return BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT;
138
139
1.58k
    default:
140
1.58k
      return BROTLI_DECODER_RESULT_ERROR;
141
5.68M
  }
142
5.68M
}
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
5.10k
                                               BrotliBitReader* br) {
148
5.10k
  brotli_reg_t n;
149
5.10k
  BROTLI_BOOL large_window = s->large_window;
150
5.10k
  s->large_window = BROTLI_FALSE;
151
5.10k
  BrotliTakeBits(br, 1, &n);
152
5.10k
  if (n == 0) {
153
3.56k
    s->window_bits = 16;
154
3.56k
    return BROTLI_DECODER_SUCCESS;
155
3.56k
  }
156
1.54k
  BrotliTakeBits(br, 3, &n);
157
1.54k
  if (n != 0) {
158
889
    s->window_bits = (17u + n) & 63u;
159
889
    return BROTLI_DECODER_SUCCESS;
160
889
  }
161
656
  BrotliTakeBits(br, 3, &n);
162
656
  if (n == 1) {
163
2
    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
2
    } else {
171
2
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS);
172
2
    }
173
2
  }
174
654
  if (n != 0) {
175
576
    s->window_bits = (8u + n) & 63u;
176
576
    return BROTLI_DECODER_SUCCESS;
177
576
  }
178
78
  s->window_bits = 17;
179
78
  return BROTLI_DECODER_SUCCESS;
180
654
}
181
182
531M
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
531M
  uint32_t buffer[4];
187
531M
  memcpy(buffer, src, 16);
188
531M
  memcpy(dst, buffer, 16);
189
531M
#endif
190
531M
}
191
192
/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
193
static BROTLI_NOINLINE BrotliDecoderErrorCode DecodeVarLenUint8(
194
73.5k
    BrotliDecoderState* s, BrotliBitReader* br, brotli_reg_t* value) {
195
73.5k
  brotli_reg_t bits;
196
73.5k
  switch (s->substate_decode_uint8) {
197
71.9k
    case BROTLI_STATE_DECODE_UINT8_NONE:
198
71.9k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 1, &bits))) {
199
3.88k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
200
3.88k
      }
201
68.0k
      if (bits == 0) {
202
61.3k
        *value = 0;
203
61.3k
        return BROTLI_DECODER_SUCCESS;
204
61.3k
      }
205
    /* Fall through. */
206
207
7.49k
    case BROTLI_STATE_DECODE_UINT8_SHORT:
208
7.49k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, 3, &bits))) {
209
820
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_SHORT;
210
820
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
211
820
      }
212
6.67k
      if (bits == 0) {
213
4.05k
        *value = 1;
214
4.05k
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
215
4.05k
        return BROTLI_DECODER_SUCCESS;
216
4.05k
      }
217
      /* Use output value as a temporary storage. It MUST be persisted. */
218
2.62k
      *value = bits;
219
    /* Fall through. */
220
221
3.38k
    case BROTLI_STATE_DECODE_UINT8_LONG:
222
3.38k
      if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, *value, &bits))) {
223
796
        s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_LONG;
224
796
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
225
796
      }
226
2.58k
      *value = ((brotli_reg_t)1U << *value) + bits;
227
2.58k
      s->substate_decode_uint8 = BROTLI_STATE_DECODE_UINT8_NONE;
228
2.58k
      return BROTLI_DECODER_SUCCESS;
229
230
0
    default:
231
0
      return
232
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
233
73.5k
  }
234
73.5k
}
235
236
/* Decodes a metablock length and flags by reading 2 - 31 bits. */
237
static BrotliDecoderErrorCode BROTLI_NOINLINE DecodeMetaBlockLength(
238
40.4k
    BrotliDecoderState* s, BrotliBitReader* br) {
239
40.4k
  brotli_reg_t bits;
240
40.4k
  int i;
241
65.5k
  for (;;) {
242
65.5k
    switch (s->substate_metablock_header) {
243
24.8k
      case BROTLI_STATE_METABLOCK_HEADER_NONE:
244
24.8k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
245
2.65k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
246
2.65k
        }
247
22.1k
        s->is_last_metablock = bits ? 1 : 0;
248
22.1k
        s->meta_block_remaining_len = 0;
249
22.1k
        s->is_uncompressed = 0;
250
22.1k
        s->is_metadata = 0;
251
22.1k
        if (!s->is_last_metablock) {
252
20.7k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
253
20.7k
          break;
254
20.7k
        }
255
1.40k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_EMPTY;
256
      /* Fall through. */
257
258
1.43k
      case BROTLI_STATE_METABLOCK_HEADER_EMPTY:
259
1.43k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
260
30
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
261
30
        }
262
1.40k
        if (bits) {
263
62
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
264
62
          return BROTLI_DECODER_SUCCESS;
265
62
        }
266
1.33k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NIBBLES;
267
      /* Fall through. */
268
269
23.1k
      case BROTLI_STATE_METABLOCK_HEADER_NIBBLES:
270
23.1k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
271
1.11k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
272
1.11k
        }
273
22.0k
        s->size_nibbles = (uint8_t)(bits + 4);
274
22.0k
        s->loop_counter = 0;
275
22.0k
        if (bits == 3) {
276
4.37k
          s->is_metadata = 1;
277
4.37k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_RESERVED;
278
4.37k
          break;
279
4.37k
        }
280
17.6k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_SIZE;
281
      /* Fall through. */
282
283
30.3k
      case BROTLI_STATE_METABLOCK_HEADER_SIZE:
284
30.3k
        i = s->loop_counter;
285
103k
        for (; i < (int)s->size_nibbles; ++i) {
286
85.8k
          if (!BrotliSafeReadBits(br, 4, &bits)) {
287
12.7k
            s->loop_counter = i;
288
12.7k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
289
12.7k
          }
290
73.1k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 4 &&
291
2.08k
              bits == 0) {
292
9
            return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE);
293
9
          }
294
73.1k
          s->meta_block_remaining_len |= (int)(bits << (i * 4));
295
73.1k
        }
296
17.5k
        s->substate_metablock_header =
297
17.5k
            BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED;
298
      /* Fall through. */
299
300
18.2k
      case BROTLI_STATE_METABLOCK_HEADER_UNCOMPRESSED:
301
18.2k
        if (!s->is_last_metablock) {
302
17.0k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
303
701
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
304
701
          }
305
16.3k
          s->is_uncompressed = bits ? 1 : 0;
306
16.3k
        }
307
17.5k
        ++s->meta_block_remaining_len;
308
17.5k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
309
17.5k
        return BROTLI_DECODER_SUCCESS;
310
311
4.87k
      case BROTLI_STATE_METABLOCK_HEADER_RESERVED:
312
4.87k
        if (!BrotliSafeReadBits(br, 1, &bits)) {
313
504
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
314
504
        }
315
4.36k
        if (bits != 0) {
316
17
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_RESERVED);
317
17
        }
318
4.35k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_BYTES;
319
      /* Fall through. */
320
321
4.56k
      case BROTLI_STATE_METABLOCK_HEADER_BYTES:
322
4.56k
        if (!BrotliSafeReadBits(br, 2, &bits)) {
323
217
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
324
217
        }
325
4.34k
        if (bits == 0) {
326
2.72k
          s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
327
2.72k
          return BROTLI_DECODER_SUCCESS;
328
2.72k
        }
329
1.61k
        s->size_nibbles = (uint8_t)bits;
330
1.61k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_METADATA;
331
      /* Fall through. */
332
333
2.11k
      case BROTLI_STATE_METABLOCK_HEADER_METADATA:
334
2.11k
        i = s->loop_counter;
335
4.15k
        for (; i < (int)s->size_nibbles; ++i) {
336
2.56k
          if (!BrotliSafeReadBits(br, 8, &bits)) {
337
524
            s->loop_counter = i;
338
524
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
339
524
          }
340
2.04k
          if (i + 1 == (int)s->size_nibbles && s->size_nibbles > 1 &&
341
363
              bits == 0) {
342
3
            return BROTLI_FAILURE(
343
3
                BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE);
344
3
          }
345
2.03k
          s->meta_block_remaining_len |= (int)(bits << (i * 8));
346
2.03k
        }
347
1.58k
        ++s->meta_block_remaining_len;
348
1.58k
        s->substate_metablock_header = BROTLI_STATE_METABLOCK_HEADER_NONE;
349
1.58k
        return BROTLI_DECODER_SUCCESS;
350
351
0
      default:
352
0
        return
353
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
354
65.5k
    }
355
65.5k
  }
356
40.4k
}
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
1.46G
                                               BrotliBitReader* br) {
365
1.46G
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
366
1.46G
  BROTLI_HC_ADJUST_TABLE_INDEX(table, bits & HUFFMAN_TABLE_MASK);
367
1.46G
  if (BROTLI_HC_FAST_LOAD_BITS(table) > HUFFMAN_TABLE_BITS) {
368
9.86k
    brotli_reg_t nbits = BROTLI_HC_FAST_LOAD_BITS(table) - HUFFMAN_TABLE_BITS;
369
9.86k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
370
9.86k
    BROTLI_HC_ADJUST_TABLE_INDEX(table,
371
9.86k
        BROTLI_HC_FAST_LOAD_VALUE(table) +
372
9.86k
        ((bits >> HUFFMAN_TABLE_BITS) & BitMask(nbits)));
373
9.86k
  }
374
1.46G
  BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
375
1.46G
  return BROTLI_HC_FAST_LOAD_VALUE(table);
376
1.46G
}
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
364M
                                             BrotliBitReader* br) {
382
364M
  return DecodeSymbol(BrotliGet16BitsUnmasked(br), table, br);
383
364M
}
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
1.07G
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
389
1.07G
  brotli_reg_t val;
390
1.07G
  brotli_reg_t available_bits = BrotliGetAvailableBits(br);
391
1.07G
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
392
1.07G
  if (available_bits == 0) {
393
115M
    if (BROTLI_HC_FAST_LOAD_BITS(table) == 0) {
394
114M
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
395
114M
      return BROTLI_TRUE;
396
114M
    }
397
833k
    return BROTLI_FALSE;  /* No valid bits at all. */
398
115M
  }
399
962M
  val = BrotliGetBitsUnmasked(br);
400
962M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, val & HUFFMAN_TABLE_MASK);
401
962M
  if (BROTLI_HC_FAST_LOAD_BITS(table) <= HUFFMAN_TABLE_BITS) {
402
962M
    if (BROTLI_HC_FAST_LOAD_BITS(table) <= available_bits) {
403
961M
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(table));
404
961M
      *result = BROTLI_HC_FAST_LOAD_VALUE(table);
405
961M
      return BROTLI_TRUE;
406
961M
    } else {
407
137k
      return BROTLI_FALSE;  /* Not enough bits for the first level. */
408
137k
    }
409
962M
  }
410
3.86k
  if (available_bits <= HUFFMAN_TABLE_BITS) {
411
2.73k
    return BROTLI_FALSE;  /* Not enough bits to move to the second level. */
412
2.73k
  }
413
414
  /* Speculatively drop HUFFMAN_TABLE_BITS. */
415
1.12k
  val = (val & BitMask(BROTLI_HC_FAST_LOAD_BITS(table))) >> HUFFMAN_TABLE_BITS;
416
1.12k
  available_bits -= HUFFMAN_TABLE_BITS;
417
1.12k
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BROTLI_HC_FAST_LOAD_VALUE(table) + val);
418
1.12k
  if (available_bits < BROTLI_HC_FAST_LOAD_BITS(table)) {
419
210
    return BROTLI_FALSE;  /* Not enough bits for the second level. */
420
210
  }
421
422
919
  BrotliDropBits(br, HUFFMAN_TABLE_BITS + BROTLI_HC_FAST_LOAD_BITS(table));
423
919
  *result = BROTLI_HC_FAST_LOAD_VALUE(table);
424
919
  return BROTLI_TRUE;
425
1.12k
}
426
427
static BROTLI_INLINE BROTLI_BOOL SafeReadSymbol(
428
2.17G
    const HuffmanCode* table, BrotliBitReader* br, brotli_reg_t* result) {
429
2.17G
  brotli_reg_t val;
430
2.17G
  if (BROTLI_PREDICT_TRUE(BrotliSafeGetBits(br, 15, &val))) {
431
1.09G
    *result = DecodeSymbol(val, table, br);
432
1.09G
    return BROTLI_TRUE;
433
1.09G
  }
434
1.07G
  return SafeDecodeSymbol(table, br, result);
435
2.17G
}
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
769M
                                        brotli_reg_t* value) {
443
769M
  if (safe) {
444
232M
    return;
445
232M
  }
446
537M
  BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(table);
447
537M
  BROTLI_HC_ADJUST_TABLE_INDEX(table, BrotliGetBits(br, HUFFMAN_TABLE_BITS));
448
537M
  *bits = BROTLI_HC_FAST_LOAD_BITS(table);
449
537M
  *value = BROTLI_HC_FAST_LOAD_VALUE(table);
450
537M
}
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
457M
                                                  brotli_reg_t* value) {
458
457M
  brotli_reg_t result = *value;
459
457M
  if (BROTLI_PREDICT_FALSE(*bits > HUFFMAN_TABLE_BITS)) {
460
6.18k
    brotli_reg_t val = BrotliGet16BitsUnmasked(br);
461
6.18k
    const HuffmanCode* ext = table + (val & HUFFMAN_TABLE_MASK) + *value;
462
6.18k
    brotli_reg_t mask = BitMask((*bits - HUFFMAN_TABLE_BITS));
463
6.18k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(ext);
464
6.18k
    BrotliDropBits(br, HUFFMAN_TABLE_BITS);
465
6.18k
    BROTLI_HC_ADJUST_TABLE_INDEX(ext, (val >> HUFFMAN_TABLE_BITS) & mask);
466
6.18k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(ext));
467
6.18k
    result = BROTLI_HC_FAST_LOAD_VALUE(ext);
468
457M
  } else {
469
457M
    BrotliDropBits(br, *bits);
470
457M
  }
471
457M
  PreloadSymbol(0, table, br, bits, value);
472
457M
  return result;
473
457M
}
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
160M
                                                        const int limit) {
485
160M
  const int kMaximalOverread = 4;
486
160M
  int pos_limit = limit;
487
160M
  int copies = 0;
488
  /* Calculate range where CheckInputAmount is always true.
489
     Start with the number of bytes we can read. */
490
160M
  int64_t new_lim = br->guard_in - br->next_in;
491
  /* Convert to bits, since symbols use variable number of bits. */
492
160M
  new_lim *= 8;
493
  /* At most 15 bits per symbol, so this is safe. */
494
160M
  new_lim /= 15;
495
160M
  if ((new_lim - kMaximalOverread) <= limit) {
496
    // Safe cast, since new_lim is already < num_steps
497
68.3M
    pos_limit = (int)(new_lim - kMaximalOverread);
498
68.3M
  }
499
160M
  if (pos_limit < 0) {
500
28.6M
    pos_limit = 0;
501
28.6M
  }
502
160M
  copies = pos_limit;
503
160M
  pos_limit += pos;
504
  /* Fast path, caller made sure it is safe to write,
505
     we verified that is is safe to read. */
506
371M
  for (; pos < pos_limit; pos++) {
507
210M
    BROTLI_DCHECK(BrotliCheckInputAmount(br));
508
210M
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
509
210M
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
510
210M
  }
511
  /* Do the remainder, caller made sure it is safe to write,
512
     we need to bverify that it is safe to read. */
513
406M
  while (BrotliCheckInputAmount(br) && copies < limit) {
514
246M
    ringbuffer[pos] = (uint8_t)ReadPreloadedSymbol(table, br, bits, value);
515
246M
    BROTLI_LOG_ARRAY_INDEX(ringbuffer, pos);
516
246M
    pos++;
517
246M
    copies++;
518
246M
  }
519
160M
  return copies;
520
160M
}
521
522
77.4k
static BROTLI_INLINE brotli_reg_t Log2Floor(brotli_reg_t x) {
523
77.4k
  brotli_reg_t result = 0;
524
675k
  while (x) {
525
597k
    x >>= 1;
526
597k
    ++result;
527
597k
  }
528
77.4k
  return result;
529
77.4k
}
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
77.4k
    BrotliDecoderState* s) {
537
  /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
538
77.4k
  BrotliBitReader* br = &s->br;
539
77.4k
  BrotliMetablockHeaderArena* h = &s->arena.header;
540
77.4k
  brotli_reg_t max_bits = Log2Floor(alphabet_size_max - 1);
541
77.4k
  brotli_reg_t i = h->sub_loop_counter;
542
77.4k
  brotli_reg_t num_symbols = h->symbol;
543
147k
  while (i <= num_symbols) {
544
95.8k
    brotli_reg_t v;
545
95.8k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeReadBits(br, max_bits, &v))) {
546
26.1k
      h->sub_loop_counter = i;
547
26.1k
      h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_READ;
548
26.1k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
549
26.1k
    }
550
69.7k
    if (v >= alphabet_size_limit) {
551
29
      return
552
29
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET);
553
29
    }
554
69.6k
    h->symbols_lists_array[i] = (uint16_t)v;
555
69.6k
    BROTLI_LOG_UINT(h->symbols_lists_array[i]);
556
69.6k
    ++i;
557
69.6k
  }
558
559
69.5k
  for (i = 0; i < num_symbols; ++i) {
560
18.2k
    brotli_reg_t k = i + 1;
561
47.3k
    for (; k <= num_symbols; ++k) {
562
29.1k
      if (h->symbols_lists_array[i] == h->symbols_lists_array[k]) {
563
11
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME);
564
11
      }
565
29.1k
    }
566
18.2k
  }
567
568
51.3k
  return BROTLI_DECODER_SUCCESS;
569
51.3k
}
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
297k
    uint16_t* code_length_histo, int* next_symbol) {
581
297k
  *repeat = 0;
582
297k
  if (code_len != 0) {  /* code_len == 1..15 */
583
294k
    symbol_lists[next_symbol[code_len]] = (uint16_t)(*symbol);
584
294k
    next_symbol[code_len] = (int)(*symbol);
585
294k
    *prev_code_len = code_len;
586
294k
    *space -= 32768U >> code_len;
587
294k
    code_length_histo[code_len]++;
588
294k
    BROTLI_LOG(("[ReadHuffmanCode] code_length[%d] = %d\n",
589
294k
        (int)*symbol, (int)code_len));
590
294k
  }
591
297k
  (*symbol)++;
592
297k
}
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.46k
    uint16_t* code_length_histo, int* next_symbol) {
609
5.46k
  brotli_reg_t old_repeat;
610
5.46k
  brotli_reg_t extra_bits = 3;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
611
5.46k
  brotli_reg_t new_len = 0;  /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
612
5.46k
  if (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
613
3.52k
    new_len = *prev_code_len;
614
3.52k
    extra_bits = 2;
615
3.52k
  }
616
5.46k
  if (*repeat_code_len != new_len) {
617
1.54k
    *repeat = 0;
618
1.54k
    *repeat_code_len = new_len;
619
1.54k
  }
620
5.46k
  old_repeat = *repeat;
621
5.46k
  if (*repeat > 0) {
622
1.30k
    *repeat -= 2;
623
1.30k
    *repeat <<= extra_bits;
624
1.30k
  }
625
5.46k
  *repeat += repeat_delta + 3U;
626
5.46k
  repeat_delta = *repeat - old_repeat;
627
5.46k
  if (*symbol + repeat_delta > alphabet_size) {
628
97
    BROTLI_DUMP();
629
97
    *symbol = alphabet_size;
630
97
    *space = 0xFFFFF;
631
97
    return;
632
97
  }
633
5.36k
  BROTLI_LOG(("[ReadHuffmanCode] code_length[%d..%d] = %d\n",
634
5.36k
      (int)*symbol, (int)(*symbol + repeat_delta - 1), (int)*repeat_code_len));
635
5.36k
  if (*repeat_code_len != 0) {
636
3.49k
    brotli_reg_t last = *symbol + repeat_delta;
637
3.49k
    int next = next_symbol[*repeat_code_len];
638
41.9k
    do {
639
41.9k
      symbol_lists[next] = (uint16_t)*symbol;
640
41.9k
      next = (int)*symbol;
641
41.9k
    } while (++(*symbol) != last);
642
3.49k
    next_symbol[*repeat_code_len] = next;
643
3.49k
    *space -= repeat_delta << (15 - *repeat_code_len);
644
3.49k
    code_length_histo[*repeat_code_len] =
645
3.49k
        (uint16_t)(code_length_histo[*repeat_code_len] + repeat_delta);
646
3.49k
  } else {
647
1.86k
    *symbol += repeat_delta;
648
1.86k
  }
649
5.36k
}
650
651
/* Reads and decodes symbol codelengths. */
652
static BrotliDecoderErrorCode ReadSymbolCodeLengths(
653
19.7k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
654
19.7k
  BrotliBitReader* br = &s->br;
655
19.7k
  BrotliMetablockHeaderArena* h = &s->arena.header;
656
19.7k
  brotli_reg_t symbol = h->symbol;
657
19.7k
  brotli_reg_t repeat = h->repeat;
658
19.7k
  brotli_reg_t space = h->space;
659
19.7k
  brotli_reg_t prev_code_len = h->prev_code_len;
660
19.7k
  brotli_reg_t repeat_code_len = h->repeat_code_len;
661
19.7k
  uint16_t* symbol_lists = h->symbol_lists;
662
19.7k
  uint16_t* code_length_histo = h->code_length_histo;
663
19.7k
  int* next_symbol = h->next_symbol;
664
19.7k
  if (!BrotliWarmupBitReader(br)) {
665
912
    return BROTLI_DECODER_NEEDS_MORE_INPUT;
666
912
  }
667
174k
  while (symbol < alphabet_size && space > 0) {
668
170k
    const HuffmanCode* p = h->table;
669
170k
    brotli_reg_t code_len;
670
170k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
671
170k
    if (!BrotliCheckInputAmount(br)) {
672
14.3k
      h->symbol = symbol;
673
14.3k
      h->repeat = repeat;
674
14.3k
      h->prev_code_len = prev_code_len;
675
14.3k
      h->repeat_code_len = repeat_code_len;
676
14.3k
      h->space = space;
677
14.3k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
678
14.3k
    }
679
155k
    BrotliFillBitWindow16(br);
680
155k
    BROTLI_HC_ADJUST_TABLE_INDEX(p, BrotliGetBitsUnmasked(br) &
681
155k
        BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
682
155k
    BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));  /* Use 1..5 bits. */
683
155k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
684
155k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
685
153k
      ProcessSingleCodeLength(code_len, &symbol, &repeat, &space,
686
153k
          &prev_code_len, symbol_lists, code_length_histo, next_symbol);
687
153k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
688
2.05k
      brotli_reg_t extra_bits =
689
2.05k
          (code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) ? 2 : 3;
690
2.05k
      brotli_reg_t repeat_delta =
691
2.05k
          BrotliGetBitsUnmasked(br) & BitMask(extra_bits);
692
2.05k
      BrotliDropBits(br, extra_bits);
693
2.05k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
694
2.05k
          &symbol, &repeat, &space, &prev_code_len, &repeat_code_len,
695
2.05k
          symbol_lists, code_length_histo, next_symbol);
696
2.05k
    }
697
155k
  }
698
4.48k
  h->space = space;
699
4.48k
  return BROTLI_DECODER_SUCCESS;
700
18.8k
}
701
702
static BrotliDecoderErrorCode SafeReadSymbolCodeLengths(
703
15.2k
    brotli_reg_t alphabet_size, BrotliDecoderState* s) {
704
15.2k
  BrotliBitReader* br = &s->br;
705
15.2k
  BrotliMetablockHeaderArena* h = &s->arena.header;
706
15.2k
  BROTLI_BOOL get_byte = BROTLI_FALSE;
707
179k
  while (h->symbol < alphabet_size && h->space > 0) {
708
173k
    const HuffmanCode* p = h->table;
709
173k
    brotli_reg_t code_len;
710
173k
    brotli_reg_t available_bits;
711
173k
    brotli_reg_t bits = 0;
712
173k
    BROTLI_HC_MARK_TABLE_FOR_FAST_LOAD(p);
713
173k
    if (get_byte && !BrotliPullByte(br)) return BROTLI_DECODER_NEEDS_MORE_INPUT;
714
164k
    get_byte = BROTLI_FALSE;
715
164k
    available_bits = BrotliGetAvailableBits(br);
716
164k
    if (available_bits != 0) {
717
134k
      bits = (uint32_t)BrotliGetBitsUnmasked(br);
718
134k
    }
719
164k
    BROTLI_HC_ADJUST_TABLE_INDEX(p,
720
164k
        bits & BitMask(BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH));
721
164k
    if (BROTLI_HC_FAST_LOAD_BITS(p) > available_bits) {
722
15.3k
      get_byte = BROTLI_TRUE;
723
15.3k
      continue;
724
15.3k
    }
725
149k
    code_len = BROTLI_HC_FAST_LOAD_VALUE(p);  /* code_len == 0..17 */
726
149k
    if (code_len < BROTLI_REPEAT_PREVIOUS_CODE_LENGTH) {
727
143k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p));
728
143k
      ProcessSingleCodeLength(code_len, &h->symbol, &h->repeat, &h->space,
729
143k
          &h->prev_code_len, h->symbol_lists, h->code_length_histo,
730
143k
          h->next_symbol);
731
143k
    } else {  /* code_len == 16..17, extra_bits == 2..3 */
732
5.61k
      brotli_reg_t extra_bits = code_len - 14U;
733
5.61k
      brotli_reg_t repeat_delta = (bits >> BROTLI_HC_FAST_LOAD_BITS(p)) &
734
5.61k
          BitMask(extra_bits);
735
5.61k
      if (available_bits < BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits) {
736
2.21k
        get_byte = BROTLI_TRUE;
737
2.21k
        continue;
738
2.21k
      }
739
3.40k
      BrotliDropBits(br, BROTLI_HC_FAST_LOAD_BITS(p) + extra_bits);
740
3.40k
      ProcessRepeatedCodeLength(code_len, repeat_delta, alphabet_size,
741
3.40k
          &h->symbol, &h->repeat, &h->space, &h->prev_code_len,
742
3.40k
          &h->repeat_code_len, h->symbol_lists, h->code_length_histo,
743
3.40k
          h->next_symbol);
744
3.40k
    }
745
149k
  }
746
6.25k
  return BROTLI_DECODER_SUCCESS;
747
15.2k
}
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
18.8k
static BrotliDecoderErrorCode ReadCodeLengthCodeLengths(BrotliDecoderState* s) {
752
18.8k
  BrotliBitReader* br = &s->br;
753
18.8k
  BrotliMetablockHeaderArena* h = &s->arena.header;
754
18.8k
  brotli_reg_t num_codes = h->repeat;
755
18.8k
  brotli_reg_t space = h->space;
756
18.8k
  brotli_reg_t i = h->sub_loop_counter;
757
87.8k
  for (; i < BROTLI_CODE_LENGTH_CODES; ++i) {
758
86.9k
    const uint8_t code_len_idx = kCodeLengthCodeOrder[i];
759
86.9k
    brotli_reg_t ix;
760
86.9k
    brotli_reg_t v;
761
86.9k
    if (BROTLI_PREDICT_FALSE(!BrotliSafeGetBits(br, 4, &ix))) {
762
13.6k
      brotli_reg_t available_bits = BrotliGetAvailableBits(br);
763
13.6k
      if (available_bits != 0) {
764
8.44k
        ix = BrotliGetBitsUnmasked(br) & 0xF;
765
8.44k
      } else {
766
5.17k
        ix = 0;
767
5.17k
      }
768
13.6k
      if (kCodeLengthPrefixLength[ix] > available_bits) {
769
7.78k
        h->sub_loop_counter = i;
770
7.78k
        h->repeat = num_codes;
771
7.78k
        h->space = space;
772
7.78k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
773
7.78k
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
774
7.78k
      }
775
13.6k
    }
776
79.2k
    v = kCodeLengthPrefixValue[ix];
777
79.2k
    BrotliDropBits(br, kCodeLengthPrefixLength[ix]);
778
79.2k
    h->code_length_code_lengths[code_len_idx] = (uint8_t)v;
779
79.2k
    BROTLI_LOG_ARRAY_INDEX(h->code_length_code_lengths, code_len_idx);
780
79.2k
    if (v != 0) {
781
43.1k
      space = space - (32U >> v);
782
43.1k
      ++num_codes;
783
43.1k
      ++h->code_length_histo[v];
784
43.1k
      if (space - 1U >= 32U) {
785
        /* space is 0 or wrapped around. */
786
10.2k
        break;
787
10.2k
      }
788
43.1k
    }
789
79.2k
  }
790
11.1k
  if (!(num_codes == 1 || space == 0)) {
791
132
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CL_SPACE);
792
132
  }
793
10.9k
  return BROTLI_DECODER_SUCCESS;
794
11.1k
}
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
116k
                                              BrotliDecoderState* s) {
812
116k
  BrotliBitReader* br = &s->br;
813
116k
  BrotliMetablockHeaderArena* h = &s->arena.header;
814
  /* State machine. */
815
127k
  for (;;) {
816
127k
    switch (h->substate_huffman) {
817
67.6k
      case BROTLI_STATE_HUFFMAN_NONE:
818
67.6k
        if (!BrotliSafeReadBits(br, 2, &h->sub_loop_counter)) {
819
4.67k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
820
4.67k
        }
821
62.9k
        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
62.9k
        if (h->sub_loop_counter != 1) {
826
11.4k
          h->space = 32;
827
11.4k
          h->repeat = 0;  /* num_codes */
828
11.4k
          memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo[0]) *
829
11.4k
              (BROTLI_HUFFMAN_MAX_CODE_LENGTH_CODE_LENGTH + 1));
830
11.4k
          memset(&h->code_length_code_lengths[0], 0,
831
11.4k
              sizeof(h->code_length_code_lengths));
832
11.4k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_COMPLEX;
833
11.4k
          continue;
834
11.4k
        }
835
      /* Fall through. */
836
837
57.6k
      case BROTLI_STATE_HUFFMAN_SIMPLE_SIZE:
838
        /* Read symbols, codes & code lengths directly. */
839
57.6k
        if (!BrotliSafeReadBits(br, 2, &h->symbol)) {  /* num_symbols */
840
6.18k
          h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_SIZE;
841
6.18k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
842
6.18k
        }
843
51.4k
        h->sub_loop_counter = 0;
844
      /* Fall through. */
845
846
77.4k
      case BROTLI_STATE_HUFFMAN_SIMPLE_READ: {
847
77.4k
        BrotliDecoderErrorCode result =
848
77.4k
            ReadSimpleHuffmanSymbols(alphabet_size_max, alphabet_size_limit, s);
849
77.4k
        if (result != BROTLI_DECODER_SUCCESS) {
850
26.1k
          return result;
851
26.1k
        }
852
77.4k
      }
853
      /* Fall through. */
854
855
51.8k
      case BROTLI_STATE_HUFFMAN_SIMPLE_BUILD: {
856
51.8k
        brotli_reg_t table_size;
857
51.8k
        if (h->symbol == 3) {
858
3.53k
          brotli_reg_t bits;
859
3.53k
          if (!BrotliSafeReadBits(br, 1, &bits)) {
860
566
            h->substate_huffman = BROTLI_STATE_HUFFMAN_SIMPLE_BUILD;
861
566
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
862
566
          }
863
2.96k
          h->symbol += bits;
864
2.96k
        }
865
51.2k
        BROTLI_LOG_UINT(h->symbol);
866
51.2k
        table_size = BrotliBuildSimpleHuffmanTable(table, HUFFMAN_TABLE_BITS,
867
51.2k
                                                   h->symbols_lists_array,
868
51.2k
                                                   (uint32_t)h->symbol);
869
51.2k
        if (opt_table_size) {
870
42.8k
          *opt_table_size = table_size;
871
42.8k
        }
872
51.2k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
873
51.2k
        return BROTLI_DECODER_SUCCESS;
874
51.8k
      }
875
876
      /* Decode Huffman-coded code lengths. */
877
18.8k
      case BROTLI_STATE_HUFFMAN_COMPLEX: {
878
18.8k
        brotli_reg_t i;
879
18.8k
        BrotliDecoderErrorCode result = ReadCodeLengthCodeLengths(s);
880
18.8k
        if (result != BROTLI_DECODER_SUCCESS) {
881
7.91k
          return result;
882
7.91k
        }
883
10.9k
        BrotliBuildCodeLengthsHuffmanTable(h->table,
884
10.9k
                                           h->code_length_code_lengths,
885
10.9k
                                           h->code_length_histo);
886
10.9k
        memset(&h->code_length_histo[0], 0, sizeof(h->code_length_histo));
887
186k
        for (i = 0; i <= BROTLI_HUFFMAN_MAX_CODE_LENGTH; ++i) {
888
175k
          h->next_symbol[i] = (int)i - (BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1);
889
175k
          h->symbol_lists[h->next_symbol[i]] = 0xFFFF;
890
175k
        }
891
892
10.9k
        h->symbol = 0;
893
10.9k
        h->prev_code_len = BROTLI_INITIAL_REPEATED_CODE_LENGTH;
894
10.9k
        h->repeat = 0;
895
10.9k
        h->repeat_code_len = 0;
896
10.9k
        h->space = 32768;
897
10.9k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS;
898
10.9k
      }
899
      /* Fall through. */
900
901
19.7k
      case BROTLI_STATE_HUFFMAN_LENGTH_SYMBOLS: {
902
19.7k
        brotli_reg_t table_size;
903
19.7k
        BrotliDecoderErrorCode result = ReadSymbolCodeLengths(
904
19.7k
            alphabet_size_limit, s);
905
19.7k
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
906
15.2k
          result = SafeReadSymbolCodeLengths(alphabet_size_limit, s);
907
15.2k
        }
908
19.7k
        if (result != BROTLI_DECODER_SUCCESS) {
909
9.00k
          return result;
910
9.00k
        }
911
912
10.7k
        if (h->space != 0) {
913
214
          BROTLI_LOG(("[ReadHuffmanCode] space = %d\n", (int)h->space));
914
214
          return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE);
915
214
        }
916
10.5k
        table_size = BrotliBuildHuffmanTable(
917
10.5k
            table, HUFFMAN_TABLE_BITS, h->symbol_lists, h->code_length_histo);
918
10.5k
        if (opt_table_size) {
919
8.99k
          *opt_table_size = table_size;
920
8.99k
        }
921
10.5k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
922
10.5k
        return BROTLI_DECODER_SUCCESS;
923
10.7k
      }
924
925
0
      default:
926
0
        return
927
0
            BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
928
127k
    }
929
127k
  }
930
116k
}
931
932
/* Decodes a block length by reading 3..39 bits. */
933
static BROTLI_INLINE brotli_reg_t ReadBlockLength(const HuffmanCode* table,
934
260k
                                                  BrotliBitReader* br) {
935
260k
  brotli_reg_t code;
936
260k
  brotli_reg_t nbits;
937
260k
  code = ReadSymbol(table, br);
938
260k
  nbits = _kBrotliPrefixCodeRanges[code].nbits;  /* nbits == 2..24 */
939
260k
  return _kBrotliPrefixCodeRanges[code].offset + BrotliReadBits24(br, nbits);
940
260k
}
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
98.6k
    BrotliBitReader* br) {
947
98.6k
  brotli_reg_t index;
948
98.6k
  if (s->substate_read_block_length == BROTLI_STATE_READ_BLOCK_LENGTH_NONE) {
949
96.5k
    if (!SafeReadSymbol(table, br, &index)) {
950
9.69k
      return BROTLI_FALSE;
951
9.69k
    }
952
96.5k
  } else {
953
2.09k
    index = s->block_length_index;
954
2.09k
  }
955
88.9k
  {
956
88.9k
    brotli_reg_t bits;
957
88.9k
    brotli_reg_t nbits = _kBrotliPrefixCodeRanges[index].nbits;
958
88.9k
    brotli_reg_t offset = _kBrotliPrefixCodeRanges[index].offset;
959
88.9k
    if (!BrotliSafeReadBits(br, nbits, &bits)) {
960
20.0k
      s->block_length_index = index;
961
20.0k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_SUFFIX;
962
20.0k
      return BROTLI_FALSE;
963
20.0k
    }
964
68.9k
    *result = offset + bits;
965
68.9k
    s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
966
68.9k
    return BROTLI_TRUE;
967
88.9k
  }
968
88.9k
}
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
1.09k
    uint8_t* v, brotli_reg_t v_len, BrotliDecoderState* state) {
986
  /* Reinitialize elements that could have been changed. */
987
1.09k
  brotli_reg_t i = 1;
988
1.09k
  brotli_reg_t upper_bound = state->mtf_upper_bound;
989
1.09k
  uint32_t* mtf = &state->mtf[1];  /* Make mtf[-1] addressable. */
990
1.09k
  uint8_t* mtf_u8 = (uint8_t*)mtf;
991
  /* Load endian-aware constant. */
992
1.09k
  const uint8_t b0123[4] = {0, 1, 2, 3};
993
1.09k
  uint32_t pattern;
994
1.09k
  memcpy(&pattern, &b0123, 4);
995
996
  /* Initialize list using 4 consequent values pattern. */
997
1.09k
  mtf[0] = pattern;
998
21.8k
  do {
999
21.8k
    pattern += 0x04040404;  /* Advance all 4 values by 4. */
1000
21.8k
    mtf[i] = pattern;
1001
21.8k
    i++;
1002
21.8k
  } while (i <= upper_bound);
1003
1004
  /* Transform the input. */
1005
1.09k
  upper_bound = 0;
1006
119k
  for (i = 0; i < v_len; ++i) {
1007
118k
    int index = v[i];
1008
118k
    uint8_t value = mtf_u8[index];
1009
118k
    upper_bound |= v[i];
1010
118k
    v[i] = value;
1011
118k
    mtf_u8[-1] = value;
1012
1.02M
    do {
1013
1.02M
      index--;
1014
1.02M
      mtf_u8[index + 1] = mtf_u8[index];
1015
1.02M
    } while (index >= 0);
1016
118k
  }
1017
  /* Remember amount of elements to be reinitialized. */
1018
1.09k
  state->mtf_upper_bound = upper_bound >> 2;
1019
1.09k
}
1020
1021
/* Decodes a series of Huffman table using ReadHuffmanCode function. */
1022
static BrotliDecoderErrorCode HuffmanTreeGroupDecode(
1023
82.6k
    HuffmanTreeGroup* group, BrotliDecoderState* s) {
1024
82.6k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1025
82.6k
  if (h->substate_tree_group != BROTLI_STATE_TREE_GROUP_LOOP) {
1026
38.6k
    h->next = group->codes;
1027
38.6k
    h->htree_index = 0;
1028
38.6k
    h->substate_tree_group = BROTLI_STATE_TREE_GROUP_LOOP;
1029
38.6k
  }
1030
134k
  while (h->htree_index < group->num_htrees) {
1031
96.5k
    brotli_reg_t table_size;
1032
96.5k
    BrotliDecoderErrorCode result = ReadHuffmanCode(group->alphabet_size_max,
1033
96.5k
        group->alphabet_size_limit, h->next, &table_size, s);
1034
96.5k
    if (result != BROTLI_DECODER_SUCCESS) return result;
1035
51.8k
    group->htrees[h->htree_index] = h->next;
1036
51.8k
    h->next += table_size;
1037
51.8k
    ++h->htree_index;
1038
51.8k
  }
1039
37.9k
  h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
1040
37.9k
  return BROTLI_DECODER_SUCCESS;
1041
82.6k
}
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
34.1k
                                               BrotliDecoderState* s) {
1055
34.1k
  BrotliBitReader* br = &s->br;
1056
34.1k
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
1057
34.1k
  BrotliMetablockHeaderArena* h = &s->arena.header;
1058
1059
34.1k
  switch ((int)h->substate_context_map) {
1060
30.1k
    case BROTLI_STATE_CONTEXT_MAP_NONE:
1061
30.1k
      result = DecodeVarLenUint8(s, br, num_htrees);
1062
30.1k
      if (result != BROTLI_DECODER_SUCCESS) {
1063
3.52k
        return result;
1064
3.52k
      }
1065
26.5k
      (*num_htrees)++;
1066
26.5k
      h->context_index = 0;
1067
26.5k
      BROTLI_LOG_UINT(context_map_size);
1068
26.5k
      BROTLI_LOG_UINT(*num_htrees);
1069
26.5k
      *context_map_arg =
1070
26.5k
          (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)context_map_size);
1071
26.5k
      if (*context_map_arg == 0) {
1072
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP);
1073
0
      }
1074
26.5k
      if (*num_htrees <= 1) {
1075
24.2k
        memset(*context_map_arg, 0, (size_t)context_map_size);
1076
24.2k
        return BROTLI_DECODER_SUCCESS;
1077
24.2k
      }
1078
2.29k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_READ_PREFIX;
1079
    /* Fall through. */
1080
1081
3.19k
    case BROTLI_STATE_CONTEXT_MAP_READ_PREFIX: {
1082
3.19k
      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
3.19k
      if (!BrotliSafeGetBits(br, 5, &bits)) {
1086
916
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1087
916
      }
1088
2.27k
      if ((bits & 1) != 0) { /* Use RLE for zeros. */
1089
506
        h->max_run_length_prefix = (bits >> 1) + 1;
1090
506
        BrotliDropBits(br, 5);
1091
1.76k
      } else {
1092
1.76k
        h->max_run_length_prefix = 0;
1093
1.76k
        BrotliDropBits(br, 1);
1094
1.76k
      }
1095
2.27k
      BROTLI_LOG_UINT(h->max_run_length_prefix);
1096
2.27k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_HUFFMAN;
1097
2.27k
    }
1098
    /* Fall through. */
1099
1100
3.59k
    case BROTLI_STATE_CONTEXT_MAP_HUFFMAN: {
1101
3.59k
      brotli_reg_t alphabet_size = *num_htrees + h->max_run_length_prefix;
1102
3.59k
      result = ReadHuffmanCode(alphabet_size, alphabet_size,
1103
3.59k
                               h->context_map_table, NULL, s);
1104
3.59k
      if (result != BROTLI_DECODER_SUCCESS) return result;
1105
2.17k
      h->code = 0xFFFF;
1106
2.17k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_DECODE;
1107
2.17k
    }
1108
    /* Fall through. */
1109
1110
3.60k
    case BROTLI_STATE_CONTEXT_MAP_DECODE: {
1111
3.60k
      brotli_reg_t context_index = h->context_index;
1112
3.60k
      brotli_reg_t max_run_length_prefix = h->max_run_length_prefix;
1113
3.60k
      uint8_t* context_map = *context_map_arg;
1114
3.60k
      brotli_reg_t code = h->code;
1115
3.60k
      BROTLI_BOOL skip_preamble = (code != 0xFFFF);
1116
186k
      while (context_index < context_map_size || skip_preamble) {
1117
184k
        if (!skip_preamble) {
1118
184k
          if (!SafeReadSymbol(h->context_map_table, br, &code)) {
1119
1.03k
            h->code = 0xFFFF;
1120
1.03k
            h->context_index = context_index;
1121
1.03k
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1122
1.03k
          }
1123
183k
          BROTLI_LOG_UINT(code);
1124
1125
183k
          if (code == 0) {
1126
13.8k
            context_map[context_index++] = 0;
1127
13.8k
            continue;
1128
13.8k
          }
1129
169k
          if (code > max_run_length_prefix) {
1130
167k
            context_map[context_index++] =
1131
167k
                (uint8_t)(code - max_run_length_prefix);
1132
167k
            continue;
1133
167k
          }
1134
169k
        } else {
1135
446
          skip_preamble = BROTLI_FALSE;
1136
446
        }
1137
        /* RLE sub-stage. */
1138
2.71k
        {
1139
2.71k
          brotli_reg_t reps;
1140
2.71k
          if (!BrotliSafeReadBits(br, code, &reps)) {
1141
476
            h->code = code;
1142
476
            h->context_index = context_index;
1143
476
            return BROTLI_DECODER_NEEDS_MORE_INPUT;
1144
476
          }
1145
2.24k
          reps += (brotli_reg_t)1U << code;
1146
2.24k
          BROTLI_LOG_UINT(reps);
1147
2.24k
          if (context_index + reps > context_map_size) {
1148
31
            return
1149
31
                BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT);
1150
31
          }
1151
24.1k
          do {
1152
24.1k
            context_map[context_index++] = 0;
1153
24.1k
          } while (--reps);
1154
2.21k
        }
1155
2.21k
      }
1156
3.60k
    }
1157
    /* Fall through. */
1158
1159
2.49k
    case BROTLI_STATE_CONTEXT_MAP_TRANSFORM: {
1160
2.49k
      brotli_reg_t bits;
1161
2.49k
      if (!BrotliSafeReadBits(br, 1, &bits)) {
1162
453
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_TRANSFORM;
1163
453
        return BROTLI_DECODER_NEEDS_MORE_INPUT;
1164
453
      }
1165
2.04k
      if (bits != 0) {
1166
1.09k
        InverseMoveToFrontTransform(*context_map_arg, context_map_size, s);
1167
1.09k
      }
1168
2.04k
      h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
1169
2.04k
      return BROTLI_DECODER_SUCCESS;
1170
2.49k
    }
1171
1172
0
    default:
1173
0
      return
1174
0
          BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
1175
34.1k
  }
1176
34.1k
}
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
358k
    int safe, BrotliDecoderState* s, int tree_type) {
1182
358k
  brotli_reg_t max_block_type = s->num_block_types[tree_type];
1183
358k
  const HuffmanCode* type_tree = &s->block_type_trees[
1184
358k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_258];
1185
358k
  const HuffmanCode* len_tree = &s->block_len_trees[
1186
358k
      tree_type * BROTLI_HUFFMAN_MAX_SIZE_26];
1187
358k
  BrotliBitReader* br = &s->br;
1188
358k
  brotli_reg_t* ringbuffer = &s->block_type_rb[tree_type * 2];
1189
358k
  brotli_reg_t block_type;
1190
358k
  if (max_block_type <= 1) {
1191
5
    return BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH;
1192
5
  }
1193
1194
  /* Read 0..15 + 3..39 bits. */
1195
358k
  if (!safe) {
1196
260k
    block_type = ReadSymbol(type_tree, br);
1197
260k
    s->block_length[tree_type] = ReadBlockLength(len_tree, br);
1198
260k
  } else {
1199
98.5k
    BrotliBitReaderState memento;
1200
98.5k
    BrotliBitReaderSaveState(br, &memento);
1201
98.5k
    if (!SafeReadSymbol(type_tree, br, &block_type)) {
1202
6.87k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1203
6.87k
    }
1204
91.6k
    if (!SafeReadBlockLength(s, &s->block_length[tree_type], len_tree, br)) {
1205
26.5k
      s->substate_read_block_length = BROTLI_STATE_READ_BLOCK_LENGTH_NONE;
1206
26.5k
      BrotliBitReaderRestoreState(br, &memento);
1207
26.5k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1208
26.5k
    }
1209
91.6k
  }
1210
1211
325k
  if (block_type == 1) {
1212
130k
    block_type = ringbuffer[1] + 1;
1213
194k
  } else if (block_type == 0) {
1214
126k
    block_type = ringbuffer[0];
1215
126k
  } else {
1216
68.1k
    block_type -= 2;
1217
68.1k
  }
1218
325k
  if (block_type >= max_block_type) {
1219
17.5k
    block_type -= max_block_type;
1220
17.5k
  }
1221
325k
  ringbuffer[0] = ringbuffer[1];
1222
325k
  ringbuffer[1] = block_type;
1223
325k
  return BROTLI_DECODER_SUCCESS;
1224
358k
}
1225
1226
static BROTLI_INLINE void DetectTrivialLiteralBlockTypes(
1227
13.2k
    BrotliDecoderState* s) {
1228
13.2k
  size_t i;
1229
119k
  for (i = 0; i < 8; ++i) s->trivial_literal_contexts[i] = 0;
1230
37.2k
  for (i = 0; i < s->num_block_types[0]; i++) {
1231
23.9k
    size_t offset = i << BROTLI_LITERAL_CONTEXT_BITS;
1232
23.9k
    size_t error = 0;
1233
23.9k
    size_t sample = s->context_map[offset];
1234
23.9k
    size_t j;
1235
407k
    for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS);) {
1236
      /* NOLINTNEXTLINE(bugprone-macro-repeated-side-effects) */
1237
383k
      BROTLI_REPEAT_4({ error |= s->context_map[offset + j++] ^ sample; })
1238
383k
    }
1239
23.9k
    if (error == 0) {
1240
22.2k
      s->trivial_literal_contexts[i >> 5] |= 1u << (i & 31);
1241
22.2k
    }
1242
23.9k
  }
1243
13.2k
}
1244
1245
58.7k
static BROTLI_INLINE void PrepareLiteralDecoding(BrotliDecoderState* s) {
1246
58.7k
  uint8_t context_mode;
1247
58.7k
  size_t trivial;
1248
58.7k
  brotli_reg_t block_type = s->block_type_rb[1];
1249
58.7k
  brotli_reg_t context_offset = block_type << BROTLI_LITERAL_CONTEXT_BITS;
1250
58.7k
  s->context_map_slice = s->context_map + context_offset;
1251
58.7k
  trivial = s->trivial_literal_contexts[block_type >> 5];
1252
58.7k
  s->trivial_literal_context = (trivial >> (block_type & 31)) & 1;
1253
58.7k
  s->literal_htree = s->literal_hgroup.htrees[s->context_map_slice[0]];
1254
58.7k
  context_mode = s->context_modes[block_type] & 3;
1255
58.7k
  s->context_lookup = BROTLI_CONTEXT_LUT(context_mode);
1256
58.7k
}
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
64.5k
    int safe, BrotliDecoderState* s) {
1262
64.5k
  BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 0);
1263
64.5k
  if (result != BROTLI_DECODER_SUCCESS) {
1264
18.1k
    return result;
1265
18.1k
  }
1266
46.3k
  PrepareLiteralDecoding(s);
1267
46.3k
  return BROTLI_DECODER_SUCCESS;
1268
64.5k
}
1269
1270
static BROTLI_NOINLINE BrotliDecoderErrorCode
1271
20.4k
DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
1272
20.4k
  return DecodeLiteralBlockSwitchInternal(0, s);
1273
20.4k
}
1274
1275
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeDecodeLiteralBlockSwitch(
1276
44.1k
    BrotliDecoderState* s) {
1277
44.1k
  return DecodeLiteralBlockSwitchInternal(1, s);
1278
44.1k
}
1279
1280
/* Block switch for insert/copy length.
1281
   Reads 3..54 bits. */
1282
static BROTLI_INLINE BrotliDecoderErrorCode DecodeCommandBlockSwitchInternal(
1283
43.1k
    int safe, BrotliDecoderState* s) {
1284
43.1k
  BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 1);
1285
43.1k
  if (result != BROTLI_DECODER_SUCCESS) {
1286
7.14k
    return result;
1287
7.14k
  }
1288
36.0k
  s->htree_command = s->insert_copy_hgroup.htrees[s->block_type_rb[3]];
1289
36.0k
  return BROTLI_DECODER_SUCCESS;
1290
43.1k
}
1291
1292
static BROTLI_NOINLINE BrotliDecoderErrorCode
1293
19.8k
DecodeCommandBlockSwitch(BrotliDecoderState* s) {
1294
19.8k
  return DecodeCommandBlockSwitchInternal(0, s);
1295
19.8k
}
1296
1297
static BROTLI_NOINLINE BrotliDecoderErrorCode
1298
23.3k
SafeDecodeCommandBlockSwitch(BrotliDecoderState* s) {
1299
23.3k
  return DecodeCommandBlockSwitchInternal(1, s);
1300
23.3k
}
1301
1302
/* Block switch for distance codes.
1303
   Reads 3..54 bits. */
1304
static BROTLI_INLINE BrotliDecoderErrorCode DecodeDistanceBlockSwitchInternal(
1305
250k
    int safe, BrotliDecoderState* s) {
1306
250k
  BrotliDecoderErrorCode result = DecodeBlockTypeAndLength(safe, s, 2);
1307
250k
  if (result != BROTLI_DECODER_SUCCESS) {
1308
8.10k
    return result;
1309
8.10k
  }
1310
242k
  s->dist_context_map_slice = s->dist_context_map +
1311
242k
      (s->block_type_rb[5] << BROTLI_DISTANCE_CONTEXT_BITS);
1312
242k
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1313
242k
  return BROTLI_DECODER_SUCCESS;
1314
250k
}
1315
1316
static BROTLI_NOINLINE BrotliDecoderErrorCode
1317
219k
DecodeDistanceBlockSwitch(BrotliDecoderState* s) {
1318
219k
  return DecodeDistanceBlockSwitchInternal(0, s);
1319
219k
}
1320
1321
static BROTLI_BOOL BROTLI_NOINLINE SafeDecodeDistanceBlockSwitch(
1322
31.0k
    BrotliDecoderState* s) {
1323
31.0k
  return DecodeDistanceBlockSwitchInternal(1, s);
1324
31.0k
}
1325
1326
5.17M
static size_t UnwrittenBytes(const BrotliDecoderState* s, BROTLI_BOOL wrap) {
1327
5.17M
  size_t pos = wrap && s->pos > s->ringbuffer_size ?
1328
4.89M
      (size_t)s->ringbuffer_size : (size_t)(s->pos);
1329
5.17M
  size_t partial_pos_rb = (s->rb_roundtrips * (size_t)s->ringbuffer_size) + pos;
1330
5.17M
  return partial_pos_rb - s->partial_pos_out;
1331
5.17M
}
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
5.17M
    size_t* total_out, BROTLI_BOOL force) {
1339
5.17M
  uint8_t* start =
1340
5.17M
      s->ringbuffer + (s->partial_pos_out & (size_t)s->ringbuffer_mask);
1341
5.17M
  size_t to_write = UnwrittenBytes(s, BROTLI_TRUE);
1342
5.17M
  size_t num_written = *available_out;
1343
5.17M
  if (num_written > to_write) {
1344
1.40M
    num_written = to_write;
1345
1.40M
  }
1346
5.17M
  if (s->meta_block_remaining_len < 0) {
1347
216
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1);
1348
216
  }
1349
5.17M
  if (next_out && !*next_out) {
1350
0
    *next_out = start;
1351
5.17M
  } else {
1352
5.17M
    if (next_out) {
1353
5.17M
      memcpy(*next_out, start, num_written);
1354
5.17M
      *next_out += num_written;
1355
5.17M
    }
1356
5.17M
  }
1357
5.17M
  *available_out -= num_written;
1358
5.17M
  BROTLI_LOG_UINT(to_write);
1359
5.17M
  BROTLI_LOG_UINT(num_written);
1360
5.17M
  s->partial_pos_out += num_written;
1361
5.17M
  if (total_out) {
1362
5.17M
    *total_out = s->partial_pos_out;
1363
5.17M
  }
1364
5.17M
  if (num_written < to_write) {
1365
3.43M
    if (s->ringbuffer_size == (1 << s->window_bits) || force) {
1366
3.43M
      return BROTLI_DECODER_NEEDS_MORE_OUTPUT;
1367
3.43M
    } else {
1368
77
      return BROTLI_DECODER_SUCCESS;
1369
77
    }
1370
3.43M
  }
1371
  /* Wrap ring buffer only if it has reached its maximal size. */
1372
1.74M
  if (s->ringbuffer_size == (1 << s->window_bits) &&
1373
1.53M
      s->pos >= s->ringbuffer_size) {
1374
492k
    s->pos -= s->ringbuffer_size;
1375
492k
    s->rb_roundtrips++;
1376
492k
    s->should_wrap_ringbuffer = (size_t)s->pos != 0 ? 1 : 0;
1377
492k
  }
1378
1.74M
  return BROTLI_DECODER_SUCCESS;
1379
5.17M
}
1380
1381
491k
static void BROTLI_NOINLINE WrapRingBuffer(BrotliDecoderState* s) {
1382
491k
  if (s->should_wrap_ringbuffer) {
1383
46.9k
    memcpy(s->ringbuffer, s->ringbuffer_end, (size_t)s->pos);
1384
46.9k
    s->should_wrap_ringbuffer = 0;
1385
46.9k
  }
1386
491k
}
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
46.5k
    BrotliDecoderState* s) {
1397
46.5k
  uint8_t* old_ringbuffer = s->ringbuffer;
1398
46.5k
  if (s->ringbuffer_size == s->new_ringbuffer_size) {
1399
42.7k
    return BROTLI_TRUE;
1400
42.7k
  }
1401
1402
3.81k
  s->ringbuffer = (uint8_t*)BROTLI_DECODER_ALLOC(s,
1403
3.81k
      (size_t)(s->new_ringbuffer_size) + kRingBufferWriteAheadSlack);
1404
3.81k
  if (s->ringbuffer == 0) {
1405
    /* Restore previous value. */
1406
0
    s->ringbuffer = old_ringbuffer;
1407
0
    return BROTLI_FALSE;
1408
0
  }
1409
3.81k
  s->ringbuffer[s->new_ringbuffer_size - 2] = 0;
1410
3.81k
  s->ringbuffer[s->new_ringbuffer_size - 1] = 0;
1411
1412
3.81k
  if (!!old_ringbuffer) {
1413
325
    memcpy(s->ringbuffer, old_ringbuffer, (size_t)s->pos);
1414
325
    BROTLI_DECODER_FREE(s, old_ringbuffer);
1415
325
  }
1416
1417
3.81k
  s->ringbuffer_size = s->new_ringbuffer_size;
1418
3.81k
  s->ringbuffer_mask = s->new_ringbuffer_size - 1;
1419
3.81k
  s->ringbuffer_end = s->ringbuffer + s->ringbuffer_size;
1420
1421
3.81k
  return BROTLI_TRUE;
1422
3.81k
}
1423
1424
static BrotliDecoderErrorCode BROTLI_NOINLINE
1425
1.10M
SkipMetadataBlock(BrotliDecoderState* s) {
1426
1.10M
  BrotliBitReader* br = &s->br;
1427
1.10M
  int nbytes;
1428
1429
1.10M
  if (s->meta_block_remaining_len == 0) {
1430
2.71k
    return BROTLI_DECODER_SUCCESS;
1431
2.71k
  }
1432
1433
1.10M
  BROTLI_DCHECK((BrotliGetAvailableBits(br) & 7) == 0);
1434
1435
  /* Drain accumulator. */
1436
1.10M
  if (BrotliGetAvailableBits(br) >= 8) {
1437
568
    uint8_t buffer[8];
1438
568
    nbytes = (int)(BrotliGetAvailableBits(br)) >> 3;
1439
568
    BROTLI_DCHECK(nbytes <= 8);
1440
568
    if (nbytes > s->meta_block_remaining_len) {
1441
279
      nbytes = s->meta_block_remaining_len;
1442
279
    }
1443
568
    BrotliCopyBytes(buffer, br, (size_t)nbytes);
1444
568
    if (s->metadata_chunk_func) {
1445
0
      s->metadata_chunk_func(s->metadata_callback_opaque, buffer,
1446
0
                             (size_t)nbytes);
1447
0
    }
1448
568
    s->meta_block_remaining_len -= nbytes;
1449
568
    if (s->meta_block_remaining_len == 0) {
1450
319
      return BROTLI_DECODER_SUCCESS;
1451
319
    }
1452
568
  }
1453
1454
  /* Direct access to metadata is possible. */
1455
1.10M
  nbytes = (int)BrotliGetRemainingBytes(br);
1456
1.10M
  if (nbytes > s->meta_block_remaining_len) {
1457
713
    nbytes = s->meta_block_remaining_len;
1458
713
  }
1459
1.10M
  if (nbytes > 0) {
1460
1.10M
    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
1.10M
    BrotliDropBytes(br, (size_t)nbytes);
1465
1.10M
    s->meta_block_remaining_len -= nbytes;
1466
1.10M
    if (s->meta_block_remaining_len == 0) {
1467
1.06k
      return BROTLI_DECODER_SUCCESS;
1468
1.06k
    }
1469
1.10M
  }
1470
1471
1.10M
  BROTLI_DCHECK(BrotliGetRemainingBytes(br) == 0);
1472
1473
1.10M
  return BROTLI_DECODER_NEEDS_MORE_INPUT;
1474
1.10M
}
1475
1476
static BrotliDecoderErrorCode BROTLI_NOINLINE CopyUncompressedBlockToOutput(
1477
    size_t* available_out, uint8_t** next_out, size_t* total_out,
1478
34.1k
    BrotliDecoderState* s) {
1479
  /* TODO(eustas): avoid allocation for single uncompressed block. */
1480
34.1k
  if (!BrotliEnsureRingBuffer(s)) {
1481
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1);
1482
0
  }
1483
1484
  /* State machine */
1485
35.1k
  for (;;) {
1486
35.1k
    switch (s->substate_uncompressed) {
1487
6.40k
      case BROTLI_STATE_UNCOMPRESSED_NONE: {
1488
6.40k
        int nbytes = (int)BrotliGetRemainingBytes(&s->br);
1489
6.40k
        if (nbytes > s->meta_block_remaining_len) {
1490
2.75k
          nbytes = s->meta_block_remaining_len;
1491
2.75k
        }
1492
6.40k
        if (s->pos + nbytes > s->ringbuffer_size) {
1493
538
          nbytes = s->ringbuffer_size - s->pos;
1494
538
        }
1495
        /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
1496
6.40k
        BrotliCopyBytes(&s->ringbuffer[s->pos], &s->br, (size_t)nbytes);
1497
6.40k
        s->pos += nbytes;
1498
6.40k
        s->meta_block_remaining_len -= nbytes;
1499
6.40k
        if (s->pos < 1 << s->window_bits) {
1500
5.39k
          if (s->meta_block_remaining_len == 0) {
1501
3.19k
            return BROTLI_DECODER_SUCCESS;
1502
3.19k
          }
1503
2.20k
          return BROTLI_DECODER_NEEDS_MORE_INPUT;
1504
5.39k
        }
1505
1.00k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_WRITE;
1506
1.00k
      }
1507
      /* Fall through. */
1508
1509
29.7k
      case BROTLI_STATE_UNCOMPRESSED_WRITE: {
1510
29.7k
        BrotliDecoderErrorCode result;
1511
29.7k
        result = WriteRingBuffer(
1512
29.7k
            s, available_out, next_out, total_out, BROTLI_FALSE);
1513
29.7k
        if (result != BROTLI_DECODER_SUCCESS) {
1514
28.7k
          return result;
1515
28.7k
        }
1516
1.00k
        if (s->ringbuffer_size == 1 << s->window_bits) {
1517
1.00k
          s->max_distance = s->max_backward_distance;
1518
1.00k
        }
1519
1.00k
        s->substate_uncompressed = BROTLI_STATE_UNCOMPRESSED_NONE;
1520
1.00k
        break;
1521
29.7k
      }
1522
35.1k
    }
1523
35.1k
  }
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
3.03M
static uint32_t GetCompoundDictionarySize(BrotliDecoderState* s) {
1609
3.03M
  return s->compound_dictionary ? s->compound_dictionary->total_size : 0u;
1610
3.03M
}
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
17.5k
    BrotliDecoderState* s) {
1666
17.5k
  int window_size = 1 << s->window_bits;
1667
17.5k
  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
17.5k
  int min_size = s->ringbuffer_size ? s->ringbuffer_size : 1024;
1671
17.5k
  int output_size;
1672
1673
  /* If maximum is already reached, no further extension is retired. */
1674
17.5k
  if (s->ringbuffer_size == window_size) {
1675
7.82k
    return;
1676
7.82k
  }
1677
1678
  /* Metadata blocks does not touch ring buffer. */
1679
9.69k
  if (s->is_metadata) {
1680
0
    return;
1681
0
  }
1682
1683
9.69k
  if (!s->ringbuffer) {
1684
4.85k
    output_size = 0;
1685
4.85k
  } else {
1686
4.84k
    output_size = s->pos;
1687
4.84k
  }
1688
9.69k
  output_size += s->meta_block_remaining_len;
1689
9.69k
  min_size = min_size < output_size ? output_size : min_size;
1690
1691
9.69k
  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
46.8k
    while ((new_ringbuffer_size >> 1) >= min_size) {
1696
37.1k
      new_ringbuffer_size >>= 1;
1697
37.1k
    }
1698
9.69k
  }
1699
1700
9.69k
  s->new_ringbuffer_size = new_ringbuffer_size;
1701
9.69k
}
1702
1703
/* Reads 1..256 2-bit context modes. */
1704
15.0k
static BrotliDecoderErrorCode ReadContextModes(BrotliDecoderState* s) {
1705
15.0k
  BrotliBitReader* br = &s->br;
1706
15.0k
  int i = s->loop_counter;
1707
1708
40.5k
  while (i < (int)s->num_block_types[0]) {
1709
27.1k
    brotli_reg_t bits;
1710
27.1k
    if (!BrotliSafeReadBits(br, 2, &bits)) {
1711
1.70k
      s->loop_counter = i;
1712
1.70k
      return BROTLI_DECODER_NEEDS_MORE_INPUT;
1713
1.70k
    }
1714
25.4k
    s->context_modes[i] = (uint8_t)bits;
1715
25.4k
    BROTLI_LOG_ARRAY_INDEX(s->context_modes, i);
1716
25.4k
    i++;
1717
25.4k
  }
1718
13.3k
  return BROTLI_DECODER_SUCCESS;
1719
15.0k
}
1720
1721
156M
static BROTLI_INLINE void TakeDistanceFromRingBuffer(BrotliDecoderState* s) {
1722
156M
  int offset = s->distance_code - 3;
1723
156M
  if (s->distance_code <= 3) {
1724
    /* Compensate double distance-ring-buffer roll for dictionary items. */
1725
47.7M
    s->distance_context = 1 >> s->distance_code;
1726
47.7M
    s->distance_code = s->dist_rb[(s->dist_rb_idx - offset) & 3];
1727
47.7M
    s->dist_rb_idx -= s->distance_context;
1728
108M
  } else {
1729
108M
    int index_delta = 3;
1730
108M
    int delta;
1731
108M
    int base = s->distance_code - 10;
1732
108M
    if (s->distance_code < 10) {
1733
67.3M
      base = s->distance_code - 4;
1734
67.3M
    } else {
1735
41.1M
      index_delta = 2;
1736
41.1M
    }
1737
    /* Unpack one of six 4-bit values. */
1738
108M
    delta = ((0x605142 >> (4 * base)) & 0xF) - 3;
1739
108M
    s->distance_code = s->dist_rb[(s->dist_rb_idx + index_delta) & 0x3] + delta;
1740
108M
    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
40
      s->distance_code = 0x7FFFFFFF;
1744
40
    }
1745
108M
  }
1746
156M
}
1747
1748
static BROTLI_INLINE BROTLI_BOOL SafeReadBits(
1749
865M
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1750
865M
  if (n_bits != 0) {
1751
222k
    return BrotliSafeReadBits(br, n_bits, val);
1752
865M
  } else {
1753
865M
    *val = 0;
1754
865M
    return BROTLI_TRUE;
1755
865M
  }
1756
865M
}
1757
1758
static BROTLI_INLINE BROTLI_BOOL SafeReadBits32(
1759
164M
    BrotliBitReader* const br, brotli_reg_t n_bits, brotli_reg_t* val) {
1760
164M
  if (n_bits != 0) {
1761
154k
    return BrotliSafeReadBits32(br, n_bits, val);
1762
164M
  } else {
1763
164M
    *val = 0;
1764
164M
    return BROTLI_TRUE;
1765
164M
  }
1766
164M
}
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
12.4k
static void CalculateDistanceLut(BrotliDecoderState* s) {
1836
12.4k
  BrotliMetablockBodyArena* b = &s->arena.body;
1837
12.4k
  brotli_reg_t npostfix = s->distance_postfix_bits;
1838
12.4k
  brotli_reg_t ndirect = s->num_direct_distance_codes;
1839
12.4k
  brotli_reg_t alphabet_size_limit = s->distance_hgroup.alphabet_size_limit;
1840
12.4k
  brotli_reg_t postfix = (brotli_reg_t)1u << npostfix;
1841
12.4k
  brotli_reg_t j;
1842
12.4k
  brotli_reg_t bits = 1;
1843
12.4k
  brotli_reg_t half = 0;
1844
1845
  /* Skip short codes. */
1846
12.4k
  brotli_reg_t i = BROTLI_NUM_DISTANCE_SHORT_CODES;
1847
1848
  /* Fill direct codes. */
1849
465k
  for (j = 0; j < ndirect; ++j) {
1850
452k
    b->dist_extra_bits[i] = 0;
1851
452k
    b->dist_offset[i] = j + 1;
1852
452k
    ++i;
1853
452k
  }
1854
1855
  /* Fill regular distance codes. */
1856
610k
  while (i < alphabet_size_limit) {
1857
597k
    brotli_reg_t base = ndirect + ((((2 + half) << bits) - 4) << npostfix) + 1;
1858
    /* Always fill the complete group. */
1859
3.25M
    for (j = 0; j < postfix; ++j) {
1860
2.65M
      b->dist_extra_bits[i] = (uint8_t)bits;
1861
2.65M
      b->dist_offset[i] = base + j;
1862
2.65M
      ++i;
1863
2.65M
    }
1864
597k
    bits = bits + half;
1865
597k
    half = half ^ 1;
1866
597k
  }
1867
12.4k
}
1868
1869
/* Precondition: s->distance_code < 0. */
1870
static BROTLI_INLINE BROTLI_BOOL ReadDistanceInternal(
1871
390M
    int safe, BrotliDecoderState* s, BrotliBitReader* br) {
1872
390M
  BrotliMetablockBodyArena* b = &s->arena.body;
1873
390M
  brotli_reg_t code;
1874
390M
  brotli_reg_t bits;
1875
390M
  BrotliBitReaderState memento;
1876
390M
  HuffmanCode* distance_tree = s->distance_hgroup.htrees[s->dist_htree_index];
1877
390M
  if (!safe) {
1878
90.3M
    code = ReadSymbol(distance_tree, br);
1879
300M
  } else {
1880
300M
    BrotliBitReaderSaveState(br, &memento);
1881
300M
    if (!SafeReadSymbol(distance_tree, br, &code)) {
1882
13.8k
      return BROTLI_FALSE;
1883
13.8k
    }
1884
300M
  }
1885
390M
  --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
390M
  s->distance_context = 0;
1889
390M
  if ((code & ~0xFu) == 0) {
1890
156M
    s->distance_code = (int)code;
1891
156M
    TakeDistanceFromRingBuffer(s);
1892
156M
    return BROTLI_TRUE;
1893
156M
  }
1894
234M
  if (!safe) {
1895
69.6M
    bits = BrotliReadBits32(br, b->dist_extra_bits[code]);
1896
164M
  } else {
1897
164M
    if (!SafeReadBits32(br, b->dist_extra_bits[code], &bits)) {
1898
102k
      ++s->block_length[2];
1899
102k
      BrotliBitReaderRestoreState(br, &memento);
1900
102k
      return BROTLI_FALSE;
1901
102k
    }
1902
164M
  }
1903
234M
  s->distance_code =
1904
234M
      (int)(b->dist_offset[code] + (bits << s->distance_postfix_bits));
1905
234M
  return BROTLI_TRUE;
1906
234M
}
1907
1908
static BROTLI_INLINE void ReadDistance(
1909
90.3M
    BrotliDecoderState* s, BrotliBitReader* br) {
1910
90.3M
  ReadDistanceInternal(0, s, br);
1911
90.3M
}
1912
1913
static BROTLI_INLINE BROTLI_BOOL SafeReadDistance(
1914
300M
    BrotliDecoderState* s, BrotliBitReader* br) {
1915
300M
  return ReadDistanceInternal(1, s, br);
1916
300M
}
1917
1918
static BROTLI_INLINE BROTLI_BOOL ReadCommandInternal(
1919
602M
    int safe, BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1920
602M
  brotli_reg_t cmd_code;
1921
602M
  brotli_reg_t insert_len_extra = 0;
1922
602M
  brotli_reg_t copy_length;
1923
602M
  CmdLutElement v;
1924
602M
  BrotliBitReaderState memento;
1925
602M
  if (!safe) {
1926
169M
    cmd_code = ReadSymbol(s->htree_command, br);
1927
432M
  } else {
1928
432M
    BrotliBitReaderSaveState(br, &memento);
1929
432M
    if (!SafeReadSymbol(s->htree_command, br, &cmd_code)) {
1930
21.9k
      return BROTLI_FALSE;
1931
21.9k
    }
1932
432M
  }
1933
602M
  v = kCmdLut[cmd_code];
1934
602M
  s->distance_code = v.distance_code;
1935
602M
  s->distance_context = v.context;
1936
602M
  s->dist_htree_index = s->dist_context_map_slice[s->distance_context];
1937
602M
  *insert_length = v.insert_len_offset;
1938
602M
  if (!safe) {
1939
169M
    if (BROTLI_PREDICT_FALSE(v.insert_len_extra_bits != 0)) {
1940
133k
      insert_len_extra = BrotliReadBits24(br, v.insert_len_extra_bits);
1941
133k
    }
1942
169M
    copy_length = BrotliReadBits24(br, v.copy_len_extra_bits);
1943
432M
  } else {
1944
432M
    if (!SafeReadBits(br, v.insert_len_extra_bits, &insert_len_extra) ||
1945
432M
        !SafeReadBits(br, v.copy_len_extra_bits, &copy_length)) {
1946
38.3k
      BrotliBitReaderRestoreState(br, &memento);
1947
38.3k
      return BROTLI_FALSE;
1948
38.3k
    }
1949
432M
  }
1950
602M
  s->copy_length = (int)copy_length + v.copy_len_offset;
1951
602M
  --s->block_length[1];
1952
602M
  *insert_length += (int)insert_len_extra;
1953
602M
  return BROTLI_TRUE;
1954
602M
}
1955
1956
static BROTLI_INLINE void ReadCommand(
1957
169M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1958
169M
  ReadCommandInternal(0, s, br, insert_length);
1959
169M
}
1960
1961
static BROTLI_INLINE BROTLI_BOOL SafeReadCommand(
1962
432M
    BrotliDecoderState* s, BrotliBitReader* br, int* insert_length) {
1963
432M
  return ReadCommandInternal(1, s, br, insert_length);
1964
432M
}
1965
1966
static BROTLI_INLINE BROTLI_BOOL CheckInputAmount(
1967
1.03G
    int safe, BrotliBitReader* const br) {
1968
1.03G
  if (safe) {
1969
678M
    return BROTLI_TRUE;
1970
678M
  }
1971
355M
  return BrotliCheckInputAmount(br);
1972
1.03G
}
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
992M
  {                                               \
1979
992M
    if (safe) {                                   \
1980
733M
      if (!Safe##METHOD) {                        \
1981
176k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT; \
1982
176k
        goto saveStateAndReturn;                  \
1983
176k
      }                                           \
1984
733M
    } else {                                      \
1985
259M
      METHOD;                                     \
1986
259M
    }                                             \
1987
992M
  }
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
358k
  {                                             \
1993
358k
    BrotliDecoderErrorCode status;              \
1994
358k
    if (safe) {                                 \
1995
98.5k
      status = Safe##METHOD;                    \
1996
260k
    } else {                                    \
1997
260k
      status = METHOD;                          \
1998
260k
    }                                           \
1999
358k
    if (status != BROTLI_DECODER_SUCCESS) {     \
2000
33.4k
      result = status;                          \
2001
33.4k
      goto saveStateAndReturn;                  \
2002
33.4k
    }                                           \
2003
358k
  }
2004
2005
static BROTLI_INLINE BrotliDecoderErrorCode ProcessCommandsInternal(
2006
3.03M
    int safe, BrotliDecoderState* s) {
2007
3.03M
  int pos = s->pos;
2008
3.03M
  int i = s->loop_counter;
2009
3.03M
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2010
3.03M
  BrotliBitReader* br = &s->br;
2011
3.03M
  uint32_t compound_dictionary_size = GetCompoundDictionarySize(s);
2012
2013
3.03M
  if (!CheckInputAmount(safe, br)) {
2014
1.37M
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2015
1.37M
    goto saveStateAndReturn;
2016
1.37M
  }
2017
1.65M
  if (!safe) {
2018
258k
    BROTLI_UNUSED(BrotliWarmupBitReader(br));
2019
258k
  }
2020
2021
  /* Jump into state machine. */
2022
1.65M
  if (s->state == BROTLI_STATE_COMMAND_BEGIN) {
2023
143k
    goto CommandBegin;
2024
1.51M
  } else if (s->state == BROTLI_STATE_COMMAND_INNER) {
2025
1.03M
    goto CommandInner;
2026
1.03M
  } else if (s->state == BROTLI_STATE_COMMAND_POST_DECODE_LITERALS) {
2027
148k
    goto CommandPostDecodeLiterals;
2028
325k
  } else if (s->state == BROTLI_STATE_COMMAND_POST_WRAP_COPY) {
2029
325k
    goto CommandPostWrapCopy;
2030
325k
  } else {
2031
0
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_UNREACHABLE);  /* COV_NF_LINE */
2032
0
  }
2033
2034
602M
CommandBegin:
2035
602M
  if (safe) {
2036
432M
    s->state = BROTLI_STATE_COMMAND_BEGIN;
2037
432M
  }
2038
602M
  if (!CheckInputAmount(safe, br)) {
2039
9.49k
    s->state = BROTLI_STATE_COMMAND_BEGIN;
2040
9.49k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2041
9.49k
    goto saveStateAndReturn;
2042
9.49k
  }
2043
602M
  if (BROTLI_PREDICT_FALSE(s->block_length[1] == 0)) {
2044
43.1k
    BROTLI_SAFE_WITH_STATUS(DecodeCommandBlockSwitch(s));
2045
36.0k
    goto CommandBegin;
2046
43.1k
  }
2047
  /* Read the insert/copy length in the command. */
2048
602M
  BROTLI_SAFE(ReadCommand(s, br, &i));
2049
602M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d insert = %d copy = %d\n",
2050
602M
              pos, i, s->copy_length));
2051
602M
  if (i == 0) {
2052
233M
    goto CommandPostDecodeLiterals;
2053
233M
  }
2054
368M
  s->meta_block_remaining_len -= i;
2055
2056
369M
CommandInner:
2057
369M
  if (safe) {
2058
279M
    s->state = BROTLI_STATE_COMMAND_INNER;
2059
279M
  }
2060
  /* Read the literals in the command. */
2061
369M
  if (s->trivial_literal_context) {
2062
312M
    brotli_reg_t bits;
2063
312M
    brotli_reg_t value;
2064
312M
    PreloadSymbol(safe, s->literal_htree, br, &bits, &value);
2065
312M
    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
80.1M
      int num_steps = i - 1;
2073
80.1M
      if (num_steps > 0 && ((brotli_reg_t)(num_steps) > s->block_length[0])) {
2074
        // Safe cast, since block_length < steps
2075
18.2k
        num_steps = (int)s->block_length[0];
2076
18.2k
      }
2077
80.1M
      if (s->ringbuffer_size >= pos &&
2078
80.1M
          (s->ringbuffer_size - pos) <= num_steps) {
2079
29.7k
        num_steps = s->ringbuffer_size - pos - 1;
2080
29.7k
      }
2081
80.1M
      if (num_steps < 0) {
2082
0
        num_steps = 0;
2083
0
      }
2084
80.1M
      num_steps = BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits,
2085
80.1M
                                                 &value, s->ringbuffer, pos,
2086
80.1M
                                                 num_steps);
2087
80.1M
      pos += num_steps;
2088
80.1M
      s->block_length[0] -= (brotli_reg_t)num_steps;
2089
80.1M
      i -= num_steps;
2090
80.1M
      do {
2091
80.1M
        if (!CheckInputAmount(safe, br)) {
2092
11.1k
          s->state = BROTLI_STATE_COMMAND_INNER;
2093
11.1k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2094
11.1k
          goto saveStateAndReturn;
2095
11.1k
        }
2096
80.1M
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2097
19.9k
          goto NextLiteralBlock;
2098
19.9k
        }
2099
80.1M
        BrotliCopyPreloadedSymbolsToU8(s->literal_htree, br, &bits, &value,
2100
80.1M
                                       s->ringbuffer, pos, 1);
2101
80.1M
        --s->block_length[0];
2102
80.1M
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2103
80.1M
        ++pos;
2104
80.1M
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2105
35.4k
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2106
35.4k
          --i;
2107
35.4k
          goto saveStateAndReturn;
2108
35.4k
        }
2109
80.1M
      } while (--i != 0);
2110
232M
    } else { /* safe */
2111
1.19G
      do {
2112
1.19G
        brotli_reg_t literal;
2113
1.19G
        if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2114
43.1k
          goto NextLiteralBlock;
2115
43.1k
        }
2116
1.19G
        if (!SafeReadSymbol(s->literal_htree, br, &literal)) {
2117
919k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2118
919k
          goto saveStateAndReturn;
2119
919k
        }
2120
1.19G
        s->ringbuffer[pos] = (uint8_t)literal;
2121
1.19G
        --s->block_length[0];
2122
1.19G
        BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos);
2123
1.19G
        ++pos;
2124
1.19G
        if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2125
58.1k
          s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2126
58.1k
          --i;
2127
58.1k
          goto saveStateAndReturn;
2128
58.1k
        }
2129
1.19G
      } while (--i != 0);
2130
232M
    }
2131
312M
  } else {
2132
57.0M
    uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2133
57.0M
    uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2134
348M
    do {
2135
348M
      const HuffmanCode* hc;
2136
348M
      uint8_t context;
2137
348M
      if (!CheckInputAmount(safe, br)) {
2138
4.52k
        s->state = BROTLI_STATE_COMMAND_INNER;
2139
4.52k
        result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2140
4.52k
        goto saveStateAndReturn;
2141
4.52k
      }
2142
348M
      if (BROTLI_PREDICT_FALSE(s->block_length[0] == 0)) {
2143
1.35k
        goto NextLiteralBlock;
2144
1.35k
      }
2145
348M
      context = BROTLI_CONTEXT(p1, p2, s->context_lookup);
2146
348M
      BROTLI_LOG_UINT(context);
2147
348M
      hc = s->literal_hgroup.htrees[s->context_map_slice[context]];
2148
348M
      p2 = p1;
2149
348M
      if (!safe) {
2150
104M
        p1 = (uint8_t)ReadSymbol(hc, br);
2151
244M
      } else {
2152
244M
        brotli_reg_t literal;
2153
244M
        if (!SafeReadSymbol(hc, br, &literal)) {
2154
263
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2155
263
          goto saveStateAndReturn;
2156
263
        }
2157
244M
        p1 = (uint8_t)literal;
2158
244M
      }
2159
348M
      s->ringbuffer[pos] = p1;
2160
348M
      --s->block_length[0];
2161
348M
      BROTLI_LOG_UINT(s->context_map_slice[context]);
2162
348M
      BROTLI_LOG_ARRAY_INDEX(s->ringbuffer, pos & s->ringbuffer_mask);
2163
348M
      ++pos;
2164
348M
      if (BROTLI_PREDICT_FALSE(pos == s->ringbuffer_size)) {
2165
17.6k
        s->state = BROTLI_STATE_COMMAND_INNER_WRITE;
2166
17.6k
        --i;
2167
17.6k
        goto saveStateAndReturn;
2168
17.6k
      }
2169
348M
    } while (--i != 0);
2170
57.0M
  }
2171
368M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2172
368M
  if (BROTLI_PREDICT_FALSE(s->meta_block_remaining_len <= 0)) {
2173
3.78k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2174
3.78k
    goto saveStateAndReturn;
2175
3.78k
  }
2176
2177
602M
CommandPostDecodeLiterals:
2178
602M
  if (safe) {
2179
432M
    s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2180
432M
  }
2181
602M
  if (s->distance_code >= 0) {
2182
    /* Implicit distance case. */
2183
211M
    s->distance_context = s->distance_code ? 0 : 1;
2184
211M
    --s->dist_rb_idx;
2185
211M
    s->distance_code = s->dist_rb[s->dist_rb_idx & 3];
2186
390M
  } else {
2187
    /* Read distance code in the command, unless it was implicitly zero. */
2188
390M
    if (BROTLI_PREDICT_FALSE(s->block_length[2] == 0)) {
2189
250k
      BROTLI_SAFE_WITH_STATUS(DecodeDistanceBlockSwitch(s));
2190
242k
    }
2191
390M
    BROTLI_SAFE(ReadDistance(s, br));
2192
390M
  }
2193
602M
  BROTLI_LOG(("[ProcessCommandsInternal] pos = %d distance = %d\n",
2194
602M
              pos, s->distance_code));
2195
602M
  if (s->max_distance != s->max_backward_distance) {
2196
211M
    s->max_distance =
2197
211M
        (pos < s->max_backward_distance) ? pos : s->max_backward_distance;
2198
211M
  }
2199
602M
  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
602M
  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
70.3M
    if (s->distance_code > BROTLI_MAX_ALLOWED_DISTANCE) {
2207
40
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2208
40
          "len: %d bytes left: %d\n",
2209
40
          pos, s->distance_code, i, s->meta_block_remaining_len));
2210
40
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DISTANCE);
2211
40
    }
2212
    /* Check that LZ77-dictionary address is non-negative. */
2213
70.3M
    if ((uint32_t)(s->distance_code - s->max_distance) - 1u <
2214
70.3M
        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
70.3M
    } else if (i >= SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH &&
2231
70.3M
               i <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH) {
2232
70.3M
      uint8_t p1 = s->ringbuffer[(pos - 1) & s->ringbuffer_mask];
2233
70.3M
      uint8_t p2 = s->ringbuffer[(pos - 2) & s->ringbuffer_mask];
2234
70.3M
      uint8_t dict_id = s->dictionary->context_based ?
2235
0
          s->dictionary->context_map[BROTLI_CONTEXT(p1, p2, s->context_lookup)]
2236
70.3M
          : 0;
2237
70.3M
      const BrotliDictionary* words = s->dictionary->words[dict_id];
2238
70.3M
      const BrotliTransforms* transforms = s->dictionary->transforms[dict_id];
2239
70.3M
      int offset = (int)words->offsets_by_length[i];
2240
70.3M
      brotli_reg_t shift = words->size_bits_by_length[i];
2241
70.3M
      int address = s->distance_code - s->max_distance - 1 -
2242
70.3M
                    (int)compound_dictionary_size;
2243
70.3M
      int mask = (int)BitMask(shift);
2244
70.3M
      int word_idx = address & mask;
2245
70.3M
      int transform_idx = address >> shift;
2246
      /* Compensate double distance-ring-buffer roll. */
2247
70.3M
      s->dist_rb_idx += s->distance_context;
2248
70.3M
      offset += word_idx * i;
2249
      /* If the distance is out of bound, select a next static dictionary if
2250
         there exist multiple. */
2251
70.3M
      if ((transform_idx >= (int)transforms->num_transforms ||
2252
70.3M
          words->size_bits_by_length[i] == 0) &&
2253
197
          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
70.3M
      if (BROTLI_PREDICT_FALSE(words->size_bits_by_length[i] == 0)) {
2283
88
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2284
88
            "len: %d bytes left: %d\n",
2285
88
            pos, s->distance_code, i, s->meta_block_remaining_len));
2286
88
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2287
88
      }
2288
70.3M
      if (BROTLI_PREDICT_FALSE(!words->data)) {
2289
0
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET);
2290
0
      }
2291
70.3M
      if (transform_idx < (int)transforms->num_transforms) {
2292
70.3M
        const uint8_t* word = &words->data[offset];
2293
70.3M
        int len = i;
2294
70.3M
        if (transform_idx == transforms->cutOffTransforms[0]) {
2295
70.3M
          memcpy(&s->ringbuffer[pos], word, (size_t)len);
2296
70.3M
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s]\n",
2297
70.3M
                      len, word));
2298
70.3M
        } else {
2299
41.5k
          len = BrotliTransformDictionaryWord(&s->ringbuffer[pos], word, len,
2300
41.5k
              transforms, transform_idx);
2301
41.5k
          BROTLI_LOG(("[ProcessCommandsInternal] dictionary word: [%.*s],"
2302
41.5k
                      " transform_idx = %d, transformed: [%.*s]\n",
2303
41.5k
                      i, word, transform_idx, len, &s->ringbuffer[pos]));
2304
41.5k
          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
41.5k
        }
2309
70.3M
        pos += len;
2310
70.3M
        s->meta_block_remaining_len -= len;
2311
70.3M
        if (pos >= s->ringbuffer_size) {
2312
54.6k
          s->state = BROTLI_STATE_COMMAND_POST_WRITE_1;
2313
54.6k
          goto saveStateAndReturn;
2314
54.6k
        }
2315
70.3M
      } else {
2316
109
        BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2317
109
            "len: %d bytes left: %d\n",
2318
109
            pos, s->distance_code, i, s->meta_block_remaining_len));
2319
109
        return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_TRANSFORM);
2320
109
      }
2321
70.3M
    } else {
2322
106
      BROTLI_LOG(("Invalid backward reference. pos: %d distance: %d "
2323
106
          "len: %d bytes left: %d\n",
2324
106
          pos, s->distance_code, i, s->meta_block_remaining_len));
2325
106
      return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_DICTIONARY);
2326
106
    }
2327
531M
  } else {
2328
531M
    int src_start = (pos - s->distance_code) & s->ringbuffer_mask;
2329
531M
    uint8_t* copy_dst = &s->ringbuffer[pos];
2330
531M
    uint8_t* copy_src = &s->ringbuffer[src_start];
2331
531M
    int dst_end = pos + i;
2332
531M
    int src_end = src_start + i;
2333
    /* Update the recent distances cache. */
2334
531M
    s->dist_rb[s->dist_rb_idx & 3] = s->distance_code;
2335
531M
    ++s->dist_rb_idx;
2336
531M
    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
531M
    memmove16(copy_dst, copy_src);
2341
531M
    if (src_end > pos && dst_end > src_start) {
2342
      /* Regions intersect. */
2343
125M
      goto CommandPostWrapCopy;
2344
125M
    }
2345
406M
    if (dst_end >= s->ringbuffer_size || src_end >= s->ringbuffer_size) {
2346
      /* At least one region wraps. */
2347
551k
      goto CommandPostWrapCopy;
2348
551k
    }
2349
405M
    pos += i;
2350
405M
    if (i > 16) {
2351
153k
      if (i > 32) {
2352
129k
        memcpy(copy_dst + 16, copy_src + 16, (size_t)(i - 16));
2353
129k
      } else {
2354
        /* This branch covers about 45% cases.
2355
           Fixed size short copy allows more compiler optimizations. */
2356
23.9k
        memmove16(copy_dst + 16, copy_src + 16);
2357
23.9k
      }
2358
153k
    }
2359
405M
  }
2360
475M
  BROTLI_LOG_UINT(s->meta_block_remaining_len);
2361
475M
  if (s->meta_block_remaining_len <= 0) {
2362
    /* Next metablock, if any. */
2363
3.85k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2364
3.85k
    goto saveStateAndReturn;
2365
475M
  } else {
2366
475M
    goto CommandBegin;
2367
475M
  }
2368
126M
CommandPostWrapCopy:
2369
126M
  {
2370
126M
    int wrap_guard = s->ringbuffer_size - pos;
2371
1.93G
    while (--i >= 0) {
2372
1.80G
      s->ringbuffer[pos] =
2373
1.80G
          s->ringbuffer[(pos - s->distance_code) & s->ringbuffer_mask];
2374
1.80G
      ++pos;
2375
1.80G
      if (BROTLI_PREDICT_FALSE(--wrap_guard == 0)) {
2376
325k
        s->state = BROTLI_STATE_COMMAND_POST_WRITE_2;
2377
325k
        goto saveStateAndReturn;
2378
325k
      }
2379
1.80G
    }
2380
126M
  }
2381
126M
  if (s->meta_block_remaining_len <= 0) {
2382
    /* Next metablock, if any. */
2383
2.24k
    s->state = BROTLI_STATE_METABLOCK_DONE;
2384
2.24k
    goto saveStateAndReturn;
2385
126M
  } else {
2386
126M
    goto CommandBegin;
2387
126M
  }
2388
2389
64.5k
NextLiteralBlock:
2390
64.5k
  BROTLI_SAFE_WITH_STATUS(DecodeLiteralBlockSwitch(s));
2391
46.3k
  goto CommandInner;
2392
2393
3.02M
saveStateAndReturn:
2394
3.02M
  s->pos = pos;
2395
3.02M
  s->loop_counter = i;
2396
3.02M
  return result;
2397
64.5k
}
2398
2399
#undef BROTLI_SAFE
2400
2401
static BROTLI_NOINLINE BrotliDecoderErrorCode ProcessCommands(
2402
1.63M
    BrotliDecoderState* s) {
2403
1.63M
  return ProcessCommandsInternal(0, s);
2404
1.63M
}
2405
2406
static BROTLI_NOINLINE BrotliDecoderErrorCode SafeProcessCommands(
2407
1.39M
    BrotliDecoderState* s) {
2408
1.39M
  return ProcessCommandsInternal(1, s);
2409
1.39M
}
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
5.68M
    size_t* available_out, uint8_t** next_out, size_t* total_out) {
2450
5.68M
  BrotliDecoderErrorCode result = BROTLI_DECODER_SUCCESS;
2451
5.68M
  BrotliBitReader* br = &s->br;
2452
5.68M
  size_t input_size = *available_in;
2453
5.68M
#define BROTLI_SAVE_ERROR_CODE(code) \
2454
5.68M
    SaveErrorCode(s, (code), input_size - *available_in)
2455
  /* Ensure that |total_out| is set, even if no data will ever be pushed out. */
2456
5.68M
  if (total_out) {
2457
5.68M
    *total_out = s->partial_pos_out;
2458
5.68M
  }
2459
  /* Do not try to process further in a case of unrecoverable error. */
2460
5.68M
  if ((int)s->error_code < 0) {
2461
0
    return BROTLI_DECODER_RESULT_ERROR;
2462
0
  }
2463
5.68M
  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
5.68M
  if (!*available_out) next_out = 0;
2468
5.68M
  if (s->buffer_length == 0) {  /* Just connect bit reader to input stream. */
2469
5.64M
    BrotliBitReaderSetInput(br, *next_in, *available_in);
2470
5.64M
  } 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
45.2k
    result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2475
45.2k
    BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
2476
45.2k
  }
2477
  /* State machine */
2478
12.6M
  for (;;) {
2479
12.6M
    if (result != BROTLI_DECODER_SUCCESS) {
2480
      /* Error, needs more input/output. */
2481
5.77M
      if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2482
2.37M
        if (s->ringbuffer != 0) {  /* Pro-actively push output. */
2483
1.28M
          BrotliDecoderErrorCode intermediate_result = WriteRingBuffer(s,
2484
1.28M
              available_out, next_out, total_out, BROTLI_TRUE);
2485
          /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
2486
1.28M
          if ((int)intermediate_result < 0) {
2487
27
            result = intermediate_result;
2488
27
            break;
2489
27
          }
2490
1.28M
        }
2491
2.37M
        if (s->buffer_length != 0) {  /* Used with internal buffer. */
2492
89.2k
          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
41.2k
            s->buffer_length = 0;
2497
            /* Switch to input stream and restart. */
2498
41.2k
            result = BROTLI_DECODER_SUCCESS;
2499
41.2k
            BrotliBitReaderSetInput(br, *next_in, *available_in);
2500
41.2k
            continue;
2501
48.0k
          } else if (*available_in != 0) {
2502
            /* Not enough data in buffer, but can take one more byte from
2503
               input stream. */
2504
45.6k
            result = BROTLI_DECODER_SUCCESS;
2505
45.6k
            BROTLI_DCHECK(s->buffer_length < 8);
2506
45.6k
            s->buffer.u8[s->buffer_length] = **next_in;
2507
45.6k
            s->buffer_length++;
2508
45.6k
            BrotliBitReaderSetInput(br, &s->buffer.u8[0], s->buffer_length);
2509
45.6k
            (*next_in)++;
2510
45.6k
            (*available_in)--;
2511
            /* Retry with more data in buffer. */
2512
45.6k
            continue;
2513
45.6k
          }
2514
          /* Can't finish reading and no more input. */
2515
2.40k
          break;
2516
2.28M
        } else {  /* Input stream doesn't contain enough input. */
2517
          /* Copy tail to internal buffer and return. */
2518
2.28M
          *next_in = br->next_in;
2519
2.28M
          *available_in = BrotliBitReaderGetAvailIn(br);
2520
2.32M
          while (*available_in) {
2521
43.5k
            s->buffer.u8[s->buffer_length] = **next_in;
2522
43.5k
            s->buffer_length++;
2523
43.5k
            (*next_in)++;
2524
43.5k
            (*available_in)--;
2525
43.5k
          }
2526
2.28M
          break;
2527
2.28M
        }
2528
        /* Unreachable. */
2529
2.37M
      }
2530
2531
      /* Fail or needs more output. */
2532
2533
3.39M
      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
1.58k
        s->buffer_length = 0;
2537
3.39M
      } 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
3.39M
        BrotliBitReaderUnload(br);
2542
3.39M
        *available_in = BrotliBitReaderGetAvailIn(br);
2543
3.39M
        *next_in = br->next_in;
2544
3.39M
      }
2545
3.39M
      break;
2546
5.77M
    }
2547
6.83M
    switch (s->state) {
2548
5.10k
      case BROTLI_STATE_UNINITED:
2549
        /* Prepare to the first read. */
2550
5.10k
        if (!BrotliWarmupBitReader(br)) {
2551
0
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2552
0
          break;
2553
0
        }
2554
        /* Decode window size. */
2555
5.10k
        result = DecodeWindowBits(s, br);  /* Reads 1..8 bits. */
2556
5.10k
        if (result != BROTLI_DECODER_SUCCESS) {
2557
2
          break;
2558
2
        }
2559
5.10k
        if (s->large_window) {
2560
0
          s->state = BROTLI_STATE_LARGE_WINDOW_BITS;
2561
0
          break;
2562
0
        }
2563
5.10k
        s->state = BROTLI_STATE_INITIALIZE;
2564
5.10k
        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
5.10k
      case BROTLI_STATE_INITIALIZE:
2583
5.10k
        BROTLI_LOG_UINT(s->window_bits);
2584
        /* Maximum distance, see section 9.1. of the spec. */
2585
5.10k
        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
5.10k
        s->block_type_trees = (HuffmanCode*)BROTLI_DECODER_ALLOC(s,
2589
5.10k
            sizeof(HuffmanCode) * 3 *
2590
5.10k
                (BROTLI_HUFFMAN_MAX_SIZE_258 + BROTLI_HUFFMAN_MAX_SIZE_26));
2591
5.10k
        if (s->block_type_trees == 0) {
2592
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES);
2593
0
          break;
2594
0
        }
2595
5.10k
        s->block_len_trees =
2596
5.10k
            s->block_type_trees + 3 * BROTLI_HUFFMAN_MAX_SIZE_258;
2597
2598
5.10k
        s->state = BROTLI_STATE_METABLOCK_BEGIN;
2599
      /* Fall through. */
2600
2601
22.1k
      case BROTLI_STATE_METABLOCK_BEGIN:
2602
22.1k
        BrotliDecoderStateMetablockBegin(s);
2603
22.1k
        BROTLI_LOG_UINT(s->pos);
2604
22.1k
        s->state = BROTLI_STATE_METABLOCK_HEADER;
2605
      /* Fall through. */
2606
2607
40.4k
      case BROTLI_STATE_METABLOCK_HEADER:
2608
40.4k
        result = DecodeMetaBlockLength(s, br);  /* Reads 2 - 31 bits. */
2609
40.4k
        if (result != BROTLI_DECODER_SUCCESS) {
2610
18.5k
          break;
2611
18.5k
        }
2612
21.9k
        BROTLI_DCHECK(s->meta_block_remaining_len <=
2613
21.9k
                      (int)BROTLI_BLOCK_SIZE_CAP);
2614
21.9k
        BROTLI_LOG_UINT(s->is_last_metablock);
2615
21.9k
        BROTLI_LOG_UINT(s->meta_block_remaining_len);
2616
21.9k
        BROTLI_LOG_UINT(s->is_metadata);
2617
21.9k
        BROTLI_LOG_UINT(s->is_uncompressed);
2618
21.9k
        if (s->is_metadata || s->is_uncompressed) {
2619
7.72k
          if (!BrotliJumpToByteBoundary(br)) {
2620
54
            result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_1);
2621
54
            break;
2622
54
          }
2623
7.72k
        }
2624
21.8k
        if (s->is_metadata) {
2625
4.28k
          s->state = BROTLI_STATE_METADATA;
2626
4.28k
          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
4.28k
          break;
2631
4.28k
        }
2632
17.5k
        if (s->meta_block_remaining_len == 0) {
2633
62
          s->state = BROTLI_STATE_METABLOCK_DONE;
2634
62
          break;
2635
62
        }
2636
17.5k
        BrotliCalculateRingBufferSize(s);
2637
17.5k
        if (s->is_uncompressed) {
2638
3.38k
          s->state = BROTLI_STATE_UNCOMPRESSED;
2639
3.38k
          break;
2640
3.38k
        }
2641
14.1k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER;
2642
      /* Fall through. */
2643
2644
14.1k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_HEADER: {
2645
14.1k
        BrotliMetablockHeaderArena* h = &s->arena.header;
2646
14.1k
        s->loop_counter = 0;
2647
        /* Initialize compressed metablock header arena. */
2648
14.1k
        h->sub_loop_counter = 0;
2649
        /* Make small negative indexes addressable. */
2650
14.1k
        h->symbol_lists =
2651
14.1k
            &h->symbols_lists_array[BROTLI_HUFFMAN_MAX_CODE_LENGTH + 1];
2652
14.1k
        h->substate_huffman = BROTLI_STATE_HUFFMAN_NONE;
2653
14.1k
        h->substate_tree_group = BROTLI_STATE_TREE_GROUP_NONE;
2654
14.1k
        h->substate_context_map = BROTLI_STATE_CONTEXT_MAP_NONE;
2655
14.1k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2656
14.1k
      }
2657
      /* Fall through. */
2658
2659
56.9k
      case BROTLI_STATE_HUFFMAN_CODE_0:
2660
56.9k
        if (s->loop_counter >= 3) {
2661
13.5k
          s->state = BROTLI_STATE_METABLOCK_HEADER_2;
2662
13.5k
          break;
2663
13.5k
        }
2664
        /* Reads 1..11 bits. */
2665
43.4k
        result = DecodeVarLenUint8(s, br, &s->num_block_types[s->loop_counter]);
2666
43.4k
        if (result != BROTLI_DECODER_SUCCESS) {
2667
1.97k
          break;
2668
1.97k
        }
2669
41.4k
        s->num_block_types[s->loop_counter]++;
2670
41.4k
        BROTLI_LOG_UINT(s->num_block_types[s->loop_counter]);
2671
41.4k
        if (s->num_block_types[s->loop_counter] < 2) {
2672
37.1k
          s->loop_counter++;
2673
37.1k
          break;
2674
37.1k
        }
2675
4.33k
        s->state = BROTLI_STATE_HUFFMAN_CODE_1;
2676
      /* Fall through. */
2677
2678
7.63k
      case BROTLI_STATE_HUFFMAN_CODE_1: {
2679
7.63k
        brotli_reg_t alphabet_size = s->num_block_types[s->loop_counter] + 2;
2680
7.63k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_258;
2681
7.63k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2682
7.63k
            &s->block_type_trees[tree_offset], NULL, s);
2683
7.63k
        if (result != BROTLI_DECODER_SUCCESS) break;
2684
3.96k
        s->state = BROTLI_STATE_HUFFMAN_CODE_2;
2685
3.96k
      }
2686
      /* Fall through. */
2687
2688
8.79k
      case BROTLI_STATE_HUFFMAN_CODE_2: {
2689
8.79k
        brotli_reg_t alphabet_size = BROTLI_NUM_BLOCK_LEN_SYMBOLS;
2690
8.79k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2691
8.79k
        result = ReadHuffmanCode(alphabet_size, alphabet_size,
2692
8.79k
            &s->block_len_trees[tree_offset], NULL, s);
2693
8.79k
        if (result != BROTLI_DECODER_SUCCESS) break;
2694
3.80k
        s->state = BROTLI_STATE_HUFFMAN_CODE_3;
2695
3.80k
      }
2696
      /* Fall through. */
2697
2698
6.95k
      case BROTLI_STATE_HUFFMAN_CODE_3: {
2699
6.95k
        int tree_offset = s->loop_counter * BROTLI_HUFFMAN_MAX_SIZE_26;
2700
6.95k
        if (!SafeReadBlockLength(s, &s->block_length[s->loop_counter],
2701
6.95k
            &s->block_len_trees[tree_offset], br)) {
2702
3.19k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2703
3.19k
          break;
2704
3.19k
        }
2705
3.76k
        BROTLI_LOG_UINT(s->block_length[s->loop_counter]);
2706
3.76k
        s->loop_counter++;
2707
3.76k
        s->state = BROTLI_STATE_HUFFMAN_CODE_0;
2708
3.76k
        break;
2709
6.95k
      }
2710
2711
34.1k
      case BROTLI_STATE_UNCOMPRESSED: {
2712
34.1k
        result = CopyUncompressedBlockToOutput(
2713
34.1k
            available_out, next_out, total_out, s);
2714
34.1k
        if (result != BROTLI_DECODER_SUCCESS) {
2715
30.9k
          break;
2716
30.9k
        }
2717
3.19k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2718
3.19k
        break;
2719
34.1k
      }
2720
2721
1.10M
      case BROTLI_STATE_METADATA:
2722
1.10M
        result = SkipMetadataBlock(s);
2723
1.10M
        if (result != BROTLI_DECODER_SUCCESS) {
2724
1.10M
          break;
2725
1.10M
        }
2726
4.09k
        s->state = BROTLI_STATE_METABLOCK_DONE;
2727
4.09k
        break;
2728
2729
18.5k
      case BROTLI_STATE_METABLOCK_HEADER_2: {
2730
18.5k
        brotli_reg_t bits;
2731
18.5k
        if (!BrotliSafeReadBits(br, 6, &bits)) {
2732
5.11k
          result = BROTLI_DECODER_NEEDS_MORE_INPUT;
2733
5.11k
          break;
2734
5.11k
        }
2735
13.4k
        s->distance_postfix_bits = bits & BitMask(2);
2736
13.4k
        bits >>= 2;
2737
13.4k
        s->num_direct_distance_codes = bits << s->distance_postfix_bits;
2738
13.4k
        BROTLI_LOG_UINT(s->num_direct_distance_codes);
2739
13.4k
        BROTLI_LOG_UINT(s->distance_postfix_bits);
2740
13.4k
        s->context_modes =
2741
13.4k
            (uint8_t*)BROTLI_DECODER_ALLOC(s, (size_t)s->num_block_types[0]);
2742
13.4k
        if (s->context_modes == 0) {
2743
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES);
2744
0
          break;
2745
0
        }
2746
13.4k
        s->loop_counter = 0;
2747
13.4k
        s->state = BROTLI_STATE_CONTEXT_MODES;
2748
13.4k
      }
2749
      /* Fall through. */
2750
2751
15.0k
      case BROTLI_STATE_CONTEXT_MODES:
2752
15.0k
        result = ReadContextModes(s);
2753
15.0k
        if (result != BROTLI_DECODER_SUCCESS) {
2754
1.70k
          break;
2755
1.70k
        }
2756
13.3k
        s->state = BROTLI_STATE_CONTEXT_MAP_1;
2757
      /* Fall through. */
2758
2759
18.9k
      case BROTLI_STATE_CONTEXT_MAP_1:
2760
18.9k
        result = DecodeContextMap(
2761
18.9k
            s->num_block_types[0] << BROTLI_LITERAL_CONTEXT_BITS,
2762
18.9k
            &s->num_literal_htrees, &s->context_map, s);
2763
18.9k
        if (result != BROTLI_DECODER_SUCCESS) {
2764
5.72k
          break;
2765
5.72k
        }
2766
13.2k
        DetectTrivialLiteralBlockTypes(s);
2767
13.2k
        s->state = BROTLI_STATE_CONTEXT_MAP_2;
2768
      /* Fall through. */
2769
2770
15.2k
      case BROTLI_STATE_CONTEXT_MAP_2: {
2771
15.2k
        brotli_reg_t npostfix = s->distance_postfix_bits;
2772
15.2k
        brotli_reg_t ndirect = s->num_direct_distance_codes;
2773
15.2k
        brotli_reg_t distance_alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
2774
15.2k
            npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS);
2775
15.2k
        brotli_reg_t distance_alphabet_size_limit = distance_alphabet_size_max;
2776
15.2k
        BROTLI_BOOL allocation_success = BROTLI_TRUE;
2777
15.2k
        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
15.2k
        result = DecodeContextMap(
2786
15.2k
            s->num_block_types[2] << BROTLI_DISTANCE_CONTEXT_BITS,
2787
15.2k
            &s->num_dist_htrees, &s->dist_context_map, s);
2788
15.2k
        if (result != BROTLI_DECODER_SUCCESS) {
2789
2.13k
          break;
2790
2.13k
        }
2791
13.0k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2792
13.0k
            s, &s->literal_hgroup, BROTLI_NUM_LITERAL_SYMBOLS,
2793
13.0k
            BROTLI_NUM_LITERAL_SYMBOLS, s->num_literal_htrees);
2794
13.0k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2795
13.0k
            s, &s->insert_copy_hgroup, BROTLI_NUM_COMMAND_SYMBOLS,
2796
13.0k
            BROTLI_NUM_COMMAND_SYMBOLS, s->num_block_types[1]);
2797
13.0k
        allocation_success &= BrotliDecoderHuffmanTreeGroupInit(
2798
13.0k
            s, &s->distance_hgroup, distance_alphabet_size_max,
2799
13.0k
            distance_alphabet_size_limit, s->num_dist_htrees);
2800
13.0k
        if (!allocation_success) {
2801
0
          return BROTLI_SAVE_ERROR_CODE(
2802
0
              BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS));
2803
0
        }
2804
13.0k
        s->loop_counter = 0;
2805
13.0k
        s->state = BROTLI_STATE_TREE_GROUP;
2806
13.0k
      }
2807
      /* Fall through. */
2808
2809
82.6k
      case BROTLI_STATE_TREE_GROUP: {
2810
82.6k
        HuffmanTreeGroup* hgroup = NULL;
2811
82.6k
        switch (s->loop_counter) {
2812
27.1k
          case 0: hgroup = &s->literal_hgroup; break;
2813
24.8k
          case 1: hgroup = &s->insert_copy_hgroup; break;
2814
30.6k
          case 2: hgroup = &s->distance_hgroup; break;
2815
0
          default: return BROTLI_SAVE_ERROR_CODE(BROTLI_FAILURE(
2816
82.6k
              BROTLI_DECODER_ERROR_UNREACHABLE));  /* COV_NF_LINE */
2817
82.6k
        }
2818
82.6k
        result = HuffmanTreeGroupDecode(hgroup, s);
2819
82.6k
        if (result != BROTLI_DECODER_SUCCESS) break;
2820
37.9k
        s->loop_counter++;
2821
37.9k
        if (s->loop_counter < 3) {
2822
25.5k
          break;
2823
25.5k
        }
2824
12.4k
        s->state = BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY;
2825
12.4k
      }
2826
      /* Fall through. */
2827
2828
12.4k
      case BROTLI_STATE_BEFORE_COMPRESSED_METABLOCK_BODY:
2829
12.4k
        PrepareLiteralDecoding(s);
2830
12.4k
        s->dist_context_map_slice = s->dist_context_map;
2831
12.4k
        s->htree_command = s->insert_copy_hgroup.htrees[0];
2832
12.4k
        if (!BrotliEnsureRingBuffer(s)) {
2833
0
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2);
2834
0
          break;
2835
0
        }
2836
12.4k
        CalculateDistanceLut(s);
2837
12.4k
        s->state = BROTLI_STATE_COMMAND_BEGIN;
2838
      /* Fall through. */
2839
2840
133k
      case BROTLI_STATE_COMMAND_BEGIN:
2841
      /* Fall through. */
2842
1.15M
      case BROTLI_STATE_COMMAND_INNER:
2843
      /* Fall through. */
2844
1.30M
      case BROTLI_STATE_COMMAND_POST_DECODE_LITERALS:
2845
      /* Fall through. */
2846
1.63M
      case BROTLI_STATE_COMMAND_POST_WRAP_COPY:
2847
1.63M
        result = ProcessCommands(s);
2848
1.63M
        if (result == BROTLI_DECODER_NEEDS_MORE_INPUT) {
2849
1.39M
          result = SafeProcessCommands(s);
2850
1.39M
        }
2851
1.63M
        break;
2852
2853
1.43M
      case BROTLI_STATE_COMMAND_INNER_WRITE:
2854
      /* Fall through. */
2855
1.85M
      case BROTLI_STATE_COMMAND_POST_WRITE_1:
2856
      /* Fall through. */
2857
3.73M
      case BROTLI_STATE_COMMAND_POST_WRITE_2:
2858
3.73M
        result = WriteRingBuffer(
2859
3.73M
            s, available_out, next_out, total_out, BROTLI_FALSE);
2860
3.73M
        if (result != BROTLI_DECODER_SUCCESS) {
2861
3.24M
          break;
2862
3.24M
        }
2863
491k
        WrapRingBuffer(s);
2864
491k
        if (s->ringbuffer_size == 1 << s->window_bits) {
2865
491k
          s->max_distance = s->max_backward_distance;
2866
491k
        }
2867
491k
        if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_1) {
2868
54.6k
          BrotliDecoderCompoundDictionary* addon = s->compound_dictionary;
2869
54.6k
          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
54.6k
          if (s->meta_block_remaining_len == 0) {
2874
            /* Next metablock, if any. */
2875
82
            s->state = BROTLI_STATE_METABLOCK_DONE;
2876
54.5k
          } else {
2877
54.5k
            s->state = BROTLI_STATE_COMMAND_BEGIN;
2878
54.5k
          }
2879
54.6k
          break;
2880
436k
        } else if (s->state == BROTLI_STATE_COMMAND_POST_WRITE_2) {
2881
325k
          s->state = BROTLI_STATE_COMMAND_POST_WRAP_COPY;
2882
325k
        } else {  /* BROTLI_STATE_COMMAND_INNER_WRITE */
2883
111k
          if (s->loop_counter == 0) {
2884
24.9k
            if (s->meta_block_remaining_len == 0) {
2885
397
              s->state = BROTLI_STATE_METABLOCK_DONE;
2886
24.5k
            } else {
2887
24.5k
              s->state = BROTLI_STATE_COMMAND_POST_DECODE_LITERALS;
2888
24.5k
            }
2889
24.9k
            break;
2890
24.9k
          }
2891
86.2k
          s->state = BROTLI_STATE_COMMAND_INNER;
2892
86.2k
        }
2893
411k
        break;
2894
2895
411k
      case BROTLI_STATE_METABLOCK_DONE:
2896
17.7k
        if (s->meta_block_remaining_len < 0) {
2897
479
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2);
2898
479
          break;
2899
479
        }
2900
17.2k
        BrotliDecoderStateCleanupAfterMetablock(s);
2901
17.2k
        if (!s->is_last_metablock) {
2902
17.0k
          s->state = BROTLI_STATE_METABLOCK_BEGIN;
2903
17.0k
          break;
2904
17.0k
        }
2905
146
        if (!BrotliJumpToByteBoundary(br)) {
2906
40
          result = BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_PADDING_2);
2907
40
          break;
2908
40
        }
2909
106
        if (s->buffer_length == 0) {
2910
105
          BrotliBitReaderUnload(br);
2911
105
          *available_in = BrotliBitReaderGetAvailIn(br);
2912
105
          *next_in = br->next_in;
2913
105
        }
2914
106
        s->state = BROTLI_STATE_DONE;
2915
      /* Fall through. */
2916
2917
124k
      case BROTLI_STATE_DONE:
2918
124k
        if (s->ringbuffer != 0) {
2919
124k
          result = WriteRingBuffer(
2920
124k
              s, available_out, next_out, total_out, BROTLI_TRUE);
2921
124k
          if (result != BROTLI_DECODER_SUCCESS) {
2922
124k
            break;
2923
124k
          }
2924
124k
        }
2925
106
        return BROTLI_SAVE_ERROR_CODE(result);
2926
6.83M
    }
2927
6.83M
  }
2928
5.68M
  return BROTLI_SAVE_ERROR_CODE(result);
2929
5.68M
#undef BROTLI_SAVE_ERROR_CODE
2930
5.68M
}
2931
2932
0
BROTLI_BOOL BrotliDecoderHasMoreOutput(const BrotliDecoderState* s) {
2933
  /* After unrecoverable error remaining output is considered nonsensical. */
2934
0
  if ((int)s->error_code < 0) {
2935
0
    return BROTLI_FALSE;
2936
0
  }
2937
0
  return TO_BROTLI_BOOL(
2938
0
      s->ringbuffer != 0 && UnwrittenBytes(s, BROTLI_FALSE) != 0);
2939
0
}
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
0
BROTLI_BOOL BrotliDecoderIsUsed(const BrotliDecoderState* s) {
2967
0
  return TO_BROTLI_BOOL(s->state != BROTLI_STATE_UNINITED ||
2968
0
      BrotliGetAvailableBits(&s->br) != 0);
2969
0
}
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
0
BrotliDecoderErrorCode BrotliDecoderGetErrorCode(const BrotliDecoderState* s) {
2977
0
  return (BrotliDecoderErrorCode)s->error_code;
2978
0
}
2979
2980
0
const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c) {
2981
0
  switch (c) {
2982
0
#define BROTLI_ERROR_CODE_CASE_(PREFIX, NAME, CODE) \
2983
0
    case BROTLI_DECODER ## PREFIX ## NAME: return #PREFIX #NAME;
2984
0
#define BROTLI_NOTHING_
2985
0
    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
0
  }
2990
0
}
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