Merge "Adds fbounds annotations for VP8LColorCache." into main

This commit is contained in:
James Zern
2025-08-15 19:38:10 -07:00
committed by Gerrit Code Review
4 changed files with 17 additions and 8 deletions

View File

@@ -28,13 +28,19 @@ WEBP_ASSUME_UNSAFE_INDEXABLE_ABI
int VP8LColorCacheInit(VP8LColorCache* const color_cache, int hash_bits) { int VP8LColorCacheInit(VP8LColorCache* const color_cache, int hash_bits) {
const int hash_size = 1 << hash_bits; const int hash_size = 1 << hash_bits;
uint32_t* colors = (uint32_t*)WebPSafeCalloc((uint64_t)hash_size,
sizeof(*color_cache->colors));
assert(color_cache != NULL); assert(color_cache != NULL);
assert(hash_bits > 0); assert(hash_bits > 0);
color_cache->colors = (uint32_t*)WebPSafeCalloc((uint64_t)hash_size, if (colors == NULL) {
sizeof(*color_cache->colors)); color_cache->colors = NULL;
if (color_cache->colors == NULL) return 0; WEBP_SELF_ASSIGN(color_cache->hash_bits);
return 0;
}
color_cache->hash_shift = 32 - hash_bits; color_cache->hash_shift = 32 - hash_bits;
color_cache->hash_bits = hash_bits; color_cache->hash_bits = hash_bits;
color_cache->colors = WEBP_UNSAFE_FORGE_BIDI_INDEXABLE(
uint32_t*, colors, (size_t)hash_size * sizeof(*color_cache->colors));
return 1; return 1;
} }
@@ -42,6 +48,7 @@ void VP8LColorCacheClear(VP8LColorCache* const color_cache) {
if (color_cache != NULL) { if (color_cache != NULL) {
WebPSafeFree(color_cache->colors); WebPSafeFree(color_cache->colors);
color_cache->colors = NULL; color_cache->colors = NULL;
WEBP_SELF_ASSIGN(color_cache->hash_bits);
} }
} }

View File

@@ -30,8 +30,8 @@ extern "C" {
// Main color cache struct. // Main color cache struct.
typedef struct { typedef struct {
uint32_t* colors; // color entries uint32_t* WEBP_COUNTED_BY_OR_NULL(1u << hash_bits) colors; // color entries
int hash_shift; // Hash shift: 32 - 'hash_bits'. int hash_shift; // Hash shift: 32 - 'hash_bits'.
int hash_bits; int hash_bits;
} VP8LColorCache; } VP8LColorCache;

View File

@@ -211,14 +211,15 @@ void* WebPSafeMalloc(uint64_t nmemb, size_t size) {
return ptr; return ptr;
} }
void* WebPSafeCalloc(uint64_t nmemb, size_t size) { void* WEBP_SIZED_BY_OR_NULL(nmemb* size)
WebPSafeCalloc(uint64_t nmemb, size_t size) {
void* ptr; void* ptr;
Increment(&num_calloc_calls); Increment(&num_calloc_calls);
if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL; if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL;
assert(nmemb * size > 0); assert(nmemb * size > 0);
ptr = calloc((size_t)nmemb, size); ptr = calloc((size_t)nmemb, size);
AddMem(ptr, (size_t)(nmemb * size)); AddMem(ptr, (size_t)(nmemb * size));
return ptr; return WEBP_UNSAFE_FORGE_BIDI_INDEXABLE(void*, ptr, (size_t)(nmemb * size));
} }
void WebPSafeFree(void* const ptr) { void WebPSafeFree(void* const ptr) {

View File

@@ -56,7 +56,8 @@ static WEBP_INLINE int CheckSizeOverflow(uint64_t size) {
WEBP_EXTERN void* WebPSafeMalloc(uint64_t nmemb, size_t size); WEBP_EXTERN void* WebPSafeMalloc(uint64_t nmemb, size_t size);
// Note that WebPSafeCalloc() expects the second argument type to be 'size_t' // Note that WebPSafeCalloc() expects the second argument type to be 'size_t'
// in order to favor the "calloc(num_foo, sizeof(foo))" pattern. // in order to favor the "calloc(num_foo, sizeof(foo))" pattern.
WEBP_EXTERN void* WebPSafeCalloc(uint64_t nmemb, size_t size); WEBP_EXTERN void* WEBP_SIZED_BY_OR_NULL(nmemb* size)
WebPSafeCalloc(uint64_t nmemb, size_t size);
// Companion deallocation function to the above allocations. // Companion deallocation function to the above allocations.
WEBP_EXTERN void WebPSafeFree(void* const ptr); WEBP_EXTERN void WebPSafeFree(void* const ptr);