[SCM] libav/experimental: factorize read_header failure freeing code

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:23:47 UTC 2013


The following commit has been merged in the experimental branch:
commit ccafd47251a83cab01dcde42dc09db425c80e69a
Author: Baptiste Coudurier <baptiste.coudurier at gmail.com>
Date:   Fri Jun 20 17:16:56 2008 +0000

    factorize read_header failure freeing code
    
    Originally committed as revision 13837 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/asf.c b/libavformat/asf.c
index 040ac7c..df2003a 100644
--- a/libavformat/asf.c
+++ b/libavformat/asf.c
@@ -156,7 +156,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
 
     get_guid(pb, &g);
     if (memcmp(&g, &asf_header, sizeof(GUID)))
-        goto fail;
+        return -1;
     get_le64(pb);
     get_le32(pb);
     get_byte(pb);
@@ -181,7 +181,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
             break;
         }
         if (gsize < 24)
-            goto fail;
+            return -1;
         if (!memcmp(&g, &file_header, sizeof(GUID))) {
             get_guid(pb, &asf->hdr.guid);
             asf->hdr.file_size          = get_le64(pb);
@@ -207,11 +207,11 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
 
             st = av_new_stream(s, 0);
             if (!st)
-                goto fail;
+                return AVERROR(ENOMEM);
             av_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */
             asf_st = av_mallocz(sizeof(ASFStream));
             if (!asf_st)
-                goto fail;
+                return AVERROR(ENOMEM);
             st->priv_data = asf_st;
             start_time = asf->hdr.preroll;
 
@@ -232,7 +232,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
                 test_for_ext_stream_audio = 1;
                 type = CODEC_TYPE_UNKNOWN;
             } else {
-                goto fail;
+                return -1;
             }
             get_guid(pb, &g);
             total_size = get_le64(pb);
@@ -513,7 +513,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
             }
 #endif
         } else if (url_feof(pb)) {
-            goto fail;
+            return -1;
         } else {
             url_fseek(pb, gsize - 24, SEEK_CUR);
         }
@@ -523,7 +523,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
     get_byte(pb);
     get_byte(pb);
     if (url_feof(pb))
-        goto fail;
+        return -1;
     asf->data_offset = url_ftell(pb);
     asf->packet_size_left = 0;
 
@@ -543,17 +543,6 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
     }
 
     return 0;
-
- fail:
-     for(i=0;i<s->nb_streams;i++) {
-        AVStream *st = s->streams[i];
-        if (st) {
-            av_free(st->priv_data);
-            av_free(st->codec->extradata);
-        }
-        av_free(st);
-    }
-    return -1;
 }
 
 #define DO_2BITS(bits, var, defval) \
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index d88d475..38561a8 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -597,10 +597,6 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
     /* check stream number */
     if (stream_index != s->nb_streams - 1) {
     fail:
-        for(i=0;i<s->nb_streams;i++) {
-            av_freep(&s->streams[i]->codec->extradata);
-            av_freep(&s->streams[i]);
-        }
         return -1;
     }
 
diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c
index 128e3a2..502b1f4 100644
--- a/libavformat/rmdec.c
+++ b/libavformat/rmdec.c
@@ -297,7 +297,7 @@ static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap)
 
     for(;;) {
         if (url_feof(pb))
-            goto fail;
+            return -1;
         tag = get_le32(pb);
         tag_size = get_be32(pb);
         get_be16(pb);
@@ -311,7 +311,7 @@ static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap)
                tag_size);
 #endif
         if (tag_size < 10 && tag != MKTAG('D', 'A', 'T', 'A'))
-            goto fail;
+            return -1;
         switch(tag) {
         case MKTAG('P', 'R', 'O', 'P'):
             /* file header */
@@ -336,7 +336,7 @@ static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap)
         case MKTAG('M', 'D', 'P', 'R'):
             st = av_new_stream(s, 0);
             if (!st)
-                goto fail;
+                return AVERROR(ENOMEM);
             st->id = get_be16(pb);
             get_be32(pb); /* max bit rate */
             st->codec->bit_rate = get_be32(pb); /* bit rate */
@@ -369,12 +369,6 @@ static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap)
     get_be32(pb); /* next data header */
     rm->curpic_num = -1;
     return 0;
-
- fail:
-    for(i=0;i<s->nb_streams;i++) {
-        av_free(s->streams[i]);
-    }
-    return AVERROR(EIO);
 }
 
 static int get_num(ByteIOContext *pb, int *len)
diff --git a/libavformat/utils.c b/libavformat/utils.c
index e8cd86b..e2eb1b0 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -405,7 +405,16 @@ int av_open_input_stream(AVFormatContext **ic_ptr,
     return 0;
  fail:
     if (ic) {
+        int i;
         av_freep(&ic->priv_data);
+        for(i=0;i<ic->nb_streams;i++) {
+            AVStream *st = ic->streams[i];
+            if (st) {
+                av_free(st->priv_data);
+                av_free(st->codec->extradata);
+            }
+            av_free(st);
+        }
     }
     av_free(ic);
     *ic_ptr = NULL;

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list