aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Cadhalpun <andreas.cadhalpun@googlemail.com>2015-05-04 21:07:52 +0200
committerAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2015-07-30 18:53:10 +0200
commit74a88a509c6e60bec20cb74291b69b9d5dff0a0d (patch)
treef2bbbb431fb20f258f57c146d36d78f34bee1755
parentff68bf7a1bf32bd497f758c231fd7d816f07d86c (diff)
downloadffmpeg-74a88a509c6e60bec20cb74291b69b9d5dff0a0d.tar.gz
avidec: check for valid bit_rate range
If bit_rate is negative, it can trigger an av_assert2 in av_rescale_rnd. Since av_rescale returns int64_t, but st->codec_bit_rate is int, it can also overflow into a negative value. Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at> (cherry picked from commit 0eec40b713eee84e2aec8af35ccce059817cad2a) Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
-rw-r--r--libavformat/avidec.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 91e8514b4b..621bd5f9fa 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -448,6 +448,7 @@ static int calculate_bitrate(AVFormatContext *s)
int64_t len = 0;
AVStream *st = s->streams[i];
int64_t duration;
+ int64_t bitrate;
for (j = 0; j < st->nb_index_entries; j++)
len += st->index_entries[j].size;
@@ -455,7 +456,10 @@ static int calculate_bitrate(AVFormatContext *s)
if (st->nb_index_entries < 2 || st->codec->bit_rate > 0)
continue;
duration = st->index_entries[j-1].timestamp - st->index_entries[0].timestamp;
- st->codec->bit_rate = av_rescale(8*len, st->time_base.den, duration * st->time_base.num);
+ bitrate = av_rescale(8*len, st->time_base.den, duration * st->time_base.num);
+ if (bitrate <= INT_MAX && bitrate > 0) {
+ st->codec->bit_rate = bitrate;
+ }
}
return 1;
}