[02/10] movenc: Avoid leaking locally allocated data when returning on errors

Message ID 1415365019-26521-2-git-send-email-martin@martin.st
State Committed
Commit 8cb7b7b461b52898765b38e3eff68c0ce88347f3
Headers show

Commit Message

Martin Storsjö Nov. 7, 2014, 12:56 p.m.
---
 libavformat/movenc.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

Comments

Luca Barbato Nov. 7, 2014, 1:55 p.m. | #1
On 07/11/14 13:56, Martin Storsjö wrote:
> ---
>   libavformat/movenc.c | 18 ++++++++++++------
>   1 file changed, 12 insertions(+), 6 deletions(-)
>

Ok

Patch

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index e2a6bbc..bb1dc8a 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -3065,7 +3065,7 @@  int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
     MOVTrack *trk = &mov->tracks[pkt->stream_index];
     AVCodecContext *enc = trk->enc;
     unsigned int samples_in_chunk = 0;
-    int size = pkt->size;
+    int size = pkt->size, ret = 0;
     uint8_t *reformatted_data = NULL;
 
     if (mov->flags & FF_MOV_FLAG_FRAGMENT) {
@@ -3139,16 +3139,20 @@  int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
         /* copy frame to create needed atoms */
         trk->vos_len  = size;
         trk->vos_data = av_malloc(size);
-        if (!trk->vos_data)
-            return AVERROR(ENOMEM);
+        if (!trk->vos_data) {
+            ret = AVERROR(ENOMEM);
+            goto err;
+        }
         memcpy(trk->vos_data, pkt->data, size);
     }
 
     if (trk->entry >= trk->cluster_capacity) {
         unsigned new_capacity = 2 * (trk->entry + MOV_INDEX_CLUSTER_SIZE);
         if (av_reallocp_array(&trk->cluster, new_capacity,
-                              sizeof(*trk->cluster)))
-            return AVERROR(ENOMEM);
+                              sizeof(*trk->cluster))) {
+            ret = AVERROR(ENOMEM);
+            goto err;
+        }
         trk->cluster_capacity = new_capacity;
     }
 
@@ -3212,8 +3216,10 @@  int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
     if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams)
         ff_mov_add_hinted_packet(s, pkt, trk->hint_track, trk->entry,
                                  reformatted_data, size);
+
+err:
     av_free(reformatted_data);
-    return 0;
+    return ret;
 }
 
 static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)