aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/resample.c
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2012-03-14 13:01:32 -0400
committerJustin Ruggles <justin.ruggles@gmail.com>2012-03-17 13:37:44 -0400
commit6ca3b248e21fc48418c4221fc92c2eecaf07cb9b (patch)
treea7bd4fd264a07ac30061e044fa41d02eb457002a /libavcodec/resample.c
parentb1740cb00a0dc91c0e4f3a89f469c8f1fd758dc0 (diff)
downloadandroid_external_ffmpeg-6ca3b248e21fc48418c4221fc92c2eecaf07cb9b.tar.gz
android_external_ffmpeg-6ca3b248e21fc48418c4221fc92c2eecaf07cb9b.tar.bz2
android_external_ffmpeg-6ca3b248e21fc48418c4221fc92c2eecaf07cb9b.zip
resample: allocate a large enough output buffer
Fixes invalid writes and crashes when doing conversions such as stereo to 5.1 channels or sample rate conversion on 5.1 channels.
Diffstat (limited to 'libavcodec/resample.c')
-rw-r--r--libavcodec/resample.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/libavcodec/resample.c b/libavcodec/resample.c
index ba8ce8910c..eacffede96 100644
--- a/libavcodec/resample.c
+++ b/libavcodec/resample.c
@@ -272,11 +272,13 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
lenout = 4 * nb_samples * s->ratio + 16;
if (s->sample_fmt[1] != AV_SAMPLE_FMT_S16) {
+ int out_size = lenout * av_get_bytes_per_sample(s->sample_fmt[1]) *
+ s->output_channels;
output_bak = output;
- if (!s->buffer_size[1] || s->buffer_size[1] < lenout) {
+ if (!s->buffer_size[1] || s->buffer_size[1] < out_size) {
av_free(s->buffer[1]);
- s->buffer_size[1] = lenout;
+ s->buffer_size[1] = out_size;
s->buffer[1] = av_malloc(s->buffer_size[1]);
if (!s->buffer[1]) {
av_log(s->resample_context, AV_LOG_ERROR, "Could not allocate buffer\n");