---
 libavformat/nutdec.c | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

used av_freep() to avoid memory leakage

diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c
index 6328549..33a1fc3 100644
--- a/libavformat/nutdec.c
+++ b/libavformat/nutdec.c
@@ -230,7 +230,8 @@ static int decode_main_header(NUTContext *nut)
 
     GET_V(nut->time_base_count, tmp > 0 && tmp < INT_MAX / sizeof(AVRational));
     nut->time_base = av_malloc(nut->time_base_count * sizeof(AVRational));
-
+    if (!nut->time_base)
+        return AVERROR(ENOMEM);
     for (i = 0; i < nut->time_base_count; i++) {
         GET_V(nut->time_base[i].num, tmp > 0 && tmp < (1ULL << 31));
         GET_V(nut->time_base[i].den, tmp > 0 && tmp < (1ULL << 31));
@@ -312,8 +313,10 @@ static int decode_main_header(NUTContext *nut)
                 return AVERROR_INVALIDDATA;
             }
             hdr = av_malloc(nut->header_len[i]);
-            if (!hdr)
+            if (!hdr) {
+                av_freep(nut->time_base);
                 return AVERROR(ENOMEM);
+            }
             avio_read(bc, hdr, nut->header_len[i]);
             nut->header[i] = hdr;
         }
@@ -326,6 +329,10 @@ static int decode_main_header(NUTContext *nut)
     }
 
     nut->stream = av_mallocz(sizeof(StreamContext) * stream_count);
+    if (!nut->stream) {
+        av_freep(nut->time_base);
+        return AVERROR(ENOMEM);
+    }
     for (i = 0; i < stream_count; i++)
         avformat_new_stream(s, NULL);
 
@@ -400,6 +407,10 @@ static int decode_stream_header(NUTContext *nut)
     if (st->codec->extradata_size) {
         st->codec->extradata = av_mallocz(st->codec->extradata_size +
                                           FF_INPUT_BUFFER_PADDING_SIZE);
+        if (!st->codec->extradata) {
+            av_freep(st);
+            return AVERROR(ENOMEM);
+        }
         avio_read(bc, st->codec->extradata, st->codec->extradata_size);
     }
 
@@ -585,7 +596,13 @@ static int find_and_decode_index(NUTContext *nut)
     ffio_read_varlen(bc); // max_pts
     GET_V(syncpoint_count, tmp < INT_MAX / 8 && tmp > 0);
     syncpoints   = av_malloc(sizeof(int64_t) *  syncpoint_count);
+    if (!syncpoints)
+        return AVERROR(ENOMEM);
     has_keyframe = av_malloc(sizeof(int8_t)  * (syncpoint_count + 1));
+    if (!has_keyframe) {
+        av_freep(syncpoints);
+        return AVERROR(ENOMEM);
+    }
     for (i = 0; i < syncpoint_count; i++) {
         syncpoints[i] = ffio_read_varlen(bc);
         if (syncpoints[i] <= 0)
@@ -650,8 +667,8 @@ static int find_and_decode_index(NUTContext *nut)
     ret = 0;
 
 fail:
-    av_free(syncpoints);
-    av_free(has_keyframe);
+    av_freep(syncpoints);
+    av_freep(has_keyframe);
     return ret;
 }
 
-- 
1.8.3.2

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to