diff options
author | Vittorio Giovara <vittorio.giovara@gmail.com> | 2015-05-31 14:55:19 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2015-05-31 15:03:31 +0200 |
commit | 28fb80dcbf6f63eedfcfffc725a6bf0069d03fab (patch) | |
tree | 23cd2b2cca1e20135391c3bc99fb024e8f1a1c92 | |
parent | 42df71d9bbb1a5b4bce0bb34417692565c72d390 (diff) | |
download | ffmpeg-28fb80dcbf6f63eedfcfffc725a6bf0069d03fab.tar.gz |
svq1: Check memory allocation
-rw-r--r-- | libavcodec/svq1enc.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c index 8677503b4f..08d85b8fbf 100644 --- a/libavcodec/svq1enc.c +++ b/libavcodec/svq1enc.c @@ -292,6 +292,8 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane, s->motion_val16[plane] = av_mallocz((s->m.mb_stride * (block_height + 2) + 1) * 2 * sizeof(int16_t)); + if (!s->motion_val8[plane] || !s->motion_val16[plane]) + return AVERROR(ENOMEM); } s->m.mb_type = s->mb_type; @@ -549,6 +551,12 @@ static av_cold int svq1_encode_init(AVCodecContext *avctx) s->y_block_height * sizeof(int32_t)); s->ssd_int8_vs_int16 = ssd_int8_vs_int16_c; + if (!s->m.me.temp || !s->m.me.scratchpad || !s->m.me.map || + !s->m.me.score_map || !s->mb_type || !s->dummy) { + svq1_encode_end(avctx); + return AVERROR(ENOMEM); + } + if (ARCH_PPC) ff_svq1enc_init_ppc(s); if (ARCH_X86) @@ -612,8 +620,15 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt, s->frame_width / (i ? 4 : 1), s->frame_height / (i ? 4 : 1), pict->linesize[i], - s->current_picture->linesize[i]) < 0) + s->current_picture->linesize[i]) < 0) { + int j; + for (j = 0; j < i; j++) { + av_freep(&s->motion_val8[j]); + av_freep(&s->motion_val16[j]); + } + av_freep(&s->scratchbuf); return -1; + } // avpriv_align_put_bits(&s->pb); while (put_bits_count(&s->pb) & 31) |