summaryrefslogtreecommitdiff
path: root/libavcodec/rv10.c
diff options
context:
space:
mode:
authorJanne Grunau <janne-libav@jannau.net>2012-01-23 20:57:04 +0100
committerJanne Grunau <janne-libav@jannau.net>2012-01-24 02:16:02 +0100
commit1d3a9e63e0dcbcba633d939cdfb79e977259be13 (patch)
treeea64d0efcb1f4023263fbadda2e0c245c54abc41 /libavcodec/rv10.c
parent0fec2cb15cc6ff1fcc724c774ec36abadcb7b6ad (diff)
rv10: verify slice offsets against buffer size
Found by John Villamil <johnv@matasano.com> in fuzzed rv20 in mkv files.
Diffstat (limited to 'libavcodec/rv10.c')
-rw-r--r--libavcodec/rv10.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c
index 1d78c92c46..9f2fe77af7 100644
--- a/libavcodec/rv10.c
+++ b/libavcodec/rv10.c
@@ -647,9 +647,12 @@ static int rv10_decode_frame(AVCodecContext *avctx,
slice_count = avctx->slice_count;
for(i=0; i<slice_count; i++){
- int offset= get_slice_offset(avctx, slices_hdr, i);
+ unsigned offset = get_slice_offset(avctx, slices_hdr, i);
int size, size2;
+ if (offset >= buf_size)
+ return AVERROR_INVALIDDATA;
+
if(i+1 == slice_count)
size= buf_size - offset;
else
@@ -660,6 +663,10 @@ static int rv10_decode_frame(AVCodecContext *avctx,
else
size2= get_slice_offset(avctx, slices_hdr, i+2) - offset;
+ if (size <= 0 || size2 <= 0 ||
+ offset + FFMAX(size, size2) > buf_size)
+ return AVERROR_INVALIDDATA;
+
if(rv10_decode_packet(avctx, buf+offset, size, size2) > 8*size)
i++;
}