Browse code

mpegts: Fix memory leaks and related crashes in mpegs_write_header()

Diego Biurrun authored on 2014/08/06 20:08:50
Showing 1 changed files
... ...
@@ -430,9 +430,15 @@ static MpegTSService *mpegts_add_service(MpegTSWrite *ts, int sid,
430 430
         return NULL;
431 431
     service->pmt.pid       = ts->pmt_start_pid + ts->nb_services;
432 432
     service->sid           = sid;
433
+    service->pcr_pid       = 0x1fff;
433 434
     service->provider_name = av_strdup(provider_name);
434 435
     service->name          = av_strdup(name);
435
-    service->pcr_pid       = 0x1fff;
436
+    if (!service->provider_name || !service->name) {
437
+        free(service->provider_name);
438
+        free(service->name);
439
+        free(service);
440
+        return NULL;
441
+    }
436 442
     dynarray_add(&ts->services, &ts->nb_services, service);
437 443
     return service;
438 444
 }
... ...
@@ -474,6 +480,9 @@ static int mpegts_write_header(AVFormatContext *s)
474 474
     service       = mpegts_add_service(ts, ts->service_id,
475 475
                                        provider_name, service_name);
476 476
 
477
+    if (!service)
478
+        return AVERROR(ENOMEM);
479
+
477 480
     service->pmt.write_packet = section_write_packet;
478 481
     service->pmt.opaque       = s;
479 482
     service->pmt.cc           = 15;
... ...
@@ -491,8 +500,10 @@ static int mpegts_write_header(AVFormatContext *s)
491 491
     ts->sdt.opaque       = s;
492 492
 
493 493
     pids = av_malloc(s->nb_streams * sizeof(*pids));
494
-    if (!pids)
494
+    if (!pids) {
495
+        av_free(service);
495 496
         return AVERROR(ENOMEM);
497
+    }
496 498
 
497 499
     /* assign pids to each stream */
498 500
     for (i = 0; i < s->nb_streams; i++) {
... ...
@@ -564,7 +575,10 @@ static int mpegts_write_header(AVFormatContext *s)
564 564
                 ret = AVERROR(EINVAL);
565 565
                 goto fail;
566 566
             }
567
-            ast = avformat_new_stream(ts_st->amux, NULL);
567
+            if (!(ast = avformat_new_stream(ts_st->amux, NULL))) {
568
+                ret = AVERROR(ENOMEM);
569
+                goto fail;
570
+            }
568 571
             ret = avcodec_copy_context(ast->codec, st->codec);
569 572
             if (ret != 0)
570 573
                 goto fail;
... ...
@@ -633,6 +647,7 @@ static int mpegts_write_header(AVFormatContext *s)
633 633
     return 0;
634 634
 
635 635
 fail:
636
+    av_free(service);
636 637
     av_free(pids);
637 638
     for (i = 0; i < s->nb_streams; i++) {
638 639
         st    = s->streams[i];