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 0eec40b713)
Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
This commit is contained in:
Andreas Cadhalpun 2015-05-04 21:07:52 +02:00 committed by Andreas Cadhalpun
parent ff68bf7a1b
commit 74a88a509c

View File

@ -448,6 +448,7 @@ static int calculate_bitrate(AVFormatContext *s)
int64_t len = 0; int64_t len = 0;
AVStream *st = s->streams[i]; AVStream *st = s->streams[i];
int64_t duration; int64_t duration;
int64_t bitrate;
for (j = 0; j < st->nb_index_entries; j++) for (j = 0; j < st->nb_index_entries; j++)
len += st->index_entries[j].size; 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) if (st->nb_index_entries < 2 || st->codec->bit_rate > 0)
continue; continue;
duration = st->index_entries[j-1].timestamp - st->index_entries[0].timestamp; 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; return 1;
} }