diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2019-11-05 22:03:19 +0100 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2019-11-25 00:07:07 +0100 |
commit | d83002179fb377f1f201b43c9a55cc237695a1fe (patch) | |
tree | eedc2e87f5f631a06fb973f7aad67fdd19a99b34 | |
parent | 3e5a528bbe85a3a00640bc2739c11ee07eb05485 (diff) | |
download | ffmpeg-d83002179fb377f1f201b43c9a55cc237695a1fe.tar.gz |
avformat/vividas: Error out on audio packets in the absence of audio streams
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavformat/vividas.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/libavformat/vividas.c b/libavformat/vividas.c index bf19b55f51..f20af3d7c2 100644 --- a/libavformat/vividas.c +++ b/libavformat/vividas.c @@ -52,6 +52,7 @@ typedef struct VIV_AudioSubpacket { typedef struct VividasDemuxContext { int n_sb_blocks; VIV_SB_block *sb_blocks; + int num_audio; uint32_t sb_key; int64_t sb_offset; @@ -280,7 +281,7 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t * int i,j; int64_t off; int val_1; - int num_video, num_audio; + int num_video; AVIOContext *pb; pb = avio_alloc_context(buf, size, 0, NULL, NULL, NULL, NULL); @@ -342,13 +343,13 @@ static int track_header(VividasDemuxContext *viv, AVFormatContext *s, uint8_t * off = avio_tell(pb); off += ffio_read_varlen(pb); // val_10 avio_r8(pb); // '4' - num_audio = avio_r8(pb); + viv->num_audio = avio_r8(pb); avio_seek(pb, off, SEEK_SET); - if (num_audio != 1) - av_log(s, AV_LOG_WARNING, "number of audio tracks %d is not 1\n", num_audio); + if (viv->num_audio != 1) + av_log(s, AV_LOG_WARNING, "number of audio tracks %d is not 1\n", viv->num_audio); - for(i=0;i<num_audio;i++) { + for(i=0;i<viv->num_audio;i++) { int q; AVStream *st = avformat_new_stream(s, NULL); @@ -678,6 +679,9 @@ static int viv_read_packet(AVFormatContext *s, if (viv->sb_entries[viv->current_sb_entry].flag == 0) { uint64_t v_size = ffio_read_varlen(pb); + if (!viv->num_audio) + return AVERROR_INVALIDDATA; + ffio_read_varlen(pb); if (v_size > INT_MAX) return AVERROR_INVALIDDATA; |