]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/oggdec.c
avformat/mux: Fix leaks on error when writing noninterleaved uncoded frames
[ffmpeg] / libavformat / oggdec.c
index 27d16a3e4e5c04cf4ea6d864709dee0ecd558eea..95190589ab3d400e47330a569aa3631be7599714 100644 (file)
@@ -216,7 +216,8 @@ static int ogg_replace_stream(AVFormatContext *s, uint32_t serial, int nsegs)
         uint8_t magic[8];
         int64_t pos = avio_tell(s->pb);
         avio_skip(s->pb, nsegs);
-        avio_read(s->pb, magic, sizeof(magic));
+        if (avio_read(s->pb, magic, sizeof(magic)) != sizeof(magic))
+            return AVERROR_INVALIDDATA;
         avio_seek(s->pb, pos, SEEK_SET);
         codec = ogg_find_codec(magic, sizeof(magic));
         if (!codec) {
@@ -388,6 +389,9 @@ static int ogg_read_page(AVFormatContext *s, int *sid)
     avio_skip(bc, 8); /* seq, crc */
     nsegs  = avio_r8(bc);
 
+    if (avio_feof(bc))
+        return AVERROR_EOF;
+
     idx = ogg_find_stream(ogg, serial);
     if (idx < 0) {
         if (data_packets_seen(ogg))
@@ -851,7 +855,7 @@ retry:
                                                      AV_PKT_DATA_SKIP_SAMPLES,
                                                      10);
         if(!side_data)
-            goto fail;
+            return AVERROR(ENOMEM);
         AV_WL32(side_data + 4, os->end_trimming);
         os->end_trimming = 0;
     }
@@ -861,7 +865,7 @@ retry:
                                                      AV_PKT_DATA_METADATA_UPDATE,
                                                      os->new_metadata_size);
         if(!side_data)
-            goto fail;
+            return AVERROR(ENOMEM);
 
         memcpy(side_data, os->new_metadata, os->new_metadata_size);
         av_freep(&os->new_metadata);
@@ -869,9 +873,6 @@ retry:
     }
 
     return psize;
-fail:
-    av_packet_unref(pkt);
-    return AVERROR(ENOMEM);
 }
 
 static int64_t ogg_read_timestamp(AVFormatContext *s, int stream_index,
@@ -941,7 +942,7 @@ static int ogg_read_seek(AVFormatContext *s, int stream_index,
     return ret;
 }
 
-static int ogg_probe(AVProbeData *p)
+static int ogg_probe(const AVProbeData *p)
 {
     if (!memcmp("OggS", p->buf, 5) && p->buf[5] <= 0x7)
         return AVPROBE_SCORE_MAX;