diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 337fdd155f..427bb88a3e 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -173,6 +173,7 @@ struct MpegTSContext { /* scan context */ /** structure to keep track of Program->pids mapping */ unsigned int nb_prg; + unsigned int prg_size; ///< allocated size of prg in bytes struct Program *prg; int8_t crc_validity[NB_PID_MAX]; @@ -318,17 +319,26 @@ static void clear_programs(MpegTSContext *ts) { av_freep(&ts->prg); ts->nb_prg = 0; + ts->prg_size = 0; } static struct Program * add_program(MpegTSContext *ts, unsigned int programid) { struct Program *p = get_program(ts, programid); + struct Program *tmp = NULL; + size_t new_prg_size; if (p) return p; - if (av_reallocp_array(&ts->prg, ts->nb_prg + 1, sizeof(*ts->prg)) < 0) { - ts->nb_prg = 0; + + if (!av_size_mult(ts->nb_prg + 1, sizeof(*ts->prg), &new_prg_size)) + tmp = av_fast_realloc(ts->prg, &ts->prg_size,new_prg_size); + if (!tmp) { + av_freep(&ts->prg); + ts->nb_prg = 0; + ts->prg_size = 0; return NULL; } + ts->prg = tmp; p = &ts->prg[ts->nb_prg]; p->id = programid; clear_program(p);