qtdemux: Check sizes of stsc/stco/stts before trying to merge entries

Thanks to Antonio Morales for finding and reporting the issue.

Fixes GHSL-2024-246
Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3854

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8059>
This commit is contained in:
Sebastian Dröge 2024-09-27 15:50:54 +03:00 committed by GStreamer Marge Bot
parent 0f4dae9b01
commit 5a9e80c01b

View file

@ -10040,6 +10040,21 @@ qtdemux_merge_sample_table (GstQTDemux * qtdemux, QtDemuxStream * stream)
return;
}
if (gst_byte_reader_get_remaining (&stream->stts) < 8) {
GST_DEBUG_OBJECT (qtdemux, "Too small stts");
return;
}
if (stream->stco.size < 8) {
GST_DEBUG_OBJECT (qtdemux, "Too small stco");
return;
}
if (stream->n_samples_per_chunk == 0) {
GST_DEBUG_OBJECT (qtdemux, "No samples per chunk");
return;
}
/* Parse the stts to get the sample duration and number of samples */
gst_byte_reader_skip_unchecked (&stream->stts, 4);
stts_duration = gst_byte_reader_get_uint32_be_unchecked (&stream->stts);
@ -10051,6 +10066,13 @@ qtdemux_merge_sample_table (GstQTDemux * qtdemux, QtDemuxStream * stream)
GST_DEBUG_OBJECT (qtdemux, "sample_duration %d, num_chunks %u", stts_duration,
num_chunks);
if (gst_byte_reader_get_remaining (&stream->stsc) <
stream->n_samples_per_chunk * 3 * 4 +
(stream->n_samples_per_chunk - 1) * 4) {
GST_DEBUG_OBJECT (qtdemux, "Too small stsc");
return;
}
/* Now parse stsc, convert chunks into single samples and generate a
* new stsc, stts and stsz from this information */
gst_byte_writer_init (&stsc);