mirror of
https://github.com/webmproject/libwebp.git
synced 2026-04-09 06:12:32 +02:00
Limit the amount of RAM allocated for Huffman trees
This will help excessive memory allocation for images not encoded by libwebp. BUG: 494764367 Change-Id: I95fc345df541d8b134e455c8c33a496f46746655
This commit is contained in:
@@ -59,4 +59,8 @@ enum {
|
||||
// Check that webp_csp_mode is within the bounds of WEBP_CSP_MODE.
|
||||
int IsValidColorspace(int webp_csp_mode);
|
||||
|
||||
// Lossless: maximum number of histogram images (sub-blocks). This is defined
|
||||
// for encoding efficiency, the standard allows for more.
|
||||
#define MAX_HUFF_IMAGE_SIZE 2600
|
||||
|
||||
#endif // WEBP_DEC_COMMON_DEC_H_
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "src/dec/alphai_dec.h"
|
||||
#include "src/dec/common_dec.h"
|
||||
#include "src/dec/vp8_dec.h"
|
||||
#include "src/dec/vp8li_dec.h"
|
||||
#include "src/dec/webpi_dec.h"
|
||||
@@ -456,6 +457,7 @@ int ReadHuffmanCodesHelper(int color_cache_bits, int num_htree_groups,
|
||||
kAlphabetSize[0] + ((color_cache_bits > 0) ? 1 << color_cache_bits : 0);
|
||||
const int table_size = kTableSize[color_cache_bits];
|
||||
int* code_lengths = NULL;
|
||||
int total_huffman_table_size;
|
||||
|
||||
if ((mapping == NULL && num_htree_groups != num_htree_groups_max) ||
|
||||
num_htree_groups > num_htree_groups_max) {
|
||||
@@ -466,9 +468,14 @@ int ReadHuffmanCodesHelper(int color_cache_bits, int num_htree_groups,
|
||||
(int*)WebPSafeCalloc((uint64_t)max_alphabet_size, sizeof(*code_lengths));
|
||||
*htree_groups = VP8LHtreeGroupsNew(num_htree_groups);
|
||||
|
||||
// MAX_HUFF_IMAGE_SIZE is above what the libwebp encoder allows so something
|
||||
// fishy might be happening. Do not allocate too much yet.
|
||||
total_huffman_table_size =
|
||||
(num_htree_groups_max > MAX_HUFF_IMAGE_SIZE ? MAX_HUFF_IMAGE_SIZE
|
||||
: num_htree_groups) *
|
||||
table_size;
|
||||
if (*htree_groups == NULL || code_lengths == NULL ||
|
||||
!VP8LHuffmanTablesAllocate(num_htree_groups * table_size,
|
||||
huffman_tables)) {
|
||||
!VP8LHuffmanTablesAllocate(total_huffman_table_size, huffman_tables)) {
|
||||
VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
|
||||
goto Error;
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "src/dec/common_dec.h"
|
||||
#include "src/dsp/lossless.h"
|
||||
#include "src/dsp/lossless_common.h"
|
||||
#include "src/enc/backward_references_enc.h"
|
||||
@@ -31,8 +32,6 @@
|
||||
#include "src/webp/format_constants.h"
|
||||
#include "src/webp/types.h"
|
||||
|
||||
// Maximum number of histogram images (sub-blocks).
|
||||
#define MAX_HUFF_IMAGE_SIZE 2600
|
||||
#define MAX_HUFFMAN_BITS (MIN_HUFFMAN_BITS + (1 << NUM_HUFFMAN_BITS) - 1)
|
||||
// Empirical value for which it becomes too computationally expensive to
|
||||
// compute the best predictor image.
|
||||
|
||||
Reference in New Issue
Block a user