Fix Base64 position wrap handling
diff --git a/c/enc/encode.c b/c/enc/encode.c index 0d424c3..ac62a14 100644 --- a/c/enc/encode.c +++ b/c/enc/encode.c
@@ -514,6 +514,7 @@ int* dist_cache, size_t* storage_ix, uint8_t* storage) { + const uint32_t wrapped_last_flush_pos = WrapPosition(last_flush_pos); uint16_t last_bytes; uint8_t last_bytes_bits; ContextLut literal_context_lut = BROTLI_CONTEXT_LUT(literal_context_mode); @@ -532,7 +533,7 @@ CreateBackwardReferences is now unused. */ memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0])); BrotliStoreUncompressedMetaBlock(is_last, data, - (size_t)last_flush_pos, mask, bytes, + wrapped_last_flush_pos, mask, bytes, storage_ix, storage); return; } @@ -541,13 +542,13 @@ last_bytes = (uint16_t)((storage[1] << 8) | storage[0]); last_bytes_bits = (uint8_t)(*storage_ix); if (params->quality <= MAX_QUALITY_FOR_STATIC_ENTROPY_CODES) { - BrotliStoreMetaBlockFast(m, data, (size_t)last_flush_pos, + BrotliStoreMetaBlockFast(m, data, wrapped_last_flush_pos, bytes, mask, is_last, params, commands, num_commands, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; } else if (params->quality < MIN_QUALITY_FOR_BLOCK_SPLIT) { - BrotliStoreMetaBlockTrivial(m, data, (size_t)last_flush_pos, + BrotliStoreMetaBlockTrivial(m, data, wrapped_last_flush_pos, bytes, mask, is_last, params, commands, num_commands, storage_ix, storage); @@ -564,18 +565,18 @@ BROTLI_ALLOC(m, uint32_t, 32 * (BROTLI_MAX_STATIC_CONTEXTS + 1)); if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(arena)) return; DecideOverLiteralContextModeling( - data, (size_t)last_flush_pos, bytes, mask, params->quality, + data, wrapped_last_flush_pos, bytes, mask, params->quality, params->size_hint, &num_literal_contexts, &literal_context_map, arena); BROTLI_FREE(m, arena); } - BrotliBuildMetaBlockGreedy(m, data, (size_t)last_flush_pos, mask, + BrotliBuildMetaBlockGreedy(m, data, wrapped_last_flush_pos, mask, base64_regions, num_base64_regions, prev_byte, prev_byte2, literal_context_lut, num_literal_contexts, literal_context_map, commands, num_commands, &mb); if (BROTLI_IS_OOM(m)) return; } else { - BrotliBuildMetaBlock(m, data, (size_t)last_flush_pos, mask, + BrotliBuildMetaBlock(m, data, wrapped_last_flush_pos, mask, base64_regions, num_base64_regions, &block_params, prev_byte, prev_byte2, @@ -590,7 +591,7 @@ for "Large Window Brotli" (32-bit). */ BrotliOptimizeHistograms(block_params.dist.alphabet_size_limit, &mb); } - BrotliStoreMetaBlock(m, data, (size_t)last_flush_pos, bytes, mask, + BrotliStoreMetaBlock(m, data, wrapped_last_flush_pos, bytes, mask, prev_byte, prev_byte2, is_last, &block_params, @@ -608,7 +609,7 @@ storage[1] = (uint8_t)(last_bytes >> 8); *storage_ix = last_bytes_bits; BrotliStoreUncompressedMetaBlock(is_last, data, - (size_t)last_flush_pos, mask, + wrapped_last_flush_pos, mask, bytes, storage_ix, storage); } }