[FFmpeg-cvslog] avformat/aaxdec: Simplify cleanup after read_header failure

Andreas Rheinhardt git at videolan.org
Thu Jul 8 16:44:04 EEST 2021


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Wed Jul  7 21:15:33 2021 +0200| [822be438491ec9cf724c5b04d6f844ac7b188b8c] | committer: Andreas Rheinhardt

avformat/aaxdec: Simplify cleanup after read_header failure

by setting the FF_FMT_INIT_CLEANUP flag.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=822be438491ec9cf724c5b04d6f844ac7b188b8c
---

 libavformat/aaxdec.c | 87 ++++++++++++++++++----------------------------------
 1 file changed, 29 insertions(+), 58 deletions(-)

diff --git a/libavformat/aaxdec.c b/libavformat/aaxdec.c
index 866b3ca1fd..643bc5f9a5 100644
--- a/libavformat/aaxdec.c
+++ b/libavformat/aaxdec.c
@@ -151,26 +151,20 @@ static int aax_read_header(AVFormatContext *s)
         return AVERROR(ENOMEM);
 
     a->xcolumns = av_calloc(a->columns, sizeof(*a->xcolumns));
-    if (!a->xcolumns) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
+    if (!a->xcolumns)
+        return AVERROR(ENOMEM);
 
     a->string_table = av_calloc(a->strings_size + 1, sizeof(*a->string_table));
-    if (!a->string_table) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
+    if (!a->string_table)
+        return AVERROR(ENOMEM);
 
     for (int c = 0; c < a->columns; c++) {
         uint8_t info = avio_r8(pb);
         uint32_t offset = avio_rb32(pb);
         int value_size;
 
-        if (offset >= a->strings_size) {
-            ret = AVERROR_INVALIDDATA;
-            goto fail;
-        }
+        if (offset >= a->strings_size)
+            return AVERROR_INVALIDDATA;
 
         a->xcolumns[c].flag = info >>   4;
         a->xcolumns[c].type = info & 0x0F;
@@ -197,8 +191,7 @@ static int aax_read_header(AVFormatContext *s)
             value_size = 0x10;
             break;
         default:
-            ret = AVERROR_INVALIDDATA;
-            goto fail;
+            return AVERROR_INVALIDDATA;
         }
 
         a->xcolumns[c].size = value_size;
@@ -221,14 +214,13 @@ static int aax_read_header(AVFormatContext *s)
 
     ret = ret64 = avio_seek(pb, a->strings_offset, SEEK_SET);
     if (ret64 < 0)
-        goto fail;
+        return ret;
 
     ret = avio_read(pb, a->string_table, a->strings_size);
     if (ret != a->strings_size) {
         if (ret < 0)
-            goto fail;
-        ret = AVERROR(EIO);
-        goto fail;
+            return ret;
+        return AVERROR(EIO);
     }
 
     for (int c = 0; c < a->columns; c++) {
@@ -248,14 +240,12 @@ static int aax_read_header(AVFormatContext *s)
                 data_offset = a->schema_offset + col_offset;
             } else if (flag & COLUMN_FLAG_ROW) {
                 data_offset = a->rows_offset + r * a->row_width + col_offset;
-            } else {
-                ret = AVERROR_INVALIDDATA;
-                goto fail;
-            }
+            } else
+                return AVERROR_INVALIDDATA;
 
             ret = ret64 = avio_seek(pb, data_offset, SEEK_SET);
             if (ret64 < 0)
-                goto fail;
+                return ret;
 
             if (type == COLUMN_TYPE_VLDATA) {
                 int64_t start, size;
@@ -264,23 +254,17 @@ static int aax_read_header(AVFormatContext *s)
                 size  = avio_rb32(pb);
                 a->segments[r].start = start + a->data_offset;
                 a->segments[r].end   = a->segments[r].start + size;
-            } else {
-                ret = AVERROR_INVALIDDATA;
-                goto fail;
-            }
+            } else
+                return AVERROR_INVALIDDATA;
         }
     }
 
-    if (!a->segments[0].end) {
-        ret = AVERROR_INVALIDDATA;
-        goto fail;
-    }
+    if (!a->segments[0].end)
+        return AVERROR_INVALIDDATA;
 
     st = avformat_new_stream(s, NULL);
-    if (!st) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
+    if (!st)
+        return AVERROR(ENOMEM);
     st->start_time = 0;
     par = s->streams[0]->codecpar;
     par->codec_type = AVMEDIA_TYPE_AUDIO;
@@ -289,42 +273,28 @@ static int aax_read_header(AVFormatContext *s)
     if (!strcmp(codec, "AAX")) {
         par->codec_id = AV_CODEC_ID_ADPCM_ADX;
         ret64 = avio_seek(pb, a->segments[0].start, SEEK_SET);
-        if (ret64 < 0 || avio_rb16(pb) != 0x8000) {
-            ret = AVERROR_INVALIDDATA;
-            goto fail;
-        }
+        if (ret64 < 0 || avio_rb16(pb) != 0x8000)
+            return AVERROR_INVALIDDATA;
         extradata_size = avio_rb16(pb) + 4;
-        if (extradata_size < 12) {
-            ret = AVERROR_INVALIDDATA;
-            goto fail;
-        }
+        if (extradata_size < 12)
+            return AVERROR_INVALIDDATA;
         avio_seek(pb, -4, SEEK_CUR);
         ret = ff_get_extradata(s, par, pb, extradata_size);
-        if (ret < 0) {
-            goto fail;
-        }
+        if (ret < 0)
+            return ret;
         par->channels    = AV_RB8 (par->extradata + 7);
         par->sample_rate = AV_RB32(par->extradata + 8);
-        if (!par->channels || !par->sample_rate) {
-            ret = AVERROR_INVALIDDATA;
-            goto fail;
-        }
+        if (!par->channels || !par->sample_rate)
+            return AVERROR_INVALIDDATA;
 
         avpriv_set_pts_info(st, 64, 32, par->sample_rate);
   /*} else if (!strcmp(codec, "HCA") ){
         par->codec_id = AV_CODEC_ID_HCA;*/
     } else {
-        ret = AVERROR_INVALIDDATA;
-        goto fail;
+        return AVERROR_INVALIDDATA;
     }
 
     return 0;
-fail:
-    av_freep(&a->string_table);
-    av_freep(&a->xcolumns);
-    av_freep(&a->segments);
-
-    return ret;
 }
 
 static int aax_read_packet(AVFormatContext *s, AVPacket *pkt)
@@ -413,6 +383,7 @@ const AVInputFormat ff_aax_demuxer = {
     .name           = "aax",
     .long_name      = NULL_IF_CONFIG_SMALL("CRI AAX"),
     .priv_data_size = sizeof(AAXContext),
+    .flags_internal = FF_FMT_INIT_CLEANUP,
     .read_probe     = aax_probe,
     .read_header    = aax_read_header,
     .read_packet    = aax_read_packet,



More information about the ffmpeg-cvslog mailing list