import OL gimp-2.99.8-4.el9_6.2
This commit is contained in:
parent
5a848b7509
commit
fac97f0b7c
@ -1,63 +0,0 @@
|
|||||||
From 1e67a41b5171ab6c852d2b82ad3f3c23393d6326 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alx Sa <cmyk.student@gmail.com>
|
|
||||||
Date: Wed, 7 Feb 2024 12:45:17 +0000
|
|
||||||
Subject: [PATCH 1/3] plug-ins: Fix DDS vulnerability (ZDI-CAN-22093)
|
|
||||||
|
|
||||||
Resolves #10069
|
|
||||||
|
|
||||||
Currently, the DDS header information for the width, height, and bytes per scan line
|
|
||||||
are read in and assumed to be correct. As these values are used for memory allocation
|
|
||||||
and reading, it would be good to verify they do not exceed the file size.
|
|
||||||
|
|
||||||
This patch adds a condition after the header is read in to verify those values. If they exceed
|
|
||||||
the file size (mins an offset), the file is not read in and an error message is shown.
|
|
||||||
|
|
||||||
Modified-by: Alex Burmashev <alexander.burmashev@oracle.com>
|
|
||||||
Signed-off-by: Alex Burmashev <alexander.burmashev@oracle.com>
|
|
||||||
---
|
|
||||||
plug-ins/file-dds/ddsread.c | 15 +++++++++++++++
|
|
||||||
1 file changed, 15 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/plug-ins/file-dds/ddsread.c b/plug-ins/file-dds/ddsread.c
|
|
||||||
index 72102d0..add4ba5 100644
|
|
||||||
--- a/plug-ins/file-dds/ddsread.c
|
|
||||||
+++ b/plug-ins/file-dds/ddsread.c
|
|
||||||
@@ -124,6 +124,7 @@ read_dds (GFile *file,
|
|
||||||
guint l = 0;
|
|
||||||
guchar *pixels;
|
|
||||||
FILE *fp;
|
|
||||||
+ gsize file_size;
|
|
||||||
dds_header_t hdr;
|
|
||||||
dds_header_dx10_t dx10hdr;
|
|
||||||
dds_load_info_t d;
|
|
||||||
@@ -157,6 +158,10 @@ read_dds (GFile *file,
|
|
||||||
return GIMP_PDB_EXECUTION_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ fseek (fp, 0L, SEEK_END);
|
|
||||||
+ file_size = ftell (fp);
|
|
||||||
+ fseek (fp, 0, SEEK_SET);
|
|
||||||
+
|
|
||||||
gimp_progress_init_printf ("Loading %s:", gimp_file_get_utf8_name (file));
|
|
||||||
|
|
||||||
/* read header */
|
|
||||||
@@ -207,6 +212,16 @@ read_dds (GFile *file,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* verify header information is accurate */
|
|
||||||
+ if (hdr.depth < 1 ||
|
|
||||||
+ (hdr.pitch_or_linsize > (file_size - sizeof (hdr))) ||
|
|
||||||
+ (((guint64) hdr.height * hdr.width * hdr.depth) > (file_size - sizeof (hdr))))
|
|
||||||
+ {
|
|
||||||
+ fclose (fp);
|
|
||||||
+ g_message ("Invalid or corrupted DDS header\n");
|
|
||||||
+ return GIMP_PDB_EXECUTION_ERROR;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (hdr.pixelfmt.flags & DDPF_FOURCC)
|
|
||||||
{
|
|
||||||
/* fourcc is dXt* or rXgb */
|
|
||||||
--
|
|
||||||
2.39.3
|
|
||||||
|
|
@ -1,100 +0,0 @@
|
|||||||
From bd6e7854b7b679444af685fab06dbb6559f3d720 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alx Sa <cmyk.student@gmail.com>
|
|
||||||
Date: Wed, 7 Feb 2024 12:47:12 +0000
|
|
||||||
Subject: [PATCH 2/3] plug-ins: Fix DDS import regression from 7db71cd0
|
|
||||||
|
|
||||||
@Wormnest pointed out that compressed files are likely smaller than
|
|
||||||
width * height * bps, so our check to prevent ZDI-CAN-22093
|
|
||||||
also caught valid files.
|
|
||||||
The size check is removed from load_image () and moved to load_layer ()
|
|
||||||
before the two fread() functions, as we know exactly how much we'll
|
|
||||||
try to read at that point.
|
|
||||||
(Backport of 8faad92e)
|
|
||||||
|
|
||||||
Modified-by: Alex Burmashev <alexander.burmashev@oracle.com>
|
|
||||||
Signed-off-by: Alex Burmashev <alexander.burmashev@oracle.com>
|
|
||||||
---
|
|
||||||
plug-ins/file-dds/ddsread.c | 39 +++++++++++++++++++++++++++----------
|
|
||||||
1 file changed, 29 insertions(+), 10 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/plug-ins/file-dds/ddsread.c b/plug-ins/file-dds/ddsread.c
|
|
||||||
index add4ba5..b19d32e 100644
|
|
||||||
--- a/plug-ins/file-dds/ddsread.c
|
|
||||||
+++ b/plug-ins/file-dds/ddsread.c
|
|
||||||
@@ -212,16 +212,6 @@ read_dds (GFile *file,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* verify header information is accurate */
|
|
||||||
- if (hdr.depth < 1 ||
|
|
||||||
- (hdr.pitch_or_linsize > (file_size - sizeof (hdr))) ||
|
|
||||||
- (((guint64) hdr.height * hdr.width * hdr.depth) > (file_size - sizeof (hdr))))
|
|
||||||
- {
|
|
||||||
- fclose (fp);
|
|
||||||
- g_message ("Invalid or corrupted DDS header\n");
|
|
||||||
- return GIMP_PDB_EXECUTION_ERROR;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
if (hdr.pixelfmt.flags & DDPF_FOURCC)
|
|
||||||
{
|
|
||||||
/* fourcc is dXt* or rXgb */
|
|
||||||
@@ -332,6 +322,15 @@ read_dds (GFile *file,
|
|
||||||
precision = GIMP_PRECISION_U8_NON_LINEAR;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* verify header information is accurate */
|
|
||||||
+ if (d.bpp < 1 ||
|
|
||||||
+ (hdr.pitch_or_linsize > (file_size - sizeof (hdr))))
|
|
||||||
+ {
|
|
||||||
+ fclose (fp);
|
|
||||||
+ g_message ("Invalid or corrupted DDS header\n");
|
|
||||||
+ return GIMP_PDB_EXECUTION_ERROR;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
image = gimp_image_new_with_precision (hdr.width, hdr.height, type, precision);
|
|
||||||
|
|
||||||
if (! image)
|
|
||||||
@@ -1000,6 +999,13 @@ load_layer (FILE *fp,
|
|
||||||
guint size = hdr->pitch_or_linsize >> (2 * level);
|
|
||||||
guint layerw;
|
|
||||||
gint format = DDS_COMPRESS_NONE;
|
|
||||||
+ gsize file_size;
|
|
||||||
+ gsize current_position;
|
|
||||||
+
|
|
||||||
+ current_position = ftell (fp);
|
|
||||||
+ fseek (fp, 0L, SEEK_END);
|
|
||||||
+ file_size = ftell (fp);
|
|
||||||
+ fseek (fp, current_position, SEEK_SET);
|
|
||||||
|
|
||||||
if (width < 1) width = 1;
|
|
||||||
if (height < 1) height = 1;
|
|
||||||
@@ -1097,6 +1103,12 @@ load_layer (FILE *fp,
|
|
||||||
size *= 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (size > (file_size - current_position))
|
|
||||||
+ {
|
|
||||||
+ g_message ("Requested data exceeds size of file.\n");
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if ((hdr->flags & DDSD_LINEARSIZE) &&
|
|
||||||
!fread (buf, size, 1, fp))
|
|
||||||
{
|
|
||||||
@@ -1136,6 +1148,13 @@ load_layer (FILE *fp,
|
|
||||||
gimp_progress_update ((double) y / (double) hdr->height);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ current_position = ftell (fp);
|
|
||||||
+ if ((width * d->bpp) > (file_size - current_position))
|
|
||||||
+ {
|
|
||||||
+ g_message ("Requested data exceeds size of file.\n");
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if ((hdr->flags & DDSD_PITCH) &&
|
|
||||||
! fread (buf, width * d->bpp, 1, fp))
|
|
||||||
{
|
|
||||||
--
|
|
||||||
2.39.3
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
|||||||
From 6d7aa0fd52d4d48e09e3c2fb3fb39b55cd35e0ea Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alx Sa <cmyk.student@gmail.com>
|
|
||||||
Date: Sat, 28 Oct 2023 21:44:51 +0000
|
|
||||||
Subject: [PATCH 3/3] plug-ins: Additional fixes for DDS Import
|
|
||||||
|
|
||||||
@Wormnest noted remaining regressions after 8faad92e.
|
|
||||||
The second fread() only runs if the DDSD_PITCH flag is set,
|
|
||||||
so the error handling check should also be conditional.
|
|
||||||
Additionally, the ZDI-CAN-22093 exploit no longer runs but
|
|
||||||
still could cause a plug-in crash. This patch adds an additional
|
|
||||||
check to ensure the buffer size was within bounds.
|
|
||||||
|
|
||||||
Modified-by: Alex Burmashev <alexander.burmashev@oracle.com>
|
|
||||||
Signed-off-by: Alex Burmashev <alexander.burmashev@oracle.com>
|
|
||||||
---
|
|
||||||
plug-ins/file-dds/ddsread.c | 8 ++++++--
|
|
||||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/plug-ins/file-dds/ddsread.c b/plug-ins/file-dds/ddsread.c
|
|
||||||
index b19d32e..21eeb56 100644
|
|
||||||
--- a/plug-ins/file-dds/ddsread.c
|
|
||||||
+++ b/plug-ins/file-dds/ddsread.c
|
|
||||||
@@ -1005,6 +1005,7 @@ load_layer (FILE *fp,
|
|
||||||
current_position = ftell (fp);
|
|
||||||
fseek (fp, 0L, SEEK_END);
|
|
||||||
file_size = ftell (fp);
|
|
||||||
+ fseek (fp, 0, SEEK_SET);
|
|
||||||
fseek (fp, current_position, SEEK_SET);
|
|
||||||
|
|
||||||
if (width < 1) width = 1;
|
|
||||||
@@ -1103,7 +1104,8 @@ load_layer (FILE *fp,
|
|
||||||
size *= 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (size > (file_size - current_position))
|
|
||||||
+ if (size > (file_size - current_position) ||
|
|
||||||
+ size > hdr->pitch_or_linsize)
|
|
||||||
{
|
|
||||||
g_message ("Requested data exceeds size of file.\n");
|
|
||||||
return 0;
|
|
||||||
@@ -1149,7 +1151,9 @@ load_layer (FILE *fp,
|
|
||||||
}
|
|
||||||
|
|
||||||
current_position = ftell (fp);
|
|
||||||
- if ((width * d->bpp) > (file_size - current_position))
|
|
||||||
+ if ((hdr->flags & DDSD_PITCH) &&
|
|
||||||
+ ((width * d->bpp) > (file_size - current_position) ||
|
|
||||||
+ (width * d->bpp) > hdr->pitch_or_linsize))
|
|
||||||
{
|
|
||||||
g_message ("Requested data exceeds size of file.\n");
|
|
||||||
return 0;
|
|
||||||
--
|
|
||||||
2.39.3
|
|
||||||
|
|
98
SOURCES/gimp-2.10.36-CVE-2023-44441-dds-rce.patch
Normal file
98
SOURCES/gimp-2.10.36-CVE-2023-44441-dds-rce.patch
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
Built out of the following commits from release 2.10.36:
|
||||||
|
- 7db71cd0b6e36c454aa0d2d3efeec7e636db4dbc
|
||||||
|
- e92f279c97282a2b20dca0d923db7465f2057703
|
||||||
|
- 9dda8139e4d07e3a273436eda993fef32555edbe
|
||||||
|
|
||||||
|
Applied onto worktree starting from top to bottom.
|
||||||
|
---
|
||||||
|
plug-ins/file-dds/ddsread.c | 39 +++++++++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 39 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/plug-ins/file-dds/ddsread.c b/plug-ins/file-dds/ddsread.c
|
||||||
|
index 72102d0e1c..ba5b712edd 100644
|
||||||
|
--- a/plug-ins/file-dds/ddsread.c
|
||||||
|
+++ b/plug-ins/file-dds/ddsread.c
|
||||||
|
@@ -124,6 +124,7 @@ read_dds (GFile *file,
|
||||||
|
guint l = 0;
|
||||||
|
guchar *pixels;
|
||||||
|
FILE *fp;
|
||||||
|
+ gsize file_size;
|
||||||
|
dds_header_t hdr;
|
||||||
|
dds_header_dx10_t dx10hdr;
|
||||||
|
dds_load_info_t d;
|
||||||
|
@@ -157,6 +158,10 @@ read_dds (GFile *file,
|
||||||
|
return GIMP_PDB_EXECUTION_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ fseek (fp, 0L, SEEK_END);
|
||||||
|
+ file_size = ftell (fp);
|
||||||
|
+ fseek (fp, 0, SEEK_SET);
|
||||||
|
+
|
||||||
|
gimp_progress_init_printf ("Loading %s:", gimp_file_get_utf8_name (file));
|
||||||
|
|
||||||
|
/* read header */
|
||||||
|
@@ -317,6 +322,16 @@ read_dds (GFile *file,
|
||||||
|
precision = GIMP_PRECISION_U8_NON_LINEAR;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* verify header information is accurate */
|
||||||
|
+ if (hdr.depth < 1 ||
|
||||||
|
+ (hdr.pitch_or_linsize > (file_size - sizeof (hdr))) ||
|
||||||
|
+ (((guint64) hdr.height * hdr.width * hdr.depth) > (file_size - sizeof (hdr))))
|
||||||
|
+ {
|
||||||
|
+ fclose (fp);
|
||||||
|
+ g_message ("Invalid or corrupted DDS header\n");
|
||||||
|
+ return GIMP_PDB_EXECUTION_ERROR;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
image = gimp_image_new_with_precision (hdr.width, hdr.height, type, precision);
|
||||||
|
|
||||||
|
if (! image)
|
||||||
|
@@ -985,6 +1000,14 @@ load_layer (FILE *fp,
|
||||||
|
guint size = hdr->pitch_or_linsize >> (2 * level);
|
||||||
|
guint layerw;
|
||||||
|
gint format = DDS_COMPRESS_NONE;
|
||||||
|
+ gsize file_size;
|
||||||
|
+ gsize current_position;
|
||||||
|
+
|
||||||
|
+ current_position = ftell (fp);
|
||||||
|
+ fseek (fp, 0L, SEEK_END);
|
||||||
|
+ file_size = ftell (fp);
|
||||||
|
+ fseek (fp, 0, SEEK_SET);
|
||||||
|
+ fseek (fp, current_position, SEEK_SET);
|
||||||
|
|
||||||
|
if (width < 1) width = 1;
|
||||||
|
if (height < 1) height = 1;
|
||||||
|
@@ -1082,6 +1105,13 @@ load_layer (FILE *fp,
|
||||||
|
size *= 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (size > (file_size - current_position) ||
|
||||||
|
+ size > hdr->pitch_or_linsize)
|
||||||
|
+ {
|
||||||
|
+ g_message ("Requested data exceeds size of file.\n");
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if ((hdr->flags & DDSD_LINEARSIZE) &&
|
||||||
|
!fread (buf, size, 1, fp))
|
||||||
|
{
|
||||||
|
@@ -1121,6 +1151,15 @@ load_layer (FILE *fp,
|
||||||
|
gimp_progress_update ((double) y / (double) hdr->height);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ current_position = ftell (fp);
|
||||||
|
+ if ((hdr->flags & DDSD_PITCH) &&
|
||||||
|
+ ((width * d->bpp) > (file_size - current_position) ||
|
||||||
|
+ (width * d->bpp) > hdr->pitch_or_linsize))
|
||||||
|
+ {
|
||||||
|
+ g_message ("Requested data exceeds size of file.\n");
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if ((hdr->flags & DDSD_PITCH) &&
|
||||||
|
! fread (buf, width * d->bpp, 1, fp))
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
@ -1,11 +1,4 @@
|
|||||||
From 865cc56894dcb6e1c664a55e4b4010ebf6919e10 Mon Sep 17 00:00:00 2001
|
O-Commit: 865cc56894dcb6e1c664a55e4b4010ebf6919e10
|
||||||
From: Alx Sa <cmyk.student@gmail.com>
|
|
||||||
Date: Fri, 29 Sep 2023 20:38:51 +0000
|
|
||||||
Subject: [PATCH] plug-ins: Fix vulnerability in file-psd
|
|
||||||
|
|
||||||
Resolves #10101.
|
|
||||||
This patch adds a missing break statement after an error condition
|
|
||||||
is detected to prevent the code from continuing afterwards.
|
|
||||||
---
|
---
|
||||||
plug-ins/file-psd/psd-util.c | 1 +
|
plug-ins/file-psd/psd-util.c | 1 +
|
||||||
1 file changed, 1 insertion(+)
|
1 file changed, 1 insertion(+)
|
||||||
@ -23,5 +16,5 @@ index 761865e7af..545bd32f7c 100644
|
|||||||
memset (dst, *src, n);
|
memset (dst, *src, n);
|
||||||
src++;
|
src++;
|
||||||
--
|
--
|
||||||
2.31.1
|
2.43.0
|
||||||
|
|
@ -1,24 +1,13 @@
|
|||||||
From 96f536a33590bb9811da5b5639e1d6c25aaf2e01 Mon Sep 17 00:00:00 2001
|
O-Commit: 9c9521e99dd24a73fe7701bf5bde6dbbd26c4862
|
||||||
From: Alx Sa <cmyk.student@gmail.com>
|
|
||||||
Date: Sat, 23 Sep 2023 02:41:57 +0000
|
|
||||||
Subject: [PATCH] plug-ins: Fix PSP vulnerability (ZDI-CAN-22096)
|
|
||||||
|
|
||||||
Resolves #10072.
|
|
||||||
|
|
||||||
The current PSP palette loading code does not check if
|
|
||||||
the file's palette entry count value is below the limit
|
|
||||||
(G_MAXUNIT32 / 4 due to each color being 4 bytes long).
|
|
||||||
This patch adds this check and stops loading if the count
|
|
||||||
is larger than GIMP currently supports.
|
|
||||||
---
|
---
|
||||||
plug-ins/common/file-psp.c | 11 ++++++++++-
|
plug-ins/common/file-psp.c | 11 ++++++++++-
|
||||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/plug-ins/common/file-psp.c b/plug-ins/common/file-psp.c
|
diff --git a/plug-ins/common/file-psp.c b/plug-ins/common/file-psp.c
|
||||||
index 582a10c300..7c9340ee2b 100644
|
index f891ca1856..6944ad4072 100644
|
||||||
--- a/plug-ins/common/file-psp.c
|
--- a/plug-ins/common/file-psp.c
|
||||||
+++ b/plug-ins/common/file-psp.c
|
+++ b/plug-ins/common/file-psp.c
|
||||||
@@ -1279,8 +1279,17 @@ read_color_block (FILE *f,
|
@@ -1278,8 +1278,17 @@ read_color_block (FILE *f,
|
||||||
}
|
}
|
||||||
|
|
||||||
color_palette_entries = GUINT32_FROM_LE (entry_count);
|
color_palette_entries = GUINT32_FROM_LE (entry_count);
|
||||||
@ -38,5 +27,5 @@ index 582a10c300..7c9340ee2b 100644
|
|||||||
color_palette = g_malloc (pal_size);
|
color_palette = g_malloc (pal_size);
|
||||||
if (fread (color_palette, pal_size, 1, f) < 1)
|
if (fread (color_palette, pal_size, 1, f) < 1)
|
||||||
--
|
--
|
||||||
2.31.1
|
2.43.0
|
||||||
|
|
21
SOURCES/gimp-2.10.36-CVE-2023-44444-psp-rce.patch
Normal file
21
SOURCES/gimp-2.10.36-CVE-2023-44444-psp-rce.patch
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
O-Commit: d52d32cb82905e4ee58d249dcde9e8d47f2b915d
|
||||||
|
---
|
||||||
|
plug-ins/common/file-psp.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/plug-ins/common/file-psp.c b/plug-ins/common/file-psp.c
|
||||||
|
index 6944ad4072..d1156d4732 100644
|
||||||
|
--- a/plug-ins/common/file-psp.c
|
||||||
|
+++ b/plug-ins/common/file-psp.c
|
||||||
|
@@ -1657,7 +1657,7 @@ read_channel_data (FILE *f,
|
||||||
|
else
|
||||||
|
endq = q + line_width * height;
|
||||||
|
|
||||||
|
- buf = g_malloc (127);
|
||||||
|
+ buf = g_malloc (128);
|
||||||
|
while (q < endq)
|
||||||
|
{
|
||||||
|
fread (&runcount, 1, 1, f);
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
From e1bfd87195e4fe60a92df70cde65464d032dd3c1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alx Sa <cmyk.student@gmail.com>
|
|
||||||
Date: Sat, 23 Sep 2023 02:16:24 +0000
|
|
||||||
Subject: [PATCH] plug-ins: Fix PSP vulnerability (ZDI-CAN-22097)
|
|
||||||
|
|
||||||
Resolves #10071.
|
|
||||||
|
|
||||||
When reading RLE compressed data, a buffer was allocated to 127 bytes.
|
|
||||||
However, it can potentially be used to read 128 bytes, leading to a
|
|
||||||
off-by-one vulnerability. This patch allocates 128 bytes to the buffer
|
|
||||||
to prevent this from occurring.
|
|
||||||
---
|
|
||||||
plug-ins/common/file-psp.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/plug-ins/common/file-psp.c b/plug-ins/common/file-psp.c
|
|
||||||
index c8b166471e..582a10c300 100644
|
|
||||||
--- a/plug-ins/common/file-psp.c
|
|
||||||
+++ b/plug-ins/common/file-psp.c
|
|
||||||
@@ -1649,7 +1649,7 @@ read_channel_data (FILE *f,
|
|
||||||
else
|
|
||||||
endq = q + line_width * height;
|
|
||||||
|
|
||||||
- buf = g_malloc (127);
|
|
||||||
+ buf = g_malloc (128);
|
|
||||||
while (q < endq)
|
|
||||||
{
|
|
||||||
fread (&runcount, 1, 1, f);
|
|
||||||
--
|
|
||||||
2.31.1
|
|
||||||
|
|
159
SOURCES/gimp-CVE-2025-48797.patch
Normal file
159
SOURCES/gimp-CVE-2025-48797.patch
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
diff --git a/plug-ins/common/file-tga.c b/plug-ins/common/file-tga.c
|
||||||
|
index f6f24a13194..c0d7ad94c20 100644
|
||||||
|
--- a/plug-ins/common/file-tga.c
|
||||||
|
+++ b/plug-ins/common/file-tga.c
|
||||||
|
@@ -982,9 +982,9 @@ ReadImage (FILE *fp,
|
||||||
|
cmap_bytes = (info->colorMapSize + 7 ) / 8;
|
||||||
|
tga_cmap = g_new (guchar, info->colorMapLength * cmap_bytes);
|
||||||
|
|
||||||
|
- if (info->colorMapSize > 24)
|
||||||
|
+ if (info->colorMapSize > 24 || info->alphaBits > 0)
|
||||||
|
{
|
||||||
|
- /* indexed + full alpha => promoted to RGBA */
|
||||||
|
+ /* indexed + full alpha, or alpha exists => promoted to RGBA */
|
||||||
|
itype = GIMP_RGB;
|
||||||
|
dtype = GIMP_RGBA_IMAGE;
|
||||||
|
convert_cmap = g_new (guchar, info->colorMapLength * 4);
|
||||||
|
@@ -996,13 +996,6 @@ ReadImage (FILE *fp,
|
||||||
|
dtype = GIMP_RGB_IMAGE;
|
||||||
|
convert_cmap = g_new (guchar, info->colorMapLength * 3);
|
||||||
|
}
|
||||||
|
- else if (info->alphaBits > 0)
|
||||||
|
- {
|
||||||
|
- /* if alpha exists here, promote to RGB */
|
||||||
|
- itype = GIMP_RGB;
|
||||||
|
- dtype = GIMP_RGBA_IMAGE;
|
||||||
|
- convert_cmap = g_new (guchar, info->colorMapLength * 4);
|
||||||
|
- }
|
||||||
|
else
|
||||||
|
{
|
||||||
|
itype = GIMP_INDEXED;
|
||||||
|
---
|
||||||
|
diff --git a/plug-ins/common/file-tga.c b/plug-ins/common/file-tga.c
|
||||||
|
index c0d7ad94c20..433410ff471 100644
|
||||||
|
--- a/plug-ins/common/file-tga.c
|
||||||
|
+++ b/plug-ins/common/file-tga.c
|
||||||
|
@@ -539,7 +539,7 @@ load_image (GFile *file,
|
||||||
|
switch (info.imageType)
|
||||||
|
{
|
||||||
|
case TGA_TYPE_MAPPED:
|
||||||
|
- if (info.bpp != 8)
|
||||||
|
+ if (info.bpp != 8 || !info.colorMapLength)
|
||||||
|
{
|
||||||
|
g_message ("Unhandled sub-format in '%s' (type = %u, bpp = %u)",
|
||||||
|
gimp_file_get_utf8_name (file),
|
||||||
|
@@ -862,32 +862,31 @@ apply_colormap (guchar *dest,
|
||||||
|
guint width,
|
||||||
|
const guchar *cmap,
|
||||||
|
gboolean alpha,
|
||||||
|
- guint16 index)
|
||||||
|
+ guint16 colorMapIndex,
|
||||||
|
+ guint16 colorMapLength)
|
||||||
|
{
|
||||||
|
guint x;
|
||||||
|
|
||||||
|
- if (alpha)
|
||||||
|
- {
|
||||||
|
- for (x = 0; x < width; x++)
|
||||||
|
- {
|
||||||
|
- *(dest++) = cmap[(*src - index) * 4];
|
||||||
|
- *(dest++) = cmap[(*src - index) * 4 + 1];
|
||||||
|
- *(dest++) = cmap[(*src - index) * 4 + 2];
|
||||||
|
- *(dest++) = cmap[(*src - index) * 4 + 3];
|
||||||
|
-
|
||||||
|
- src++;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
+ for (x = 0; x < width; x++)
|
||||||
|
{
|
||||||
|
- for (x = 0; x < width; x++)
|
||||||
|
- {
|
||||||
|
- *(dest++) = cmap[(*src - index) * 3];
|
||||||
|
- *(dest++) = cmap[(*src - index) * 3 + 1];
|
||||||
|
- *(dest++) = cmap[(*src - index) * 3 + 2];
|
||||||
|
-
|
||||||
|
- src++;
|
||||||
|
- }
|
||||||
|
+ guchar entryIndex = src[x] - colorMapIndex;
|
||||||
|
+
|
||||||
|
+ if (src[x] < colorMapIndex || entryIndex >= colorMapLength) {
|
||||||
|
+ g_message ("Unsupported colormap entry: %u",
|
||||||
|
+ src[x]);
|
||||||
|
+ entryIndex = 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (alpha) {
|
||||||
|
+ *(dest++) = cmap[entryIndex * 4];
|
||||||
|
+ *(dest++) = cmap[entryIndex * 4 + 1];
|
||||||
|
+ *(dest++) = cmap[entryIndex * 4 + 2];
|
||||||
|
+ *(dest++) = cmap[entryIndex * 4 + 3];
|
||||||
|
+ } else {
|
||||||
|
+ *(dest++) = cmap[entryIndex * 3];
|
||||||
|
+ *(dest++) = cmap[entryIndex * 3 + 1];
|
||||||
|
+ *(dest++) = cmap[entryIndex * 3 + 2];
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -943,7 +942,7 @@ read_line (FILE *fp,
|
||||||
|
gboolean has_alpha = (info->alphaBits > 0);
|
||||||
|
|
||||||
|
apply_colormap (row, buf, info->width, convert_cmap, has_alpha,
|
||||||
|
- info->colorMapIndex);
|
||||||
|
+ info->colorMapIndex, info->colorMapLength);
|
||||||
|
}
|
||||||
|
else if (info->imageType == TGA_TYPE_MAPPED)
|
||||||
|
{
|
||||||
|
---
|
||||||
|
diff --git a/plug-ins/common/file-tga.c b/plug-ins/common/file-tga.c
|
||||||
|
index 433410ff471..a171a264772 100644
|
||||||
|
--- a/plug-ins/common/file-tga.c
|
||||||
|
+++ b/plug-ins/common/file-tga.c
|
||||||
|
@@ -952,7 +952,7 @@ read_line (FILE *fp,
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
- memcpy (row, buf, info->width * bpp);
|
||||||
|
+ memcpy (row, buf, info->width * info->bytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
---
|
||||||
|
diff --git a/plug-ins/common/file-tga.c b/plug-ins/common/file-tga.c
|
||||||
|
index a171a264772..abecde86857 100644
|
||||||
|
--- a/plug-ins/common/file-tga.c
|
||||||
|
+++ b/plug-ins/common/file-tga.c
|
||||||
|
@@ -866,14 +866,29 @@ apply_colormap (guchar *dest,
|
||||||
|
guint16 colorMapLength)
|
||||||
|
{
|
||||||
|
guint x;
|
||||||
|
+ gint errcnt = 0;
|
||||||
|
|
||||||
|
for (x = 0; x < width; x++)
|
||||||
|
{
|
||||||
|
guchar entryIndex = src[x] - colorMapIndex;
|
||||||
|
|
||||||
|
if (src[x] < colorMapIndex || entryIndex >= colorMapLength) {
|
||||||
|
- g_message ("Unsupported colormap entry: %u",
|
||||||
|
- src[x]);
|
||||||
|
+ /* On Windows the error console can run out of resources when
|
||||||
|
+ * producing a huge amount of messages. This can happen when using
|
||||||
|
+ * fuzzed test images. This causes unresponsiveness at first and
|
||||||
|
+ * finally crashes GIMP. Eventually this needs to be fixed at the
|
||||||
|
+ * source, but for now let's limit the error messages to 10
|
||||||
|
+ * per line (this function is called once per read_line). */
|
||||||
|
+ if (errcnt < 10)
|
||||||
|
+ {
|
||||||
|
+ g_message ("Unsupported colormap entry: %u",
|
||||||
|
+ src[x]);
|
||||||
|
+ }
|
||||||
|
+ else if (errcnt == 10)
|
||||||
|
+ {
|
||||||
|
+ g_message ("Too many colormap errors. Image may be corrupt.");
|
||||||
|
+ }
|
||||||
|
+ errcnt++;
|
||||||
|
entryIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
---
|
93
SOURCES/gimp-CVE-2025-48798.patch
Normal file
93
SOURCES/gimp-CVE-2025-48798.patch
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
diff -urNp a/app/xcf/xcf-load.c b/app/xcf/xcf-load.c
|
||||||
|
--- a/app/xcf/xcf-load.c 2025-06-14 13:08:43.443446885 +0200
|
||||||
|
+++ b/app/xcf/xcf-load.c 2025-06-14 13:22:09.771911460 +0200
|
||||||
|
@@ -102,7 +102,8 @@ static gboolean xcf_check_layer_p
|
||||||
|
gboolean *is_text_layer);
|
||||||
|
static gboolean xcf_load_channel_props (XcfInfo *info,
|
||||||
|
GimpImage *image,
|
||||||
|
- GimpChannel **channel);
|
||||||
|
+ GimpChannel **channel,
|
||||||
|
+ gboolean is_mask);
|
||||||
|
static gboolean xcf_load_prop (XcfInfo *info,
|
||||||
|
PropType *prop_type,
|
||||||
|
guint32 *prop_size);
|
||||||
|
@@ -1213,6 +1214,14 @@ xcf_load_layer_props (XcfInfo *info,
|
||||||
|
|
||||||
|
case PROP_ACTIVE_LAYER:
|
||||||
|
info->selected_layers = g_list_prepend (info->selected_layers, *layer);
|
||||||
|
+ {
|
||||||
|
+ if (g_list_index (info->selected_layers, *layer) < 0)
|
||||||
|
+ info->selected_layers = g_list_prepend (info->selected_layers, *layer);
|
||||||
|
+ else
|
||||||
|
+ gimp_message_literal (info->gimp, G_OBJECT (info->progress),
|
||||||
|
+ GIMP_MESSAGE_WARNING,
|
||||||
|
+ "Invalid duplicate selected layer detected");
|
||||||
|
+ }
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PROP_FLOATING_SELECTION:
|
||||||
|
@@ -1663,7 +1672,8 @@ xcf_check_layer_props (XcfInfo *info,
|
||||||
|
static gboolean
|
||||||
|
xcf_load_channel_props (XcfInfo *info,
|
||||||
|
GimpImage *image,
|
||||||
|
- GimpChannel **channel)
|
||||||
|
+ GimpChannel **channel,
|
||||||
|
+ gboolean is_mask)
|
||||||
|
{
|
||||||
|
PropType prop_type;
|
||||||
|
guint32 prop_size;
|
||||||
|
@@ -1686,6 +1696,36 @@ xcf_load_channel_props (XcfInfo *in
|
||||||
|
{
|
||||||
|
GimpChannel *mask;
|
||||||
|
|
||||||
|
+ if (is_mask)
|
||||||
|
+ {
|
||||||
|
+ /* PROP_SELECTION is not valid for masks, and we have to avoid
|
||||||
|
+ * overwriting the channel.
|
||||||
|
+ */
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (*channel == gimp_image_get_mask (image))
|
||||||
|
+ {
|
||||||
|
+ /* PROP_SELECTION was already seen once for this
|
||||||
|
+ * channel. Let's silently ignore the second identical
|
||||||
|
+ * property to avoid a double free.
|
||||||
|
+ */
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ else if (gimp_image_get_mask (image) != NULL &&
|
||||||
|
+ ! gimp_channel_is_empty (gimp_image_get_mask (image)))
|
||||||
|
+ {
|
||||||
|
+ /* This would happen when PROP_SELECTION was already set
|
||||||
|
+ * on a previous channel. This is a minor case of data
|
||||||
|
+ * loss (we don't know which selection was the right one
|
||||||
|
+ * and we drop the non-first ones), and also means it's
|
||||||
|
+ * a broken XCF, though it's not a major bug either. So
|
||||||
|
+ * let's go with a stderr print.
|
||||||
|
+ */
|
||||||
|
+ g_printerr ("PROP_SELECTION property was set on 2 channels (skipping)\n");
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* We're going to delete *channel, Don't leave its pointer
|
||||||
|
* in @info. See bug #767873.
|
||||||
|
*/
|
||||||
|
@@ -2155,7 +2195,7 @@ xcf_load_channel (XcfInfo *info,
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* read in the channel properties */
|
||||||
|
- if (! xcf_load_channel_props (info, image, &channel))
|
||||||
|
+ if (! xcf_load_channel_props (info, image, &channel, FALSE))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
xcf_progress_update (info);
|
||||||
|
@@ -2228,7 +2268,7 @@ xcf_load_layer_mask (XcfInfo *info,
|
||||||
|
|
||||||
|
/* read in the layer_mask properties */
|
||||||
|
channel = GIMP_CHANNEL (layer_mask);
|
||||||
|
- if (! xcf_load_channel_props (info, image, &channel))
|
||||||
|
+ if (! xcf_load_channel_props (info, image, &channel, TRUE))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
xcf_progress_update (info);
|
18
SOURCES/gimp-CVE-2025-5473.patch
Normal file
18
SOURCES/gimp-CVE-2025-5473.patch
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
diff --git a/plug-ins/file-ico/ico-load.c b/plug-ins/file-ico/ico-load.c
|
||||||
|
index 9a222998bc1..818cf23cd31 100644
|
||||||
|
--- a/plug-ins/file-ico/ico-load.c
|
||||||
|
+++ b/plug-ins/file-ico/ico-load.c
|
||||||
|
@@ -299,7 +299,11 @@ ico_read_png (FILE *fp,
|
||||||
|
png_read_info (png_ptr, info);
|
||||||
|
png_get_IHDR (png_ptr, info, &w, &h, &bit_depth, &color_type,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
- if (w*h*4 > maxsize)
|
||||||
|
+ /* Check for overflow */
|
||||||
|
+ if ((w * h * 4) < w ||
|
||||||
|
+ (w * h * 4) < h ||
|
||||||
|
+ (w * h * 4) < (w * h) ||
|
||||||
|
+ (w * h * 4) > maxsize)
|
||||||
|
{
|
||||||
|
png_destroy_read_struct (&png_ptr, &info, NULL);
|
||||||
|
return FALSE;
|
||||||
|
---
|
@ -89,7 +89,7 @@ Name: gimp
|
|||||||
Epoch: 2
|
Epoch: 2
|
||||||
Version: 2.99.8
|
Version: 2.99.8
|
||||||
%global rel 4
|
%global rel 4
|
||||||
Release: %{?prerelprefix}%{rel}%{dotprerel}%{dotgitrev}%{?dist}
|
Release: %{?prerelprefix}%{rel}%{dotprerel}%{dotgitrev}%{?dist}.2
|
||||||
|
|
||||||
# Compute some version related macros.
|
# Compute some version related macros.
|
||||||
# Ugly, need to get quoting percent signs straight.
|
# Ugly, need to get quoting percent signs straight.
|
||||||
@ -249,13 +249,26 @@ Patch5: gimp-CVE-2022-30067.patch
|
|||||||
# CVE-2022-32990
|
# CVE-2022-32990
|
||||||
Patch6: gimp-CVE-2022-32990.patch
|
Patch6: gimp-CVE-2022-32990.patch
|
||||||
|
|
||||||
# CVE-2023-44441 CVE-2023-44442 CVE-2023-44443 CVE-2023-44444
|
# RHEL-86049: dds buffer overflow RCE
|
||||||
Patch7: gimp-2.10.36-CVE-2023-44441-0001-plug-ins-Fix-DDS-vulnerability-ZDI-CAN-22093.patch
|
Patch7: gimp-2.10.36-CVE-2023-44441-dds-rce.patch
|
||||||
Patch8: gimp-2.10.36-CVE-2023-44441-0002-plug-ins-Fix-DDS-import-regression-from-7db71cd0.patch
|
|
||||||
Patch9: gimp-2.10.36-CVE-2023-44441-0003-plug-ins-Additional-fixes-for-DDS-Import.patch
|
# RHEL-86046: psd buffer overflow RCE
|
||||||
Patch10: gimp-CVE-2023-44442.patch
|
Patch8: gimp-2.10.36-CVE-2023-44442-psd-rce.patch
|
||||||
Patch11: gimp-CVE-2023-44443.patch
|
|
||||||
Patch12: gimp-CVE-2023-44444.patch
|
# RHEL-86043: psp buffer overflow RCE
|
||||||
|
Patch9: gimp-2.10.36-CVE-2023-44443-psp-rce.patch
|
||||||
|
|
||||||
|
# RHEL-86040: psp buffer overflow RCE
|
||||||
|
Patch10: gimp-2.10.36-CVE-2023-44444-psp-rce.patch
|
||||||
|
|
||||||
|
# RHEL-93521: CVE-2025-48797
|
||||||
|
Patch11: gimp-CVE-2025-48797.patch
|
||||||
|
|
||||||
|
# RHEL-93522: CVE-2025-48798
|
||||||
|
Patch12: gimp-CVE-2025-48798.patch
|
||||||
|
|
||||||
|
# RHEL-95700: CVE-2025-5473
|
||||||
|
Patch13: gimp-CVE-2025-5473.patch
|
||||||
|
|
||||||
# use external help browser directly if help browser plug-in is not built
|
# use external help browser directly if help browser plug-in is not built
|
||||||
Patch100: gimp-2.10.24-external-help-browser.patch
|
Patch100: gimp-2.10.24-external-help-browser.patch
|
||||||
@ -362,15 +375,16 @@ EOF
|
|||||||
%patch4 -p1 -b .remove-lua
|
%patch4 -p1 -b .remove-lua
|
||||||
%patch5 -p1 -b .CVE-2022-30067
|
%patch5 -p1 -b .CVE-2022-30067
|
||||||
%patch6 -p1 -b .CVE-2022-32990
|
%patch6 -p1 -b .CVE-2022-32990
|
||||||
%patch7 -p1 -b .CVE-2023-44441-1
|
%patch7 -p1 -b .dds-rce
|
||||||
%patch8 -p1 -b .CVE-2023-44441-2
|
%patch8 -p1 -b .psd-rce
|
||||||
%patch9 -p1 -b .CVE-2023-44441-3
|
%patch9 -p1 -b .psp-rce1
|
||||||
%patch10 -p1 -b .CVE-2023-44442
|
%patch10 -p1 -b .psp-rce2
|
||||||
%patch11 -p1 -b .CVE-2023-44443
|
%patch11 -p1 -b .CVE-2025-48797
|
||||||
%patch12 -p1 -b .CVE-2023-44444
|
%patch12 -p1 -b .CVE-2025-48798
|
||||||
|
%patch13 -p1 -b .CVE-2025-5473
|
||||||
|
|
||||||
%if ! %{with helpbrowser}
|
%if ! %{with helpbrowser}
|
||||||
#%patch100 -p1 -b .external-help-browser
|
#patch100 -p1 -b .external-help-browser
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%build
|
%build
|
||||||
@ -750,11 +764,17 @@ make check %{?_smp_mflags}
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Mon Feb 05 2024 Darren Archibald <darren.archibald@oracle.com> - 2:2.99.8-4
|
* Sat Jun 14 2025 Josef Ridky <jridky@redhat.com> - 2:2.99.8-4.2
|
||||||
- fix CVE-2023-44441
|
- fix CVE-2025-5473 (RHEL-95700)
|
||||||
- fix CVE-2023-44442
|
|
||||||
- fix CVE-2023-44443
|
* Sat Jun 14 2025 Josef Ridky <jridky@redhat.com> - 2:2.99.8-4.1
|
||||||
- fix CVE-2023-44444
|
- fix CVE-2025-48797 (RHEL-93521)
|
||||||
|
- fix CVE-2025-48798 (RHEL-93522)
|
||||||
|
|
||||||
|
* Wed Apr 09 2025 Josef Ridky <jridky@redhat.com> - 2:2.99.8-4
|
||||||
|
- Applying fixes for vulnerabilities that led to possible RCE conditions.
|
||||||
|
- Fixes: CVE-2023-44441 CVE-2023-44442 CVE-2023-44443 CVE-2023-44444
|
||||||
|
- Resolves: RHEL-86049 RHEL-86046 RHEL-86043 RHEL-86040
|
||||||
|
|
||||||
* Mon Jul 18 2022 Josef Ridky <jridky@redhat.com> - 2:2.99.8-3
|
* Mon Jul 18 2022 Josef Ridky <jridky@redhat.com> - 2:2.99.8-3
|
||||||
- fix CVE-2022-30067
|
- fix CVE-2022-30067
|
||||||
|
Loading…
Reference in New Issue
Block a user