https://bugs.gentoo.org/970989 https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10883 https://gstreamer.freedesktop.org/security/sa-2026-0005.html CVE-2026-2922 ZDI-26-165 ZDI-CAN-28845 From 8a17c9d183ca3cfb5e97ae3b3f344ba79f8859df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 11 Feb 2026 19:58:31 +0200 Subject: [PATCH 1/2] rmdemux: Check if new video fragment overflows the fragment storage before storing it There already was a check but that happened afterwards, i.e. after an out-of-bounds write that overwrote some following struct data. Fixes GST-SA-2026-0005, CVE-2026-2922, ZDI-CAN-28845. Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4905 Part-of: --- a/gst/realmedia/rmdemux.c +++ b/gst/realmedia/rmdemux.c @@ -2369,15 +2369,17 @@ gst_rmdemux_parse_video_packet (GstRMDemux * rmdemux, GstRMDemuxStream * stream, stream->frag_length = fragment_size; } + if (stream->frag_count >= MAX_FRAGS) { + gst_buffer_unref (fragment); + goto too_many_fragments; + } + /* put fragment in adapter */ gst_adapter_push (stream->adapter, fragment); stream->frag_offset[stream->frag_count] = stream->frag_current; stream->frag_current += fragment_size; stream->frag_count++; - if (stream->frag_count > MAX_FRAGS) - goto too_many_fragments; - GST_DEBUG_OBJECT (rmdemux, "stored fragment in adapter %d/%d", stream->frag_current, stream->frag_length); -- GitLab From cfc74588fca99328419eb16921fa559739a7b503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 11 Feb 2026 20:00:04 +0200 Subject: [PATCH 2/2] rmdemux: Avoid integer overflow when checking if enough data is available for video fragment Part-of: --- a/gst/realmedia/rmdemux.c +++ b/gst/realmedia/rmdemux.c @@ -2348,7 +2348,8 @@ gst_rmdemux_parse_video_packet (GstRMDemux * rmdemux, GstRMDemuxStream * stream, } GST_DEBUG_OBJECT (rmdemux, "fragment size %d", fragment_size); - if (map.size < (data - map.data) + fragment_size) + if (fragment_size > map.size + || (data - map.data) > map.size - fragment_size) goto not_enough_data; /* get the fragment */ -- GitLab