aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/matroskadec.c
diff options
context:
space:
mode:
authorAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2015-06-15 21:06:51 +0200
committerAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2015-06-16 21:46:04 +0200
commit92e79a2f7bf2f8bb0cb2d1a3e4d76737557071c4 (patch)
treed70751536acb5dedf3a79353bcdfbeaaa355ed15 /libavformat/matroskadec.c
parent5b76c82fd7a5f4f36bb901b8c43d7f7319599599 (diff)
downloadffmpeg-92e79a2f7bf2f8bb0cb2d1a3e4d76737557071c4.tar.gz
matroskadec: validate audio channels and bitdepth
In the TTA extradata re-construction the values are written with avio_wl16 and if they don't fit into uint16_t, this triggers an av_assert2 in avio_w8. Reviewed-by: Michael Niedermayer <michaelni@gmx.at> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
Diffstat (limited to 'libavformat/matroskadec.c')
-rw-r--r--libavformat/matroskadec.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 81dd53fc24..07f4539723 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1889,6 +1889,18 @@ static int matroska_parse_tracks(AVFormatContext *s)
NULL, NULL, NULL, NULL);
avio_write(&b, "TTA1", 4);
avio_wl16(&b, 1);
+ if (track->audio.channels > UINT16_MAX ||
+ track->audio.bitdepth > UINT16_MAX) {
+ av_log(matroska->ctx, AV_LOG_WARNING,
+ "Too large audio channel number %"PRIu64
+ " or bitdepth %"PRIu64". Skipping track.\n",
+ track->audio.channels, track->audio.bitdepth);
+ av_freep(&extradata);
+ if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
+ return AVERROR_INVALIDDATA;
+ else
+ continue;
+ }
avio_wl16(&b, track->audio.channels);
avio_wl16(&b, track->audio.bitdepth);
if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)