]> git.sesse.net Git - ffmpeg/commitdiff
avformat/img2enc: cleanup IO contexts on error
authorMarton Balint <cus@passwd.hu>
Thu, 26 Dec 2019 20:08:22 +0000 (21:08 +0100)
committerMarton Balint <cus@passwd.hu>
Fri, 3 Jan 2020 10:23:55 +0000 (11:23 +0100)
Signed-off-by: Marton Balint <cus@passwd.hu>
libavformat/img2enc.c

index a976d07accd1d37f3619842830ee6d2b651488e0..14e6d641f9195765eb43c8f782c56a05de3c20e6 100644 (file)
@@ -124,7 +124,7 @@ static int write_packet_pipe(AVFormatContext *s, AVPacket *pkt)
 static int write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     VideoMuxData *img = s->priv_data;
-    AVIOContext *pb[4];
+    AVIOContext *pb[4] = {0};
     char filename[1024];
     AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(par->format);
@@ -162,7 +162,8 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
         av_strlcpy(img->target[i], filename, sizeof(img->target[i]));
         if (s->io_open(s, &pb[i], img->use_rename ? img->tmp[i] : filename, AVIO_FLAG_WRITE, NULL) < 0) {
             av_log(s, AV_LOG_ERROR, "Could not open file : %s\n", img->use_rename ? img->tmp[i] : filename);
-            return AVERROR(EIO);
+            ret = AVERROR(EIO);
+            goto fail;
         }
 
         if (!img->split_planes || i+1 >= desc->nb_components)
@@ -191,7 +192,7 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
     } else if (img->muxer) {
         ret = write_muxed_file(s, pb[0], pkt);
         if (ret < 0)
-            return ret;
+            goto fail;
     } else {
         avio_write(pb[0], pkt->data, pkt->size);
     }
@@ -205,6 +206,12 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
 
     img->img_number++;
     return 0;
+
+fail:
+    for (i = 0; i < FF_ARRAY_ELEMS(pb); i++)
+        if (pb[i])
+            ff_format_io_close(s, &pb[i]);
+    return ret;
 }
 
 static int query_codec(enum AVCodecID id, int std_compliance)