aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/vmdav.c
diff options
context:
space:
mode:
authorLaurent Aimar <fenrir@videolan.org>2011-09-24 23:16:19 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-09-24 23:42:49 +0200
commit6a6383bebcb03a785797007031ad1c9786a508a5 (patch)
tree2d6c61148aa25bc26e6c5e18361bd732103af958 /libavcodec/vmdav.c
parente7aed1280ea14b60fceae04d71dfd03e1daf2d04 (diff)
downloadffmpeg-6a6383bebcb03a785797007031ad1c9786a508a5.tar.gz
Prevent NULL dereferences when the previous frame is missing in vmd video decoder.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/vmdav.c')
-rw-r--r--libavcodec/vmdav.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/libavcodec/vmdav.c b/libavcodec/vmdav.c
index 202cbc4504..c335145e56 100644
--- a/libavcodec/vmdav.c
+++ b/libavcodec/vmdav.c
@@ -226,8 +226,9 @@ static void vmd_decode(VmdVideoContext *s)
/* if only a certain region will be updated, copy the entire previous
* frame before the decode */
- if (frame_x || frame_y || (frame_width != s->avctx->width) ||
- (frame_height != s->avctx->height)) {
+ if (s->prev_frame.data[0] &&
+ (frame_x || frame_y || (frame_width != s->avctx->width) ||
+ (frame_height != s->avctx->height))) {
memcpy(s->frame.data[0], s->prev_frame.data[0],
s->avctx->height * s->frame.linesize[0]);
@@ -272,7 +273,7 @@ static void vmd_decode(VmdVideoContext *s)
ofs += len;
} else {
/* interframe pixel copy */
- if (ofs + len + 1 > frame_width)
+ if (ofs + len + 1 > frame_width || !s->prev_frame.data[0])
return;
memcpy(&dp[ofs], &pp[ofs], len + 1);
ofs += len + 1;
@@ -312,7 +313,7 @@ static void vmd_decode(VmdVideoContext *s)
ofs += len;
} else {
/* interframe pixel copy */
- if (ofs + len + 1 > frame_width)
+ if (ofs + len + 1 > frame_width || !s->prev_frame.data[0])
return;
memcpy(&dp[ofs], &pp[ofs], len + 1);
ofs += len + 1;