diff options
author | Diego Biurrun <diego@biurrun.de> | 2014-08-06 04:08:50 -0700 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2014-08-07 07:52:17 -0700 |
commit | 5b220e1e19c17b202d83d9be0868d152109ae8f0 (patch) | |
tree | 2040e22db56b457c6329df3e9be4db38b3a11736 /libavformat/mpegtsenc.c | |
parent | f8ab9f2fe3730a0e8c3c1eb7c486f7c0041fb3fc (diff) | |
download | ffmpeg-5b220e1e19c17b202d83d9be0868d152109ae8f0.tar.gz |
mpegts: Fix memory leaks and related crashes in mpegs_write_header()
Diffstat (limited to 'libavformat/mpegtsenc.c')
-rw-r--r-- | libavformat/mpegtsenc.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index cbd3aabc76..67bc7ebf3e 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -430,9 +430,15 @@ static MpegTSService *mpegts_add_service(MpegTSWrite *ts, int sid, return NULL; service->pmt.pid = ts->pmt_start_pid + ts->nb_services; service->sid = sid; + service->pcr_pid = 0x1fff; service->provider_name = av_strdup(provider_name); service->name = av_strdup(name); - service->pcr_pid = 0x1fff; + if (!service->provider_name || !service->name) { + free(service->provider_name); + free(service->name); + free(service); + return NULL; + } dynarray_add(&ts->services, &ts->nb_services, service); return service; } @@ -474,6 +480,9 @@ static int mpegts_write_header(AVFormatContext *s) service = mpegts_add_service(ts, ts->service_id, provider_name, service_name); + if (!service) + return AVERROR(ENOMEM); + service->pmt.write_packet = section_write_packet; service->pmt.opaque = s; service->pmt.cc = 15; @@ -491,8 +500,10 @@ static int mpegts_write_header(AVFormatContext *s) ts->sdt.opaque = s; pids = av_malloc(s->nb_streams * sizeof(*pids)); - if (!pids) + if (!pids) { + av_free(service); return AVERROR(ENOMEM); + } /* assign pids to each stream */ for (i = 0; i < s->nb_streams; i++) { @@ -564,7 +575,10 @@ static int mpegts_write_header(AVFormatContext *s) ret = AVERROR(EINVAL); goto fail; } - ast = avformat_new_stream(ts_st->amux, NULL); + if (!(ast = avformat_new_stream(ts_st->amux, NULL))) { + ret = AVERROR(ENOMEM); + goto fail; + } ret = avcodec_copy_context(ast->codec, st->codec); if (ret != 0) goto fail; @@ -633,6 +647,7 @@ static int mpegts_write_header(AVFormatContext *s) return 0; fail: + av_free(service); av_free(pids); for (i = 0; i < s->nb_streams; i++) { st = s->streams[i]; |