Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2019-12-03 20:09:03 +0300
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-05-20 01:25:30 +0300
commit703473ec04311016d2a1636ae9a91d2a1234eb91 (patch)
tree88c0166a5def2592d523a722f040682261a26dc7 /libavformat/matroskadec.c
parent2980fb5704654af3decd99c3c16b9622fc6c3463 (diff)
avformat/matroskadec: Check before allocations
That way one doesn't have to free later. In this case (concerning TTA extradata), this also fixes a memleak when the output samplerate is invalid. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com> (cherry picked from commit f7bf59b431e0921d5f318154f64c78bb226e33b9)
Diffstat (limited to 'libavformat/matroskadec.c')
-rw-r--r--libavformat/matroskadec.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index a43cc0bf19..724d81b654 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2558,30 +2558,29 @@ static int matroska_parse_tracks(AVFormatContext *s)
memcpy(&extradata[12], track->codec_priv.data,
track->codec_priv.size);
} else if (codec_id == AV_CODEC_ID_TTA) {
- extradata_size = 30;
- extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!extradata)
- return AVERROR(ENOMEM);
- ffio_init_context(&b, extradata, extradata_size, 1,
- 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)
return AVERROR_INVALIDDATA;
+ extradata_size = 30;
+ extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!extradata)
+ return AVERROR(ENOMEM);
+ ffio_init_context(&b, extradata, extradata_size, 1,
+ NULL, NULL, NULL, NULL);
+ avio_write(&b, "TTA1", 4);
+ avio_wl16(&b, 1);
+ avio_wl16(&b, track->audio.channels);
+ avio_wl16(&b, track->audio.bitdepth);
avio_wl32(&b, track->audio.out_samplerate);
avio_wl32(&b, av_rescale((matroska->duration * matroska->time_scale),
track->audio.out_samplerate,