Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gstreamer-plugins-bad for 
openSUSE:Factory checked in at 2026-06-22 18:05:06
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gstreamer-plugins-bad (Old)
 and      /work/SRC/openSUSE:Factory/.gstreamer-plugins-bad.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gstreamer-plugins-bad"

Mon Jun 22 18:05:06 2026 rev:201 rq:1360596 version:1.28.4+24

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/gstreamer-plugins-bad/gstreamer-plugins-bad.changes  
    2026-06-13 18:47:07.464898329 +0200
+++ 
/work/SRC/openSUSE:Factory/.gstreamer-plugins-bad.new.1956/gstreamer-plugins-bad.changes
    2026-06-22 18:05:25.049194931 +0200
@@ -1,0 +2,18 @@
+Fri Jun 19 09:07:53 UTC 2026 - Bjørn Lie <[email protected]>
+
+- Update to version 1.28.4+24 (boo#1268406, boo#1268408,
+  boo#1268410, CVE-2026-52720, CVE-2026-52721, CVE-2026-52722):
+  + mxfdemux: fix remaining offsets index entry insertion call site
+  + mxfdemux: fix essence track offsets array population
+  + mxdemux: index entry: use intialized
+  + rtmp2: Remove socket timeout after handshake completes
+  + rtmp2: Don't retry on G_IO_ERROR_TIMED_OUT
+  + vnmdec: Avoid integer overflows when rectangle positions and
+    sizes
+  + pcapparse: Add missing bounds checks to ensure packets are
+    large enough
+  + mpegpsdemux: Release stream lock when seeking fails
+  + librfb: Validate framebuffer update rectangles against the
+    framebuffer size
+
+-------------------------------------------------------------------
@@ -4 +22,2 @@
-- Update to version 1.28.4:
+- Update to version 1.28.4 (boo#1268394, boo#1268401,
+  CVE-2026-52718, CVE-2026-52719):

Old:
----
  gst-plugins-bad-1.28.4.obscpio

New:
----
  gst-plugins-bad-1.28.4+24.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gstreamer-plugins-bad.spec ++++++
--- /var/tmp/diff_new_pack.kKdGXj/_old  2026-06-22 18:05:26.637250339 +0200
+++ /var/tmp/diff_new_pack.kKdGXj/_new  2026-06-22 18:05:26.641250479 +0200
@@ -81,7 +81,7 @@
 %endif
 
 Name:           gstreamer-plugins-bad
-Version:        1.28.4
+Version:        1.28.4+24
 Release:        0
 Summary:        GStreamer Streaming-Media Framework Plug-Ins
 License:        LGPL-2.1-or-later

++++++ _service ++++++
--- /var/tmp/diff_new_pack.kKdGXj/_old  2026-06-22 18:05:26.673251596 +0200
+++ /var/tmp/diff_new_pack.kKdGXj/_new  2026-06-22 18:05:26.677251735 +0200
@@ -5,7 +5,7 @@
     <param 
name="url">https://gitlab.freedesktop.org/gstreamer/gstreamer.git</param>
     <param name="subdir">subprojects/gst-plugins-bad</param>
     <param name="filename">gst-plugins-bad</param>
-    <param name="revision">1.28.4</param>
+    <param name="revision">6a394d8d</param>
     <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
     <param name="versionrewrite-pattern">v?(.*)\+0</param>
     <param name="versionrewrite-replacement">\1</param>

++++++ gst-plugins-bad-1.28.4.obscpio -> gst-plugins-bad-1.28.4+24.obscpio 
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.28.4/gst/librfb/rfbdecoder.c 
new/gst-plugins-bad-1.28.4+24/gst/librfb/rfbdecoder.c
--- old/gst-plugins-bad-1.28.4/gst/librfb/rfbdecoder.c  2026-06-12 
14:19:43.000000000 +0200
+++ new/gst-plugins-bad-1.28.4+24/gst/librfb/rfbdecoder.c       2026-06-19 
10:13:39.000000000 +0200
@@ -45,6 +45,10 @@
     gint start_y, gint rect_w, gint rect_h);
 static gboolean rfb_decoder_hextile_encoding (RfbDecoder * decoder,
     gint start_x, gint start_y, gint rect_w, gint rect_h);
+static gboolean rfb_decoder_clip_rectangle (RfbDecoder * decoder, gint * x,
+    gint * y, gint * w, gint * h, gint * skip_x, gint * skip_y);
+static gboolean rfb_decoder_clip_copyrect (RfbDecoder * decoder, gint * dst_x,
+    gint * dst_y, gint * src_x, gint * src_y, gint * w, gint * h);
 
 RfbDecoder *
 rfb_decoder_new (void)
@@ -802,23 +806,20 @@
   if (!rfb_decoder_read (decoder, 12))
     return FALSE;
 
-  x = RFB_GET_UINT16 (decoder->data + 0) - decoder->offset_x;
-  y = RFB_GET_UINT16 (decoder->data + 2) - decoder->offset_y;
+  x = RFB_GET_UINT16 (decoder->data + 0);
+  y = RFB_GET_UINT16 (decoder->data + 2);
   w = RFB_GET_UINT16 (decoder->data + 4);
   h = RFB_GET_UINT16 (decoder->data + 6);
   encoding = RFB_GET_UINT32 (decoder->data + 8);
 
+  x -= (gint) decoder->offset_x;
+  y -= (gint) decoder->offset_y;
+
   GST_DEBUG ("update received");
   GST_DEBUG ("x:%d y:%d", x, y);
   GST_DEBUG ("w:%d h:%d", w, h);
   GST_DEBUG ("encoding: %d", encoding);
 
-  if (((w * h) + (x * y)) > (decoder->width * decoder->height)) {
-    GST_ERROR ("Desktop resize is unsupported.");
-    decoder->state = NULL;
-    return TRUE;
-  }
-
   switch (encoding) {
     case ENCODING_TYPE_RAW:
       ret = rfb_decoder_raw_encoding (decoder, x, y, w, h);
@@ -857,11 +858,20 @@
 rfb_decoder_raw_encoding (RfbDecoder * decoder, gint start_x, gint start_y,
     gint rect_w, gint rect_h)
 {
-  gint size;
+  gint copy_x, copy_y, copy_w, copy_h;
+  gint skip_x = 0, skip_y = 0;
+  guint32 size;
   guint8 *frame, *p;
   guint32 raw_line_size;
+  guint32 copy_line_size;
+
+  if (rect_w <= 0 || rect_h <= 0)
+    return TRUE;
 
   raw_line_size = rect_w * decoder->bytespp;
+  if (rect_h > 0 && raw_line_size > G_MAXUINT32 / rect_h)
+    return FALSE;
+
   size = rect_h * raw_line_size;
 
   GST_DEBUG ("Reading %d bytes (%dx%d)", size, rect_w, rect_h);
@@ -869,13 +879,23 @@
   if (!rfb_decoder_read (decoder, size))
     return FALSE;
 
+  copy_x = start_x;
+  copy_y = start_y;
+  copy_w = rect_w;
+  copy_h = rect_h;
+
+  if (!rfb_decoder_clip_rectangle (decoder, &copy_x, &copy_y, &copy_w, &copy_h,
+          &skip_x, &skip_y))
+    return TRUE;
+
   frame =
-      decoder->frame + (((start_y * decoder->rect_width) +
-          start_x) * decoder->bytespp);
-  p = decoder->data;
+      decoder->frame + (((copy_y * decoder->rect_width) +
+          copy_x) * decoder->bytespp);
+  p = decoder->data + (skip_y * raw_line_size) + (skip_x * decoder->bytespp);
+  copy_line_size = copy_w * decoder->bytespp;
 
-  while (rect_h--) {
-    memcpy (frame, p, raw_line_size);
+  while (copy_h--) {
+    memcpy (frame, p, copy_line_size);
     p += raw_line_size;
     frame += decoder->line_size;
   }
@@ -887,7 +907,8 @@
 rfb_decoder_copyrect_encoding (RfbDecoder * decoder, gint start_x, gint 
start_y,
     gint rect_w, gint rect_h)
 {
-  guint16 src_x, src_y;
+  gint src_x, src_y;
+  gint copy_x, copy_y, copy_w, copy_h;
   gint line_width, copyrect_width;
   guint8 *src, *dst;
 
@@ -895,20 +916,28 @@
     return FALSE;
 
   /* don't forget the offset */
-  src_x = RFB_GET_UINT16 (decoder->data) - decoder->offset_x;
-  src_y = RFB_GET_UINT16 (decoder->data + 2) - decoder->offset_y;
+  src_x = RFB_GET_UINT16 (decoder->data) - (gint) decoder->offset_x;
+  src_y = RFB_GET_UINT16 (decoder->data + 2) - (gint) decoder->offset_y;
   GST_DEBUG ("Copyrect from %d %d", src_x, src_y);
 
-  copyrect_width = rect_w * decoder->bytespp;
+  copy_x = start_x;
+  copy_y = start_y;
+  copy_w = rect_w;
+  copy_h = rect_h;
+  if (!rfb_decoder_clip_copyrect (decoder, &copy_x, &copy_y, &src_x, &src_y,
+          &copy_w, &copy_h))
+    return TRUE;
+
+  copyrect_width = copy_w * decoder->bytespp;
   line_width = decoder->line_size;
   src =
       decoder->prev_frame + ((src_y * decoder->rect_width) +
       src_x) * decoder->bytespp;
   dst =
-      decoder->frame + ((start_y * decoder->rect_width) +
-      start_x) * decoder->bytespp;
+      decoder->frame + ((copy_y * decoder->rect_width) +
+      copy_x) * decoder->bytespp;
 
-  while (rect_h--) {
+  while (copy_h--) {
     memcpy (dst, src, copyrect_width);
     src += line_width;
     dst += line_width;
@@ -926,6 +955,9 @@
   guint32 *offset;
   gint i, j;
 
+  if (!rfb_decoder_clip_rectangle (decoder, &x, &y, &w, &h, NULL, NULL))
+    return;
+
   for (i = 0; i < h; i++) {
     offset =
         (guint32 *) (decoder->frame + ((x + (y +
@@ -1100,6 +1132,68 @@
 
   return TRUE;
 }
+
+static gboolean
+rfb_decoder_clip_rectangle (RfbDecoder * decoder, gint * x, gint * y, gint * w,
+    gint * h, gint * skip_x, gint * skip_y)
+{
+  gint x1, y1, x2, y2;
+  gint orig_x, orig_y;
+
+  if (*w <= 0 || *h <= 0)
+    return FALSE;
+
+  orig_x = *x;
+  orig_y = *y;
+  x1 = MAX (orig_x, 0);
+  y1 = MAX (orig_y, 0);
+  x2 = MIN (orig_x + *w, (gint) decoder->rect_width);
+  y2 = MIN (orig_y + *h, (gint) decoder->rect_height);
+
+  if (x2 <= x1 || y2 <= y1)
+    return FALSE;
+
+  *x = x1;
+  *y = y1;
+  *w = x2 - x1;
+  *h = y2 - y1;
+
+  if (skip_x)
+    *skip_x = x1 - orig_x;
+  if (skip_y)
+    *skip_y = y1 - orig_y;
+
+  return TRUE;
+}
+
+static gboolean
+rfb_decoder_clip_copyrect (RfbDecoder * decoder, gint * dst_x, gint * dst_y,
+    gint * src_x, gint * src_y, gint * w, gint * h)
+{
+  gint left, top, right, bottom;
+
+  if (*w <= 0 || *h <= 0)
+    return FALSE;
+
+  left = MAX (0, MAX (-*dst_x, -*src_x));
+  top = MAX (0, MAX (-*dst_y, -*src_y));
+  right = MIN (*w, MIN ((gint) decoder->rect_width - *dst_x,
+          (gint) decoder->rect_width - *src_x));
+  bottom = MIN (*h, MIN ((gint) decoder->rect_height - *dst_y,
+          (gint) decoder->rect_height - *src_y));
+
+  if (right <= left || bottom <= top)
+    return FALSE;
+
+  *dst_x += left;
+  *dst_y += top;
+  *src_x += left;
+  *src_y += top;
+  *w = right - left;
+  *h = bottom - top;
+
+  return TRUE;
+}
 
 static gboolean
 rfb_decoder_state_set_colour_map_entries (RfbDecoder * decoder)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.28.4/gst/mpegdemux/gstmpegdemux.c 
new/gst-plugins-bad-1.28.4+24/gst/mpegdemux/gstmpegdemux.c
--- old/gst-plugins-bad-1.28.4/gst/mpegdemux/gstmpegdemux.c     2026-06-12 
14:19:43.000000000 +0200
+++ new/gst-plugins-bad-1.28.4+24/gst/mpegdemux/gstmpegdemux.c  2026-06-19 
10:13:39.000000000 +0200
@@ -1370,7 +1370,7 @@
   if (flush || seeksegment.position != demux->src_segment.position) {
     /* Do the actual seeking */
     if (!gst_ps_demux_do_seek (demux, &seeksegment)) {
-      return FALSE;
+      goto seek_error;
     }
   }
 
@@ -1440,6 +1440,7 @@
 seek_error:
   {
     GST_WARNING_OBJECT (demux, "couldn't perform seek");
+    GST_PAD_STREAM_UNLOCK (demux->sinkpad);
     gst_event_unref (event);
     return FALSE;
   }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.28.4/gst/mxf/mxfdemux.c 
new/gst-plugins-bad-1.28.4+24/gst/mxf/mxfdemux.c
--- old/gst-plugins-bad-1.28.4/gst/mxf/mxfdemux.c       2026-06-12 
14:19:43.000000000 +0200
+++ new/gst-plugins-bad-1.28.4+24/gst/mxf/mxfdemux.c    2026-06-19 
10:13:39.000000000 +0200
@@ -925,6 +925,7 @@
         tmp->track_number = track->parent.track_number;
         tmp->track_id = track->parent.track_id;
         memcpy (&tmp->source_package_uid, &package->parent.package_uid, 32);
+        tmp->offsets = g_array_new (FALSE, TRUE, sizeof (GstMXFDemuxIndex));
 
         if (demux->current_partition->partition.body_sid == edata->body_sid &&
             demux->current_partition->partition.body_offset == 0)
@@ -2153,16 +2154,17 @@
     return -1;
 
   idx = &g_array_index (offsets, GstMXFDemuxIndex, *position);
-  if (idx->offset != 0 && (!keyframe || idx->keyframe)) {
+  if (idx->initialized && (!keyframe || idx->keyframe)) {
     current_offset = idx->offset;
-  } else if (idx->offset != 0 && current_position > 0) {
+  } else if (keyframe && current_position > 0) {
     current_position--;
     while (TRUE) {
       GST_LOG ("current_position %" G_GUINT64_FORMAT, current_position);
       idx = &g_array_index (offsets, GstMXFDemuxIndex, current_position);
-      if (idx->offset == 0) {
-        GST_LOG ("breaking offset 0");
-        break;
+      if (!idx->initialized) {
+        /* don't search for a keyframe in an uninitialized gap */
+        GST_LOG ("breaking on uninitialized offset");
+        return -1;
       } else if (!idx->keyframe && current_position > 0) {
         current_position--;
         continue;
@@ -2181,6 +2183,40 @@
   return current_offset;
 }
 
+static void
+have_new_essence_track_index_entry (GstMXFDemux * demux,
+    GstMXFDemuxEssenceTrack * etrack, guint64 position,
+    GstMXFDemuxIndex * entry)
+{
+  if (etrack->offsets->len > position) {
+    GstMXFDemuxIndex *cur_entry =
+        &g_array_index (etrack->offsets, GstMXFDemuxIndex, position);
+    if (cur_entry->initialized) {
+      GST_TRACE_OBJECT (demux,
+          "track %u body_sid:%u index_sid:%u delta_id:%d found initialized 
entry at position:%"
+          G_GUINT64_FORMAT, etrack->track_id, etrack->body_sid,
+          etrack->index_sid, etrack->delta_id, position);
+
+      return;
+    }
+
+    GST_LOG_OBJECT (demux,
+        "track %u body_sid:%u index_sid:%u delta_id:%d initializing entry at 
position:%"
+        G_GUINT64_FORMAT, etrack->track_id, etrack->body_sid,
+        etrack->index_sid, etrack->delta_id, position);
+    *cur_entry = *entry;
+
+    return;
+  }
+
+  GST_LOG_OBJECT (demux,
+      "track %u body_sid:%u index_sid:%u delta_id:%d appending entry at 
position:%"
+      G_GUINT64_FORMAT, etrack->track_id, etrack->body_sid,
+      etrack->index_sid, etrack->delta_id, position);
+
+  g_array_insert_val (etrack->offsets, position, *entry);
+}
+
 /**
  * find_edit_entry:
  * @demux: The demuxer
@@ -2220,21 +2256,20 @@
       G_GUINT64_FORMAT " keyframe:%d", etrack->track_id, etrack->body_sid,
       etrack->index_sid, etrack->delta_id, position, keyframe);
 
+  /* Look in the track offsets */
+  if (find_offset (etrack->offsets, &position, keyframe) != -1) {
+    *entry = g_array_index (etrack->offsets, GstMXFDemuxIndex, position);
+    GST_LOG_OBJECT (demux, "Found entry in track offsets");
+    return TRUE;
+  } else {
+    GST_LOG_OBJECT (demux, "Didn't find entry in track offsets");
+  }
+
   /* Default values */
   entry->duration = 1;
   /* By default every entry is a keyframe unless specified otherwise */
   entry->keyframe = TRUE;
 
-  /* Look in the track offsets */
-  if (etrack->offsets && etrack->offsets->len > position) {
-    if (find_offset (etrack->offsets, &position, keyframe) != -1) {
-      *entry = g_array_index (etrack->offsets, GstMXFDemuxIndex, position);
-      GST_LOG_OBJECT (demux, "Found entry in track offsets");
-      return TRUE;
-    } else
-      GST_LOG_OBJECT (demux, "Didn't find entry in track offsets");
-  }
-
   /* Look in the indextables */
   index_table = get_track_index_table (demux, etrack);
 
@@ -2454,6 +2489,8 @@
   entry->offset = absolute_offset;
   entry->dts = position;
 
+  have_new_essence_track_index_entry (demux, etrack, position, entry);
+
   return TRUE;
 }
 
@@ -2494,17 +2531,16 @@
   retentry->keyframe = TRUE;
 
   /* Index-less search */
-  if (etrack->offsets) {
-    for (i = 0; i < etrack->offsets->len; i++) {
-      GstMXFDemuxIndex *idx =
-          &g_array_index (etrack->offsets, GstMXFDemuxIndex, i);
-
-      if (idx->initialized && idx->offset != 0 && idx->offset == offset) {
-        *retentry = *idx;
-        GST_DEBUG_OBJECT (demux,
-            "Found in track index. Position:%" G_GUINT64_FORMAT, idx->dts);
-        return TRUE;
-      }
+  for (i = 0; i < etrack->offsets->len; i++) {
+    GstMXFDemuxIndex *idx =
+        &g_array_index (etrack->offsets, GstMXFDemuxIndex, i);
+
+    if (idx->initialized && idx->offset == offset) {
+      g_assert (offset != 0);
+      *retentry = *idx;
+      GST_DEBUG_OBJECT (demux,
+          "Found in track offsets. Position:%" G_GUINT64_FORMAT, idx->dts);
+      return TRUE;
     }
   }
 
@@ -2706,6 +2742,8 @@
   retentry->offset = original_offset;
   retentry->dts = position;
 
+  have_new_essence_track_index_entry (demux, etrack, position, retentry);
+
   return TRUE;
 }
 
@@ -2935,9 +2973,6 @@
     return ret;
   }
 
-  if (!etrack->offsets)
-    etrack->offsets = g_array_new (FALSE, TRUE, sizeof (GstMXFDemuxIndex));
-
   if (!index_entry.initialized) {
     /* This can happen when doing scanning without entry tables */
     index_entry.duration = 1;
@@ -2953,11 +2988,8 @@
         etrack->track_id, index_entry.dts, index_entry.offset,
         index_entry.keyframe);
 
-    /* We only ever append to the track offset entry. */
-    g_assert (etrack->position <= etrack->offsets->len);
-    g_array_insert_val (etrack->offsets, etrack->position, index_entry);
-  } else if (etrack->position == etrack->offsets->len) {
-    g_array_insert_val (etrack->offsets, etrack->position, index_entry);
+    have_new_essence_track_index_entry (demux, etrack, etrack->position,
+        &index_entry);
   }
 
   if (peek)
@@ -3881,13 +3913,13 @@
   current_position = MIN (current_position, offsets->len - 1);
 
   idx = &g_array_index (offsets, GstMXFDemuxIndex, current_position);
-  while ((idx->offset == 0 || (keyframe && !idx->keyframe))
+  while ((!idx->initialized || (keyframe && !idx->keyframe))
       && current_position > 0) {
     current_position--;
     idx = &g_array_index (offsets, GstMXFDemuxIndex, current_position);
   }
 
-  if (idx->offset != 0 && (!keyframe || idx->keyframe)) {
+  if (idx->initialized && (!keyframe || idx->keyframe)) {
     *position = current_position;
     return idx->offset;
   }
@@ -4024,9 +4056,9 @@
     /* If we found the position read it from the index again */
     if (((ret == GST_FLOW_OK && etrack->position == *position + 1) ||
             (ret == GST_FLOW_EOS && etrack->position == *position + 1))
-        && etrack->offsets && etrack->offsets->len > *position
+        && etrack->offsets->len > *position
         && g_array_index (etrack->offsets, GstMXFDemuxIndex,
-            *position).offset != 0) {
+            *position).initialized) {
       GST_DEBUG_OBJECT (demux, "Found at offset %" G_GUINT64_FORMAT,
           demux->offset);
       demux->offset = old_offset;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.28.4/gst/mxf/mxfdemux.h 
new/gst-plugins-bad-1.28.4+24/gst/mxf/mxfdemux.h
--- old/gst-plugins-bad-1.28.4/gst/mxf/mxfdemux.h       2026-06-12 
14:19:43.000000000 +0200
+++ new/gst-plugins-bad-1.28.4+24/gst/mxf/mxfdemux.h    2026-06-19 
10:13:39.000000000 +0200
@@ -146,7 +146,7 @@
 
 typedef struct
 {
-  /* absolute byte offset excluding run_in, 0 if uninitialized */
+  /* absolute byte offset excluding run_in */
   guint64 offset;
 
   /* PTS edit unit number or G_MAXUINT64 */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.28.4/gst/pcapparse/gstpcapparse.c 
new/gst-plugins-bad-1.28.4+24/gst/pcapparse/gstpcapparse.c
--- old/gst-plugins-bad-1.28.4/gst/pcapparse/gstpcapparse.c     2026-06-12 
14:19:43.000000000 +0200
+++ new/gst-plugins-bad-1.28.4+24/gst/pcapparse/gstpcapparse.c  2026-06-19 
10:13:39.000000000 +0200
@@ -354,6 +354,7 @@
 #define SLL2_HEADER_LEN    20
 #define IP_HEADER_MIN_LEN 20
 #define UDP_HEADER_LEN     8
+#define TCP_HEADER_MIN_LEN 20
 
 #define IP_PROTO_UDP      17
 #define IP_PROTO_TCP      6
@@ -438,7 +439,8 @@
     return FALSE;
 
   ip_header_size = (b & 0x0f) * 4;
-  if (buf_ip + ip_header_size > buf + buf_size)
+  if (ip_header_size < IP_HEADER_MIN_LEN ||
+      buf_ip + ip_header_size > buf + buf_size)
     return FALSE;
 
   flags = buf_ip[6] >> 5;
@@ -460,6 +462,11 @@
   memcpy (&ip_dst_addr, buf_ip + 16, sizeof (ip_dst_addr));
   buf_proto = buf_ip + ip_header_size;
   ip_packet_len = GUINT16_FROM_BE (*(guint16 *) (buf_ip + 2));
+  if (ip_packet_len < ip_header_size)
+    return FALSE;
+
+  if (buf_proto + 4 > buf + buf_size)
+    return FALSE;
 
   /* ok for tcp and udp */
   src_port = GUINT16_FROM_BE (*((guint16 *) (buf_proto + 0)));
@@ -467,6 +474,8 @@
 
   /* extract some params and data according to protocol */
   if (ip_protocol == IP_PROTO_UDP) {
+    if (buf_proto + 6 > buf + buf_size)
+      return FALSE;
     len = GUINT16_FROM_BE (*((guint16 *) (buf_proto + 4)));
     if (len < UDP_HEADER_LEN || buf_proto + len > buf + buf_size)
       return FALSE;
@@ -474,10 +483,13 @@
     *payload = buf_proto + UDP_HEADER_LEN;
     *payload_size = len - UDP_HEADER_LEN;
   } else {
-    if (buf_proto + 12 >= buf + buf_size)
+    if (buf_proto + 13 > buf + buf_size)
       return FALSE;
     len = (buf_proto[12] >> 4) * 4;
-    if (buf_proto + len > buf + buf_size)
+    if (len < TCP_HEADER_MIN_LEN || buf_proto + len > buf + buf_size)
+      return FALSE;
+    if (ip_packet_len < ip_header_size + len ||
+        buf_ip + ip_packet_len > buf + buf_size)
       return FALSE;
 
     /* all remaining data following tcp header is payload */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.28.4/gst/rtmp2/rtmp/rtmpclient.c 
new/gst-plugins-bad-1.28.4+24/gst/rtmp2/rtmp/rtmpclient.c
--- old/gst-plugins-bad-1.28.4/gst/rtmp2/rtmp/rtmpclient.c      2026-06-12 
14:19:43.000000000 +0200
+++ new/gst-plugins-bad-1.28.4+24/gst/rtmp2/rtmp/rtmpclient.c   2026-06-19 
10:13:39.000000000 +0200
@@ -510,6 +510,7 @@
   ConnectTaskData *data = g_task_get_task_data (task);
   GError *error = NULL;
   gboolean res;
+  GSocket *socket;
 
   res = gst_rtmp_client_handshake_finish (stream, result, &error);
   if (!res) {
@@ -519,6 +520,9 @@
     return;
   }
 
+  socket = g_socket_connection_get_socket (socket_connection);
+  g_socket_set_timeout (socket, 0);
+
   data->connection = gst_rtmp_connection_new (socket_connection,
       g_task_get_cancellable (task));
   data->error_handler_id = g_signal_connect (data->connection,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.28.4/gst/rtmp2/rtmp/rtmpconnection.c 
new/gst-plugins-bad-1.28.4+24/gst/rtmp2/rtmp/rtmpconnection.c
--- old/gst-plugins-bad-1.28.4/gst/rtmp2/rtmp/rtmpconnection.c  2026-06-12 
14:19:43.000000000 +0200
+++ new/gst-plugins-bad-1.28.4+24/gst/rtmp2/rtmp/rtmpconnection.c       
2026-06-19 10:13:39.000000000 +0200
@@ -484,8 +484,8 @@
   if (ret < 0) {
     gint code = error->code;
 
-    if (error->domain == G_IO_ERROR && (code == G_IO_ERROR_WOULD_BLOCK ||
-            code == G_IO_ERROR_TIMED_OUT || code == G_IO_ERROR_AGAIN)) {
+    if (error->domain == G_IO_ERROR &&
+        (code == G_IO_ERROR_WOULD_BLOCK || code == G_IO_ERROR_AGAIN)) {
       /* should retry */
       GST_DEBUG_OBJECT (sc, "read IO error %d %s, continuing",
           code, error->message);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.28.4/gst/vmnc/vmncdec.c 
new/gst-plugins-bad-1.28.4+24/gst/vmnc/vmncdec.c
--- old/gst-plugins-bad-1.28.4/gst/vmnc/vmncdec.c       2026-06-12 
14:19:43.000000000 +0200
+++ new/gst-plugins-bad-1.28.4+24/gst/vmnc/vmncdec.c    2026-06-19 
10:13:39.000000000 +0200
@@ -155,6 +155,20 @@
 typedef int (*rectangle_handler) (GstVMncDec * dec, struct RfbRectangle * rect,
     const guint8 * data, int len, gboolean decode);
 
+static gboolean
+vmnc_rect_payload_size (struct RfbRectangle *rect, guint bytes_per_pixel,
+    gsize * size)
+{
+  gsize pixels;
+
+  if (!g_size_checked_mul (&pixels, rect->width, rect->height))
+    return FALSE;
+  if (!g_size_checked_mul (size, pixels, bytes_per_pixel))
+    return FALSE;
+
+  return TRUE;
+}
+
 static int
 vmnc_handle_wmvi_rectangle (GstVMncDec * dec, struct RfbRectangle *rect,
     const guint8 * data, int len, gboolean decode)
@@ -395,7 +409,8 @@
 {
   /* Cursor data. */
   int datalen = 2;
-  int type, size;
+  int type;
+  gsize size;
 
   if (len < datalen) {
     GST_LOG_OBJECT (dec, "Cursor data too short");
@@ -405,9 +420,19 @@
   type = RFB_GET_UINT8 (data);
 
   if (type == CURSOR_COLOUR) {
-    datalen += rect->width * rect->height * dec->format.bytes_per_pixel * 2;
+    if (!vmnc_rect_payload_size (rect, dec->format.bytes_per_pixel, &size) ||
+        size > ((gsize) G_MAXINT - datalen) / 2) {
+      GST_WARNING_OBJECT (dec, "Cursor data size overflow");
+      return ERROR_INVALID;
+    }
+    datalen += size * 2;
   } else if (type == CURSOR_ALPHA) {
-    datalen += rect->width * rect->height * 4;
+    if (!vmnc_rect_payload_size (rect, 4, &size) ||
+        size > (gsize) G_MAXINT - datalen) {
+      GST_WARNING_OBJECT (dec, "Cursor data size overflow");
+      return ERROR_INVALID;
+    }
+    datalen += size;
   } else {
     GST_WARNING_OBJECT (dec, "Unknown cursor type: %d", type);
     return ERROR_INVALID;
@@ -422,22 +447,20 @@
   dec->cursor.type = type;
   dec->cursor.width = rect->width;
   dec->cursor.height = rect->height;
-  dec->cursor.type = type;
   dec->cursor.hot_x = rect->x;
   dec->cursor.hot_y = rect->y;
 
   g_free (dec->cursor.cursordata);
   g_free (dec->cursor.cursormask);
 
-  if (type == 0) {
-    size = rect->width * rect->height * dec->format.bytes_per_pixel;
+  if (type == CURSOR_COLOUR) {
     dec->cursor.cursordata = g_malloc (size);
     dec->cursor.cursormask = g_malloc (size);
     memcpy (dec->cursor.cursordata, data + 2, size);
     memcpy (dec->cursor.cursormask, data + 2 + size, size);
   } else {
-    dec->cursor.cursordata = g_malloc (rect->width * rect->height * 4);
-    memcpy (dec->cursor.cursordata, data + 2, rect->width * rect->height * 4);
+    dec->cursor.cursordata = g_malloc (size);
+    memcpy (dec->cursor.cursordata, data + 2, size);
     dec->cursor.cursormask = NULL;
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.28.4/meson.build 
new/gst-plugins-bad-1.28.4+24/meson.build
--- old/gst-plugins-bad-1.28.4/meson.build      2026-06-12 14:19:43.000000000 
+0200
+++ new/gst-plugins-bad-1.28.4+24/meson.build   2026-06-19 10:13:39.000000000 
+0200
@@ -1,5 +1,5 @@
 project('gst-plugins-bad', 'c', 'cpp',
-  version : '1.28.4',
+  version : '1.28.4.1',
   meson_version : '>= 1.4',
   default_options : [ 'warning_level=1',
                       'buildtype=debugoptimized',

++++++ gst-plugins-bad.obsinfo ++++++
--- /var/tmp/diff_new_pack.kKdGXj/_old  2026-06-22 18:05:32.685461365 +0200
+++ /var/tmp/diff_new_pack.kKdGXj/_new  2026-06-22 18:05:32.705462064 +0200
@@ -1,5 +1,5 @@
 name: gst-plugins-bad
-version: 1.28.4
-mtime: 1781266783
-commit: b46f881eaa8126eddfd21b5ae5512f8d4ff36255
+version: 1.28.4+24
+mtime: 1781856819
+commit: 6a394d8df25c2440430b1d3ce6cdfb6434fd9b76
 

Reply via email to