[FFmpeg-devel] [PATCH] ensure input buffer padding is always initialized to 0

Reimar Döffinger Reimar.Doeffinger
Sat Apr 11 12:29:17 CEST 2009


Hello,
there are quite a few valgrind errors in all kinds of codecs because the
padding is not initialized to 0 as required.
Attached patch changes this. I have not checked if any of the code is
speed-critical enough to justify a more complicated method of doing
this, though in those cases av_fast_realloc should not have been used
since it involves a memcpy which AFAICT is completely useless in all
these cases (the previous data is not relevant).
-------------- next part --------------
Index: libavcodec/motionpixels.c
===================================================================
--- libavcodec/motionpixels.c	(revision 18427)
+++ libavcodec/motionpixels.c	(working copy)
@@ -298,6 +298,9 @@
 
     /* le32 bitstream msb first */
     mp->bswapbuf = av_fast_realloc(mp->bswapbuf, &mp->bswapbuf_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+    if (!mp->bswapbuf)
+        return AVERROR(ENOMEM);
+    memset(mp->bswapbuf + buf_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
     mp->dsp.bswap_buf((uint32_t *)mp->bswapbuf, (const uint32_t *)buf, buf_size / 4);
     if (buf_size & 3)
         memcpy(mp->bswapbuf + (buf_size & ~3), buf + (buf_size & ~3), buf_size & 3);
Index: libavcodec/mimic.c
===================================================================
--- libavcodec/mimic.c	(revision 18427)
+++ libavcodec/mimic.c	(working copy)
@@ -338,6 +338,7 @@
                                  swap_buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
     if(!ctx->swap_buf)
         return AVERROR_NOMEM;
+    memset(ctx->swap_buf + swap_buf_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
 
     ctx->dsp.bswap_buf((uint32_t*)ctx->swap_buf,
                         (const uint32_t*) buf,
Index: libavcodec/asv1.c
===================================================================
--- libavcodec/asv1.c	(revision 18427)
+++ libavcodec/asv1.c	(working copy)
@@ -408,6 +408,9 @@
     p->key_frame= 1;
 
     a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+    if (!a->bitstream_buffer)
+        AVERROR(ENOMEM);
+    memset(a->bitstream_buffer + buf_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
 
     if(avctx->codec_id == CODEC_ID_ASV1)
         a->dsp.bswap_buf((uint32_t*)a->bitstream_buffer, (const uint32_t*)buf, buf_size/4);
Index: libavcodec/h264.c
===================================================================
--- libavcodec/h264.c	(revision 18427)
+++ libavcodec/h264.c	(working copy)
@@ -1417,6 +1417,7 @@
     if (dst == NULL){
         return NULL;
     }
+    memset(dst + length, 0, FF_INPUT_BUFFER_PADDING_SIZE);
 
 //printf("decoding esc\n");
     memcpy(dst, src, i);
Index: libavcodec/mdec.c
===================================================================
--- libavcodec/mdec.c	(revision 18427)
+++ libavcodec/mdec.c	(working copy)
@@ -175,6 +175,9 @@
     p->key_frame= 1;
 
     a->bitstream_buffer= av_fast_realloc(a->bitstream_buffer, &a->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+    if (!a->bitstream_buffer)
+        return AVERROR(ENOMEM);
+    memset(a->bitstream_buffer + buf_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
     for(i=0; i<buf_size; i+=2){
         a->bitstream_buffer[i]  = buf[i+1];
         a->bitstream_buffer[i+1]= buf[i  ];
Index: libavcodec/parser.c
===================================================================
--- libavcodec/parser.c	(revision 18427)
+++ libavcodec/parser.c	(working copy)
@@ -274,6 +274,7 @@
         pc->buffer = new_buffer;
         memcpy(&pc->buffer[pc->index], *buf, *buf_size);
         pc->index += *buf_size;
+        memset(&pc->buffer[pc->index], 0, FF_INPUT_BUFFER_PADDING_SIZE);
         return -1;
     }
 
Index: libavcodec/h263dec.c
===================================================================
--- libavcodec/h263dec.c	(revision 18427)
+++ libavcodec/h263dec.c	(working copy)
@@ -692,6 +692,7 @@
                 &s->allocated_bitstream_buffer_size,
                 buf_size - current_pos + FF_INPUT_BUFFER_PADDING_SIZE);
             memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
+            memset(s->bitstream_buffer + buf_size - current_pos, 0, FF_INPUT_BUFFER_PADDING_SIZE);
             s->bitstream_buffer_size= buf_size - current_pos;
         }
     }
Index: libavcodec/eatqi.c
===================================================================
--- libavcodec/eatqi.c	(revision 18427)
+++ libavcodec/eatqi.c	(working copy)
@@ -129,6 +129,7 @@
     t->bitstream_buf = av_fast_realloc(t->bitstream_buf, &t->bitstream_buf_size, (buf_end-buf) + FF_INPUT_BUFFER_PADDING_SIZE);
     if (!t->bitstream_buf)
         return -1;
+    memset(t->bitstream_buf + (buf_end-buf), 0, FF_INPUT_BUFFER_PADDING_SIZE);
     s->dsp.bswap_buf((uint32_t*)t->bitstream_buf, (const uint32_t*)buf, (buf_end-buf)/4);
     init_get_bits(&s->gb, t->bitstream_buf, 8*(buf_end-buf));
 
Index: libavcodec/4xm.c
===================================================================
--- libavcodec/4xm.c	(revision 18427)
+++ libavcodec/4xm.c	(working copy)
@@ -376,6 +376,9 @@
     }
 
     f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
+    if (!f->bitstream_buffer)
+        return AVERROR(ENOMEM);
+    memset(f->bitstream_buffer + bitstream_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
     f->dsp.bswap_buf((uint32_t*)f->bitstream_buffer, (const uint32_t*)(buf + extra), bitstream_size/4);
     init_get_bits(&f->gb, f->bitstream_buffer, 8*bitstream_size);
 
@@ -654,6 +657,9 @@
     prestream_size= length + buf - prestream;
 
     f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
+    if (!f->bitstream_buffer)
+        return AVERROR(ENOMEM);
+    memset(f->bitstream_buffer + prestream_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
     f->dsp.bswap_buf((uint32_t*)f->bitstream_buffer, (const uint32_t*)prestream, prestream_size/4);
     init_get_bits(&f->pre_gb, f->bitstream_buffer, 8*prestream_size);
 
@@ -722,6 +728,7 @@
 
         memcpy(cfrm->data + cfrm->size, buf+20, data_size);
         cfrm->size += data_size;
+        memset(cfrm->data + cfrm->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
 
         if(cfrm->size >= whole_size){
             buf= cfrm->data;
Index: libavcodec/huffyuv.c
===================================================================
--- libavcodec/huffyuv.c	(revision 18427)
+++ libavcodec/huffyuv.c	(working copy)
@@ -956,6 +956,9 @@
     AVFrame *picture = data;
 
     s->bitstream_buffer= av_fast_realloc(s->bitstream_buffer, &s->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+    if (!s->bitstream_buffer)
+        return AVERROR(ENOMEM);
+    memset(s->bitstream_buffer + buf_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
 
     s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer, (const uint32_t*)buf, buf_size/4);
 



More information about the ffmpeg-devel mailing list