mpegts: Fix memory leaks and related crashes in mpegs_write_header()
authorDiego Biurrun <diego@biurrun.de>
Wed, 6 Aug 2014 11:08:50 +0000 (04:08 -0700)
committerDiego Biurrun <diego@biurrun.de>
Thu, 7 Aug 2014 14:52:17 +0000 (07:52 -0700)
libavformat/mpegtsenc.c

index cbd3aab..67bc7eb 100644 (file)
@@ -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;
         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->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;
 }
     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);
 
     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;
     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));
     ts->sdt.opaque       = s;
 
     pids = av_malloc(s->nb_streams * sizeof(*pids));
-    if (!pids)
+    if (!pids) {
+        av_free(service);
         return AVERROR(ENOMEM);
         return AVERROR(ENOMEM);
+    }
 
     /* assign pids to each stream */
     for (i = 0; i < s->nb_streams; i++) {
 
     /* 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;
             }
                 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;
             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:
     return 0;
 
 fail:
+    av_free(service);
     av_free(pids);
     for (i = 0; i < s->nb_streams; i++) {
         st    = s->streams[i];
     av_free(pids);
     for (i = 0; i < s->nb_streams; i++) {
         st    = s->streams[i];