aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2020-07-15 22:47:50 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2021-09-09 13:37:20 +0200
commitbd5e97fd6b64838851769c61c4d64fb8ea6bdc69 (patch)
tree5a2d7df0110f745d00cef0d0f8e1e32c6b5c0147
parent4646f94b9cc83facb651a4540f342014cb75f937 (diff)
downloadffmpeg-bd5e97fd6b64838851769c61c4d64fb8ea6bdc69.tar.gz
avcodec/tdsc: Fix tile checks
Fixes: out of array access Fixes: crash.asf Found-by: anton listov <greyfarn7@yandex.ru> Reviewed-by: anton listov <greyfarn7@yandex.ru> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> (cherry picked from commit 081e3001edb67dcd55fe0f68505df1fce667476d) Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavcodec/tdsc.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/libavcodec/tdsc.c b/libavcodec/tdsc.c
index e9ea41ef55..854e7e0510 100644
--- a/libavcodec/tdsc.c
+++ b/libavcodec/tdsc.c
@@ -390,7 +390,7 @@ static int tdsc_decode_tiles(AVCodecContext *avctx, int number_tiles)
for (i = 0; i < number_tiles; i++) {
int tile_size;
int tile_mode;
- int x, y, w, h;
+ int x, y, x2, y2, w, h;
int ret;
if (bytestream2_get_bytes_left(&ctx->gbc) < 4 ||
@@ -408,20 +408,19 @@ static int tdsc_decode_tiles(AVCodecContext *avctx, int number_tiles)
bytestream2_skip(&ctx->gbc, 4); // unknown
x = bytestream2_get_le32(&ctx->gbc);
y = bytestream2_get_le32(&ctx->gbc);
- w = bytestream2_get_le32(&ctx->gbc) - x;
- h = bytestream2_get_le32(&ctx->gbc) - y;
+ x2 = bytestream2_get_le32(&ctx->gbc);
+ y2 = bytestream2_get_le32(&ctx->gbc);
- if (x >= ctx->width || y >= ctx->height) {
+ if (x < 0 || y < 0 || x2 <= x || y2 <= y ||
+ x2 > ctx->width || y2 > ctx->height
+ ) {
av_log(avctx, AV_LOG_ERROR,
- "Invalid tile position (%d.%d outside %dx%d).\n",
- x, y, ctx->width, ctx->height);
- return AVERROR_INVALIDDATA;
- }
- if (x + w > ctx->width || y + h > ctx->height) {
- av_log(avctx, AV_LOG_ERROR,
- "Invalid tile size %dx%d\n", w, h);
+ "Invalid tile position (%d.%d %d.%d outside %dx%d).\n",
+ x, y, x2, y2, ctx->width, ctx->height);
return AVERROR_INVALIDDATA;
}
+ w = x2 - x;
+ h = y2 - y;
ret = av_reallocp(&ctx->tilebuffer, tile_size);
if (!ctx->tilebuffer)