mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-27 06:08:21 +01:00
add WebPCheckCropDimensions()
and avoid integer overflow in test of x/width and y/height parameters against the image width/height Bug: chromium:1196778, chromium:1196777, chromium:1196480 Change-Id: I7b8f1f4dbebfe073b1ba260b8317979488655dcc
This commit is contained in:
parent
8fdaecb09d
commit
595fa13f83
@ -188,8 +188,7 @@ VP8StatusCode WebPAllocateDecBuffer(int width, int height,
|
|||||||
const int ch = options->crop_height;
|
const int ch = options->crop_height;
|
||||||
const int x = options->crop_left & ~1;
|
const int x = options->crop_left & ~1;
|
||||||
const int y = options->crop_top & ~1;
|
const int y = options->crop_top & ~1;
|
||||||
if (x < 0 || y < 0 || cw <= 0 || ch <= 0 ||
|
if (!WebPCheckCropDimensions(width, height, x, y, cw, ch)) {
|
||||||
x + cw > width || y + ch > height) {
|
|
||||||
return VP8_STATUS_INVALID_PARAM; // out of frame boundary.
|
return VP8_STATUS_INVALID_PARAM; // out of frame boundary.
|
||||||
}
|
}
|
||||||
width = cw;
|
width = cw;
|
||||||
|
@ -785,6 +785,13 @@ VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size,
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Cropping and rescaling.
|
// Cropping and rescaling.
|
||||||
|
|
||||||
|
int WebPCheckCropDimensions(int image_width, int image_height,
|
||||||
|
int x, int y, int w, int h) {
|
||||||
|
return !(x < 0 || y < 0 || w <= 0 || h <= 0 ||
|
||||||
|
x >= image_width || w > image_width || w > image_width - x ||
|
||||||
|
y >= image_height || h > image_height || h > image_height - y);
|
||||||
|
}
|
||||||
|
|
||||||
int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
|
int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
|
||||||
VP8Io* const io, WEBP_CSP_MODE src_colorspace) {
|
VP8Io* const io, WEBP_CSP_MODE src_colorspace) {
|
||||||
const int W = io->width;
|
const int W = io->width;
|
||||||
@ -802,7 +809,7 @@ int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
|
|||||||
x &= ~1;
|
x &= ~1;
|
||||||
y &= ~1;
|
y &= ~1;
|
||||||
}
|
}
|
||||||
if (x < 0 || y < 0 || w <= 0 || h <= 0 || x + w > W || y + h > H) {
|
if (!WebPCheckCropDimensions(W, H, x, y, w, h)) {
|
||||||
return 0; // out of frame boundary error
|
return 0; // out of frame boundary error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,6 +77,10 @@ VP8StatusCode WebPParseHeaders(WebPHeaderStructure* const headers);
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Misc utils
|
// Misc utils
|
||||||
|
|
||||||
|
// Returns true if crop dimensions are within image bounds.
|
||||||
|
int WebPCheckCropDimensions(int image_width, int image_height,
|
||||||
|
int x, int y, int w, int h);
|
||||||
|
|
||||||
// Initializes VP8Io with custom setup, io and teardown functions. The default
|
// Initializes VP8Io with custom setup, io and teardown functions. The default
|
||||||
// hooks will use the supplied 'params' as io->opaque handle.
|
// hooks will use the supplied 'params' as io->opaque handle.
|
||||||
void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io);
|
void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io);
|
||||||
|
Loading…
Reference in New Issue
Block a user