]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/tiertexseq.c
avformat/avidec: Fix memleak when error happens after creating DV stream
[ffmpeg] / libavformat / tiertexseq.c
index a35e08ef5083b48ca002d98fb2e83d29a34a036a..d7719e5acb80277eb46ac9ba72f846a26be49fe1 100644 (file)
@@ -202,16 +202,20 @@ static int seq_read_header(AVFormatContext *s)
 
     /* init internal buffers */
     rc = seq_init_frame_buffers(seq, pb);
-    if (rc)
+    if (rc) {
+        seq_read_close(s);
         return rc;
+    }
 
     seq->current_frame_offs = 0;
 
     /* preload (no audio data, just buffer operations related data) */
     for (i = 1; i <= 100; i++) {
         rc = seq_parse_frame_data(seq, pb);
-        if (rc)
+        if (rc) {
+            seq_read_close(s);
             return rc;
+        }
     }
 
     seq->current_frame_pts = 0;
@@ -220,8 +224,10 @@ static int seq_read_header(AVFormatContext *s)
 
     /* initialize the video decoder stream */
     st = avformat_new_stream(s, NULL);
-    if (!st)
+    if (!st) {
+        seq_read_close(s);
         return AVERROR(ENOMEM);
+    }
 
     avpriv_set_pts_info(st, 32, 1, SEQ_FRAME_RATE);
     seq->video_stream_index = st->index;
@@ -233,8 +239,10 @@ static int seq_read_header(AVFormatContext *s)
 
     /* initialize the audio decoder stream */
     st = avformat_new_stream(s, NULL);
-    if (!st)
+    if (!st) {
+        seq_read_close(s);
         return AVERROR(ENOMEM);
+    }
 
     st->start_time = 0;
     avpriv_set_pts_info(st, 32, 1, SEQ_SAMPLE_RATE);
@@ -265,8 +273,10 @@ static int seq_read_packet(AVFormatContext *s, AVPacket *pkt)
 
         /* video packet */
         if (seq->current_pal_data_size + seq->current_video_data_size != 0) {
-            if (av_new_packet(pkt, 1 + seq->current_pal_data_size + seq->current_video_data_size))
-                return AVERROR(ENOMEM);
+            rc = av_new_packet(pkt, 1 + seq->current_pal_data_size
+                                      + seq->current_video_data_size);
+            if (rc < 0)
+                return rc;
 
             pkt->data[0] = 0;
             if (seq->current_pal_data_size) {