avformat/mpegts: fix memory leak with merge_pmt_versions=1
authorAman Gupta <aman@tmm1.net>
Mon, 21 May 2018 19:13:06 +0000 (12:13 -0700)
committerAman Gupta <aman@tmm1.net>
Mon, 21 May 2018 19:16:06 +0000 (12:16 -0700)
Signed-off-by: Aman Gupta <aman@tmm1.net>
libavformat/mpegts.c

index e39c927..5f53f77 100644 (file)
@@ -247,6 +247,7 @@ typedef struct PESContext {
     uint8_t header[MAX_PES_HEADER_SIZE];
     AVBufferRef *buffer;
     SLConfigDescr sl;
+    int merged_st;
 } PESContext;
 
 extern AVInputFormat ff_mpegts_demuxer;
@@ -550,8 +551,8 @@ static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter)
         PESContext *pes = filter->u.pes_filter.opaque;
         av_buffer_unref(&pes->buffer);
         /* referenced private data will be freed later in
-         * avformat_close_input */
-        if (!((PESContext *)filter->u.pes_filter.opaque)->st) {
+         * avformat_close_input (pes->st->priv_data == pes) */
+        if (!pes->st || pes->merged_st) {
             av_freep(&filter->u.pes_filter.opaque);
         }
     }
@@ -2190,6 +2191,7 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
                 if (st) {
                     pes->st = st;
                     pes->stream_type = stream_type;
+                    pes->merged_st = 1;
                 }
             }
             if (!pes->st) {
@@ -2211,6 +2213,7 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
                 if (st) {
                     pes->st = st;
                     pes->stream_type = stream_type;
+                    pes->merged_st = 1;
                 }
             }
             if (pes && !pes->st) {