lavfi/audio: fix size of copied samples.
authorNicolas George <nicolas.george@normalesup.org>
Wed, 6 Jun 2012 11:25:34 +0000 (13:25 +0200)
committerNicolas George <nicolas.george@normalesup.org>
Thu, 7 Jun 2012 15:03:45 +0000 (17:03 +0200)
Fixes sporadic segfaults with some filters.

libavfilter/audio.c

index 0616f97..a769c78 100644 (file)
@@ -190,7 +190,7 @@ void ff_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref)
     /* prepare to copy the samples if the buffer has insufficient permissions */
     if ((dst->min_perms & samplesref->perms) != dst->min_perms ||
         dst->rej_perms & samplesref->perms) {
-        int  i, planar = av_sample_fmt_is_planar(samplesref->format);
+        int  i, size, planar = av_sample_fmt_is_planar(samplesref->format);
         int planes = !planar ? 1:
                      av_get_channel_layout_nb_channels(samplesref->audio->channel_layout);
 
@@ -204,10 +204,13 @@ void ff_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref)
         link->cur_buf->audio->sample_rate = samplesref->audio->sample_rate;
 
         /* Copy actual data into new samples buffer */
+        /* src can be larger than dst if it was allocated larger than necessary.
+           dst can be slightly larger due to extra alignment padding. */
+        size = FFMIN(samplesref->linesize[0], link->cur_buf->linesize[0]);
         for (i = 0; samplesref->data[i] && i < 8; i++)
-            memcpy(link->cur_buf->data[i], samplesref->data[i], samplesref->linesize[0]);
+            memcpy(link->cur_buf->data[i], samplesref->data[i], size);
         for (i = 0; i < planes; i++)
-            memcpy(link->cur_buf->extended_data[i], samplesref->extended_data[i], samplesref->linesize[0]);
+            memcpy(link->cur_buf->extended_data[i], samplesref->extended_data[i], size);
 
         avfilter_unref_buffer(samplesref);
     } else