Commit f369b935 authored by Alexandra Khirnova's avatar Alexandra Khirnova Committed by Diego Biurrun

avformat: Use av_reallocp_array() where suitable

Signed-off-by: 's avatarDiego Biurrun <diego@biurrun.de>
parent bdf99042
...@@ -788,10 +788,14 @@ static int asf_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -788,10 +788,14 @@ static int asf_write_packet(AVFormatContext *s, AVPacket *pkt)
if (start_sec != (int)(asf->last_indexed_pts / INT64_C(10000000))) { if (start_sec != (int)(asf->last_indexed_pts / INT64_C(10000000))) {
for (i = asf->nb_index_count; i < start_sec; i++) { for (i = asf->nb_index_count; i < start_sec; i++) {
if (i >= asf->nb_index_memory_alloc) { if (i >= asf->nb_index_memory_alloc) {
int err;
asf->nb_index_memory_alloc += ASF_INDEX_BLOCK; asf->nb_index_memory_alloc += ASF_INDEX_BLOCK;
asf->index_ptr = (ASFIndex *)av_realloc(asf->index_ptr, if ((err = av_reallocp_array(&asf->index_ptr,
sizeof(ASFIndex) * asf->nb_index_memory_alloc,
asf->nb_index_memory_alloc); sizeof(*asf->index_ptr))) < 0) {
asf->nb_index_memory_alloc = 0;
return err;
}
} }
// store // store
asf->index_ptr[i].packet_number = (uint32_t)packet_st; asf->index_ptr[i].packet_number = (uint32_t)packet_st;
......
...@@ -342,11 +342,13 @@ static int gxf_write_map_packet(AVFormatContext *s, int rewrite) ...@@ -342,11 +342,13 @@ static int gxf_write_map_packet(AVFormatContext *s, int rewrite)
if (!rewrite) { if (!rewrite) {
if (!(gxf->map_offsets_nb % 30)) { if (!(gxf->map_offsets_nb % 30)) {
gxf->map_offsets = av_realloc(gxf->map_offsets, int err;
(gxf->map_offsets_nb+30)*sizeof(*gxf->map_offsets)); if ((err = av_reallocp_array(&gxf->map_offsets,
if (!gxf->map_offsets) { gxf->map_offsets_nb + 30,
sizeof(*gxf->map_offsets))) < 0) {
gxf->map_offsets_nb = 0;
av_log(s, AV_LOG_ERROR, "could not realloc map offsets\n"); av_log(s, AV_LOG_ERROR, "could not realloc map offsets\n");
return -1; return err;
} }
} }
gxf->map_offsets[gxf->map_offsets_nb++] = pos; // do not increment here gxf->map_offsets[gxf->map_offsets_nb++] = pos; // do not increment here
...@@ -873,11 +875,13 @@ static int gxf_write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -873,11 +875,13 @@ static int gxf_write_packet(AVFormatContext *s, AVPacket *pkt)
if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
if (!(gxf->flt_entries_nb % 500)) { if (!(gxf->flt_entries_nb % 500)) {
gxf->flt_entries = av_realloc(gxf->flt_entries, int err;
(gxf->flt_entries_nb+500)*sizeof(*gxf->flt_entries)); if ((err = av_reallocp_array(&gxf->flt_entries,
if (!gxf->flt_entries) { gxf->flt_entries_nb + 500,
sizeof(*gxf->flt_entries))) < 0) {
gxf->flt_entries_nb = 0;
av_log(s, AV_LOG_ERROR, "could not reallocate flt entries\n"); av_log(s, AV_LOG_ERROR, "could not reallocate flt entries\n");
return -1; return err;
} }
} }
gxf->flt_entries[gxf->flt_entries_nb++] = packet_start_offset; gxf->flt_entries[gxf->flt_entries_nb++] = packet_start_offset;
......
...@@ -878,15 +878,16 @@ static int ebml_parse_elem(MatroskaDemuxContext *matroska, ...@@ -878,15 +878,16 @@ static int ebml_parse_elem(MatroskaDemuxContext *matroska,
uint32_t id = syntax->id; uint32_t id = syntax->id;
uint64_t length; uint64_t length;
int res; int res;
void *newelem;
data = (char *)data + syntax->data_offset; data = (char *)data + syntax->data_offset;
if (syntax->list_elem_size) { if (syntax->list_elem_size) {
EbmlList *list = data; EbmlList *list = data;
newelem = av_realloc(list->elem, (list->nb_elem+1)*syntax->list_elem_size); if ((res = av_reallocp_array(&list->elem,
if (!newelem) list->nb_elem + 1,
return AVERROR(ENOMEM); syntax->list_elem_size)) < 0) {
list->elem = newelem; list->nb_elem = 0;
return res;
}
data = (char*)list->elem + list->nb_elem*syntax->list_elem_size; data = (char*)list->elem + list->nb_elem*syntax->list_elem_size;
memset(data, 0, syntax->list_elem_size); memset(data, 0, syntax->list_elem_size);
list->nb_elem++; list->nb_elem++;
......
...@@ -295,14 +295,17 @@ static mkv_seekhead * mkv_start_seekhead(AVIOContext *pb, int64_t segment_offset ...@@ -295,14 +295,17 @@ static mkv_seekhead * mkv_start_seekhead(AVIOContext *pb, int64_t segment_offset
static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos) static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos)
{ {
mkv_seekhead_entry *entries = seekhead->entries; mkv_seekhead_entry *entries = seekhead->entries;
int err;
// don't store more elements than we reserved space for // don't store more elements than we reserved space for
if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries) if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries)
return -1; return -1;
entries = av_realloc(entries, (seekhead->num_entries + 1) * sizeof(mkv_seekhead_entry)); if ((err = av_reallocp_array(&entries, seekhead->num_entries + 1,
if (entries == NULL) sizeof(*entries))) < 0) {
return AVERROR(ENOMEM); seekhead->num_entries = 0;
return err;
}
entries[seekhead->num_entries ].elementid = elementid; entries[seekhead->num_entries ].elementid = elementid;
entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset; entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset;
...@@ -377,13 +380,16 @@ static mkv_cues * mkv_start_cues(int64_t segment_offset) ...@@ -377,13 +380,16 @@ static mkv_cues * mkv_start_cues(int64_t segment_offset)
static int mkv_add_cuepoint(mkv_cues *cues, int stream, int64_t ts, int64_t cluster_pos) static int mkv_add_cuepoint(mkv_cues *cues, int stream, int64_t ts, int64_t cluster_pos)
{ {
mkv_cuepoint *entries = cues->entries; mkv_cuepoint *entries = cues->entries;
int err;
if (ts < 0) if (ts < 0)
return 0; return 0;
entries = av_realloc(entries, (cues->num_entries + 1) * sizeof(mkv_cuepoint)); if ((err = av_reallocp_array(&entries, cues->num_entries + 1,
if (entries == NULL) sizeof(*entries))) < 0) {
return AVERROR(ENOMEM); cues->num_entries = 0;
return err;
}
entries[cues->num_entries ].pts = ts; entries[cues->num_entries ].pts = ts;
entries[cues->num_entries ].tracknum = stream + 1; entries[cues->num_entries ].tracknum = stream + 1;
......
...@@ -1841,7 +1841,6 @@ static void mov_build_index(MOVContext *mov, AVStream *st) ...@@ -1841,7 +1841,6 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
unsigned int stps_index = 0; unsigned int stps_index = 0;
unsigned int i, j; unsigned int i, j;
uint64_t stream_size = 0; uint64_t stream_size = 0;
AVIndexEntry *mem;
/* adjust first dts according to edit list */ /* adjust first dts according to edit list */
if (sc->time_offset && mov->time_scale > 0) { if (sc->time_offset && mov->time_scale > 0) {
...@@ -1875,10 +1874,12 @@ static void mov_build_index(MOVContext *mov, AVStream *st) ...@@ -1875,10 +1874,12 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
return; return;
if (sc->sample_count >= UINT_MAX / sizeof(*st->index_entries) - st->nb_index_entries) if (sc->sample_count >= UINT_MAX / sizeof(*st->index_entries) - st->nb_index_entries)
return; return;
mem = av_realloc(st->index_entries, (st->nb_index_entries + sc->sample_count) * sizeof(*st->index_entries)); if (av_reallocp_array(&st->index_entries,
if (!mem) st->nb_index_entries + sc->sample_count,
sizeof(*st->index_entries)) < 0) {
st->nb_index_entries = 0;
return; return;
st->index_entries = mem; }
st->index_entries_allocated_size = (st->nb_index_entries + sc->sample_count) * sizeof(*st->index_entries); st->index_entries_allocated_size = (st->nb_index_entries + sc->sample_count) * sizeof(*st->index_entries);
for (i = 0; i < sc->chunk_count; i++) { for (i = 0; i < sc->chunk_count; i++) {
...@@ -1973,10 +1974,12 @@ static void mov_build_index(MOVContext *mov, AVStream *st) ...@@ -1973,10 +1974,12 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
av_dlog(mov->fc, "chunk count %d\n", total); av_dlog(mov->fc, "chunk count %d\n", total);
if (total >= UINT_MAX / sizeof(*st->index_entries) - st->nb_index_entries) if (total >= UINT_MAX / sizeof(*st->index_entries) - st->nb_index_entries)
return; return;
mem = av_realloc(st->index_entries, (st->nb_index_entries + total) * sizeof(*st->index_entries)); if (av_reallocp_array(&st->index_entries,
if (!mem) st->nb_index_entries + total,
sizeof(*st->index_entries)) < 0) {
st->nb_index_entries = 0;
return; return;
st->index_entries = mem; }
st->index_entries_allocated_size = (st->nb_index_entries + total) * sizeof(*st->index_entries); st->index_entries_allocated_size = (st->nb_index_entries + total) * sizeof(*st->index_entries);
// populate index // populate index
...@@ -2307,13 +2310,15 @@ static int mov_read_chap(MOVContext *c, AVIOContext *pb, MOVAtom atom) ...@@ -2307,13 +2310,15 @@ static int mov_read_chap(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_trex(MOVContext *c, AVIOContext *pb, MOVAtom atom) static int mov_read_trex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{ {
MOVTrackExt *trex; MOVTrackExt *trex;
int err;
if ((uint64_t)c->trex_count+1 >= UINT_MAX / sizeof(*c->trex_data)) if ((uint64_t)c->trex_count+1 >= UINT_MAX / sizeof(*c->trex_data))
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
trex = av_realloc(c->trex_data, (c->trex_count+1)*sizeof(*c->trex_data)); if ((err = av_reallocp_array(&c->trex_data, c->trex_count + 1,
if (!trex) sizeof(*c->trex_data))) < 0) {
return AVERROR(ENOMEM); c->trex_count = 0;
c->trex_data = trex; return err;
}
trex = &c->trex_data[c->trex_count++]; trex = &c->trex_data[c->trex_count++];
avio_r8(pb); /* version */ avio_r8(pb); /* version */
avio_rb24(pb); /* flags */ avio_rb24(pb); /* flags */
...@@ -2335,7 +2340,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) ...@@ -2335,7 +2340,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int64_t dts; int64_t dts;
int data_offset = 0; int data_offset = 0;
unsigned entries, first_sample_flags = frag->flags; unsigned entries, first_sample_flags = frag->flags;
int flags, distance, i, found_keyframe = 0; int flags, distance, i, found_keyframe = 0, err;
for (i = 0; i < c->fc->nb_streams; i++) { for (i = 0; i < c->fc->nb_streams; i++) {
if (c->fc->streams[i]->id == frag->track_id) { if (c->fc->streams[i]->id == frag->track_id) {
...@@ -2373,12 +2378,11 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) ...@@ -2373,12 +2378,11 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
} }
if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data)) if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data))
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
ctts_data = av_realloc(sc->ctts_data, if ((err = av_reallocp_array(&sc->ctts_data, entries + sc->ctts_count,
(entries+sc->ctts_count)*sizeof(*sc->ctts_data)); sizeof(*sc->ctts_data))) < 0) {
if (!ctts_data) sc->ctts_count = 0;
return AVERROR(ENOMEM); return err;
sc->ctts_data = ctts_data; }
if (flags & MOV_TRUN_DATA_OFFSET) data_offset = avio_rb32(pb); if (flags & MOV_TRUN_DATA_OFFSET) data_offset = avio_rb32(pb);
if (flags & MOV_TRUN_FIRST_SAMPLE_FLAGS) first_sample_flags = avio_rb32(pb); if (flags & MOV_TRUN_FIRST_SAMPLE_FLAGS) first_sample_flags = avio_rb32(pb);
dts = sc->track_end - sc->time_offset; dts = sc->track_end - sc->time_offset;
......
...@@ -201,10 +201,10 @@ static void clear_programs(MpegTSContext *ts) ...@@ -201,10 +201,10 @@ static void clear_programs(MpegTSContext *ts)
static void add_pat_entry(MpegTSContext *ts, unsigned int programid) static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
{ {
struct Program *p; struct Program *p;
void *tmp = av_realloc(ts->prg, (ts->nb_prg+1)*sizeof(struct Program)); if (av_reallocp_array(&ts->prg, ts->nb_prg + 1, sizeof(*ts->prg)) < 0) {
if(!tmp) ts->nb_prg = 0;
return; return;
ts->prg = tmp; }
p = &ts->prg[ts->nb_prg]; p = &ts->prg[ts->nb_prg];
p->id = programid; p->id = programid;
p->nb_pids = 0; p->nb_pids = 0;
......
...@@ -410,18 +410,20 @@ static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, U ...@@ -410,18 +410,20 @@ static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, U
static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset) static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
{ {
MXFContext *mxf = arg; MXFContext *mxf = arg;
MXFPartition *partition, *tmp_part; MXFPartition *partition;
UID op; UID op;
uint64_t footer_partition; uint64_t footer_partition;
uint32_t nb_essence_containers; uint32_t nb_essence_containers;
int err;
if (mxf->partitions_count+1 >= UINT_MAX / sizeof(*mxf->partitions)) if (mxf->partitions_count+1 >= UINT_MAX / sizeof(*mxf->partitions))
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
tmp_part = av_realloc(mxf->partitions, (mxf->partitions_count + 1) * sizeof(*mxf->partitions)); if ((err = av_reallocp_array(&mxf->partitions, mxf->partitions_count + 1,
if (!tmp_part) sizeof(*mxf->partitions))) < 0) {
return AVERROR(ENOMEM); mxf->partitions_count = 0;
mxf->partitions = tmp_part; return err;
}
if (mxf->parsing_backward) { if (mxf->parsing_backward) {
/* insert the new partition pack in the middle /* insert the new partition pack in the middle
...@@ -546,13 +548,15 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size ...@@ -546,13 +548,15 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size
static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set) static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
{ {
MXFMetadataSet **tmp; int err;
if (mxf->metadata_sets_count+1 >= UINT_MAX / sizeof(*mxf->metadata_sets)) if (mxf->metadata_sets_count+1 >= UINT_MAX / sizeof(*mxf->metadata_sets))
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
tmp = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets)); if ((err = av_reallocp_array(&mxf->metadata_sets, mxf->metadata_sets_count + 1,
if (!tmp) sizeof(*mxf->metadata_sets))) < 0) {
return AVERROR(ENOMEM); mxf->metadata_sets_count = 0;
mxf->metadata_sets = tmp; return err;
}
mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set; mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;
mxf->metadata_sets_count++; mxf->metadata_sets_count++;
return 0; return 0;
......
...@@ -84,7 +84,7 @@ static int ogg_restore(AVFormatContext *s, int discard) ...@@ -84,7 +84,7 @@ static int ogg_restore(AVFormatContext *s, int discard)
struct ogg *ogg = s->priv_data; struct ogg *ogg = s->priv_data;
AVIOContext *bc = s->pb; AVIOContext *bc = s->pb;
struct ogg_state *ost = ogg->state; struct ogg_state *ost = ogg->state;
int i; int i, err;
if (!ost) if (!ost)
return 0; return 0;
...@@ -92,7 +92,6 @@ static int ogg_restore(AVFormatContext *s, int discard) ...@@ -92,7 +92,6 @@ static int ogg_restore(AVFormatContext *s, int discard)
ogg->state = ost->next; ogg->state = ost->next;
if (!discard) { if (!discard) {
struct ogg_stream *old_streams = ogg->streams;
for (i = 0; i < ogg->nstreams; i++) for (i = 0; i < ogg->nstreams; i++)
av_free(ogg->streams[i].buf); av_free(ogg->streams[i].buf);
...@@ -100,16 +99,13 @@ static int ogg_restore(AVFormatContext *s, int discard) ...@@ -100,16 +99,13 @@ static int ogg_restore(AVFormatContext *s, int discard)
avio_seek(bc, ost->pos, SEEK_SET); avio_seek(bc, ost->pos, SEEK_SET);
ogg->curidx = ost->curidx; ogg->curidx = ost->curidx;
ogg->nstreams = ost->nstreams; ogg->nstreams = ost->nstreams;
ogg->streams = av_realloc(ogg->streams, if ((err = av_reallocp_array(&ogg->streams, ogg->nstreams,
ogg->nstreams * sizeof(*ogg->streams)); sizeof(*ogg->streams))) < 0) {
ogg->nstreams = 0;
if (ogg->streams) { return err;
} else
memcpy(ogg->streams, ost->streams, memcpy(ogg->streams, ost->streams,
ost->nstreams * sizeof(*ogg->streams)); ost->nstreams * sizeof(*ogg->streams));
} else {
av_free(old_streams);
ogg->nstreams = 0;
}
} }
av_free(ost); av_free(ost);
......
...@@ -2574,14 +2574,11 @@ AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c) ...@@ -2574,14 +2574,11 @@ AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
{ {
AVStream *st; AVStream *st;
int i; int i;
AVStream **streams;
if (s->nb_streams >= INT_MAX/sizeof(*streams)) if (av_reallocp_array(&s->streams, s->nb_streams + 1, sizeof(*s->streams)) < 0) {
s->nb_streams = 0;
return NULL; return NULL;
streams = av_realloc(s->streams, (s->nb_streams + 1) * sizeof(*streams)); }
if (!streams)
return NULL;
s->streams = streams;
st = av_mallocz(sizeof(AVStream)); st = av_mallocz(sizeof(AVStream));
if (!st) if (!st)
...@@ -2674,7 +2671,6 @@ void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int i ...@@ -2674,7 +2671,6 @@ void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int i
{ {
int i, j; int i, j;
AVProgram *program=NULL; AVProgram *program=NULL;
void *tmp;
if (idx >= ac->nb_streams) { if (idx >= ac->nb_streams) {
av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx); av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
...@@ -2689,10 +2685,12 @@ void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int i ...@@ -2689,10 +2685,12 @@ void ff_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int i
if(program->stream_index[j] == idx) if(program->stream_index[j] == idx)
return; return;
tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1)); if (av_reallocp_array(&program->stream_index,
if(!tmp) program->nb_stream_indexes + 1,
sizeof(*program->stream_index)) < 0) {
program->nb_stream_indexes = 0;
return; return;
program->stream_index = tmp; }
program->stream_index[program->nb_stream_indexes++] = idx; program->stream_index[program->nb_stream_indexes++] = idx;
return; return;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment