Browse Source

dsicinav: Check for overread in RLE decode.

Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
tags/n0.11
Michael Niedermayer 14 years ago
parent
commit
47f0beadba
1 changed files with 7 additions and 2 deletions
  1. +7
    -2
      libavcodec/dsicinav.c

+ 7
- 2
libavcodec/dsicinav.c View File

@@ -179,24 +179,29 @@ static int cin_decode_lzss(const unsigned char *src, int src_size, unsigned char
return 0;
}

static void cin_decode_rle(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
static int cin_decode_rle(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
{
int len, code;
unsigned char *dst_end = dst + dst_size;
const unsigned char *src_end = src + src_size;

while (src < src_end && dst < dst_end) {
while (src + 1 < src_end && dst < dst_end) {
code = *src++;
if (code & 0x80) {
len = code - 0x7F;
memset(dst, *src++, FFMIN(len, dst_end - dst));
} else {
len = code + 1;
if (len > src_end-src) {
av_log(0, AV_LOG_ERROR, "RLE overread\n");
return AVERROR_INVALIDDATA;
}
memcpy(dst, src, FFMIN(len, dst_end - dst));
src += len;
}
dst += len;
}
return 0;
}

static int cinvideo_decode_frame(AVCodecContext *avctx,


Loading…
Cancel
Save