diff -up libwebp-0.3.0/src/dec/buffer.c.old libwebp-0.3.0/src/dec/buffer.c --- libwebp-0.3.0/src/dec/buffer.c.old 2021-05-17 12:37:43.268514218 +0200 +++ libwebp-0.3.0/src/dec/buffer.c 2021-05-17 12:38:27.435859390 +0200 @@ -35,6 +35,11 @@ static int IsValidColorspace(int webp_cs return (webp_csp_mode >= MODE_RGB && webp_csp_mode < MODE_LAST); } +// strictly speaking, the very last (or first, if flipped) row +// doesn't require padding. +#define MIN_BUFFER_SIZE(WIDTH, HEIGHT, STRIDE) \ + ((uint64_t)(STRIDE) * ((HEIGHT) - 1) + (WIDTH)) + static VP8StatusCode CheckDecBuffer(const WebPDecBuffer* const buffer) { int ok = 1; const WEBP_CSP_MODE mode = buffer->colorspace; @@ -64,7 +69,9 @@ static VP8StatusCode CheckDecBuffer(cons } } else { // RGB checks const WebPRGBABuffer* const buf = &buffer->u.RGBA; - const uint64_t size = (uint64_t)buf->stride * height; + const int stride = abs(buf->stride); + const uint64_t size = + MIN_BUFFER_SIZE(width * kModeBpp[mode], height, stride); ok &= (size <= buf->size); ok &= (buf->stride >= width * kModeBpp[mode]); ok &= (buf->rgba != NULL);