From f3358d7e6fb9540e45f1cde0378e94482846f216 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 16 Dec 2024 11:49:37 +0100 Subject: [PATCH 8/9] qtdemux: Fix integer overflow when allocating the samples table for fragmented MP4 This can lead to out of bounds writes and NULL pointer dereferences. Fixes GHSL-2024-094, GHSL-2024-237, GHSL-2024-241 Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3839 Part-of: --- gst/isomp4/qtdemux.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c index 229edb3e5..a37c92933 100644 --- a/gst/isomp4/qtdemux.c +++ b/gst/isomp4/qtdemux.c @@ -3327,6 +3327,7 @@ qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun, gint i; guint8 *data; guint entry_size, dur_offset, size_offset, flags_offset = 0, ct_offset = 0; + guint new_n_samples; QtDemuxSample *sample; gboolean ismv = FALSE; gint64 initial_offset; @@ -3426,14 +3427,13 @@ qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun, goto fail; data = (guint8 *) gst_byte_reader_peek_data_unchecked (trun); - if (stream->n_samples + samples_count >= - QTDEMUX_MAX_SAMPLE_INDEX_SIZE / sizeof (QtDemuxSample)) + if (!g_uint_checked_add (&new_n_samples, stream->n_samples, samples_count) || + new_n_samples >= QTDEMUX_MAX_SAMPLE_INDEX_SIZE / sizeof (QtDemuxSample)) goto index_too_big; GST_DEBUG_OBJECT (qtdemux, "allocating n_samples %u * %u (%.2f MB)", - stream->n_samples + samples_count, (guint) sizeof (QtDemuxSample), - (stream->n_samples + samples_count) * - sizeof (QtDemuxSample) / (1024.0 * 1024.0)); + new_n_samples, (guint) sizeof (QtDemuxSample), + (new_n_samples) * sizeof (QtDemuxSample) / (1024.0 * 1024.0)); /* create a new array of samples if it's the first sample parsed */ if (stream->n_samples == 0) { @@ -3442,7 +3442,7 @@ qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun, /* or try to reallocate it with space enough to insert the new samples */ } else stream->samples = g_try_renew (QtDemuxSample, stream->samples, - stream->n_samples + samples_count); + new_n_samples); if (stream->samples == NULL) goto out_of_memory; -- 2.47.0