File gimp-CVE-2025-14425.patch of Package gimp.42322

From cd1c88a0364ad1444c06536731972a99bd8643fd Mon Sep 17 00:00:00 2001
From: Alx Sa <cmyk.student@gmail.com>
Date: Wed, 12 Nov 2025 13:25:44 +0000
Subject: [PATCH] plug-ins: Mitigate ZDI-CAN-28248 for JP2 images

Resolves #15285
Per the report, it's possible to exceed the size of the pixel buffer
with a high precision_scaled value, as we size it to the width * bpp.
This patch includes precision_scaled in the allocation calculation.
It also adds a g_size_checked_mul () check to ensure there's no
overflow, and moves the pixel and buffer memory freeing to occur
in the out section so that it always runs even on failure.
---
diff -urp gimp-2.10.30.orig/plug-ins/common/file-jp2-load.c gimp-2.10.30/plug-ins/common/file-jp2-load.c
--- gimp-2.10.30.orig/plug-ins/common/file-jp2-load.c	2021-12-19 14:48:34.000000000 -0600
+++ gimp-2.10.30/plug-ins/common/file-jp2-load.c	2026-01-16 14:07:02.699092467 -0600
@@ -1050,14 +1050,15 @@ load_image (const gchar       *filename,
   GimpColorProfile  *profile;
   gint32             image_ID;
   gint32             layer_ID;
+  GeglBuffer          *buffer     = NULL;
+  guchar              *pixels     = NULL;
+  gsize                pixels_size;
   GimpImageType      image_type;
   GimpImageBaseType  base_type;
   gint               width;
   gint               height;
   gint               num_components;
-  GeglBuffer        *buffer;
   gint               i, j, k, it;
-  guchar            *pixels;
   const Babl        *file_format;
   gint               bpp;
   GimpPrecision      image_precision;
@@ -1297,6 +1298,15 @@ load_image (const gchar       *filename,
   file_format = gimp_drawable_get_format (layer_ID);
   bpp = babl_format_get_bytes_per_pixel (file_format);
 
+  if (! g_size_checked_mul (&pixels_size, width, (bpp * (precision_scaled / 8))))
+    {
+      g_set_error (error, GIMP_PLUG_IN_ERROR, 0,
+                   _("Defined row size is too large in JP2 image '%s'."),
+                   gimp_filename_to_utf8 (filename));
+      goto out;
+    }
+  pixels = g_new0 (guchar, pixels_size);
+
   buffer = gimp_drawable_get_buffer (layer_ID);
   pixels = g_new0 (guchar, width * bpp);
 
@@ -1324,13 +1334,13 @@ load_image (const gchar       *filename,
         gegl_buffer_set (buffer, GEGL_RECTANGLE (0, i, width, 1), 0,
                          file_format, pixels, GEGL_AUTO_ROWSTRIDE);
     }
-
-  g_free (pixels);
-
-  g_object_unref (buffer);
   gimp_progress_update (1.0);
 
  out:
+  if (pixels)
+    g_free (pixels);
+  if (buffer)
+    g_object_unref (buffer);
   if (profile)
     g_object_unref (profile);
   if (image)
openSUSE Build Service is sponsored by