Package: libimlib2t64
Version: 1.12.5-1
Severity: normal
Tags: patch
Dear Maintainer,
The imlib2-1.12.5 packages contain an integer overflow bug in the
_DrawGradient
function. This bug has been fix in the upstream git repository, but
imlib2-1.12.6 has not been released yet. In the meantime, the attached
patches (extracted directly from the master repository at
https://git.enlightenment.org/old/legacy-imlib2) should be applied to
the imlib2-1.12.5 source.
Please note that "gradient-fix.patch" must be applied before
"gradient-stretch.patch".
This fix improves the functionality of the hsetroot utility on
high-resolution
(QHD and higher) monitors.
Brian Lindholm
-- System Information:
Debian Release: forky/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: amd64 (x86_64)
Kernel: Linux 6.17.12-t8 (SMP w/16 CPU threads)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE
not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
Versions of packages libimlib2t64 depends on:
ii libbz2-1.0 1.0.8-6
ii libc6 2.42-5
ii libcairo2 1.18.4-1+b1
ii libfreetype6 2.13.3+dfsg-1
ii libgif7 5.2.2-1+b1
ii libglib2.0-0t64 2.86.3-1
ii libheif1 1.20.2-2+b4
ii libid3tag0 0.16.3-2
ii libjpeg62-turbo 1:2.1.5-4
ii libjxl0.11 0.11.1-6
ii liblzma5 5.8.1-2
ii libopenjp2-7 2.5.3-2.1
ii libpng16-16t64 1.6.53-1
ii librsvg2-2 2.61.3+dfsg-2
ii libspectre1 0.2.12-1+b2
ii libtiff6 4.7.1-1
ii libwebpdemux2 1.5.0-0.1
ii libx11-6 2:1.8.12-1
ii libx11-xcb1 2:1.8.12-1
ii libxcb-shm0 1.17.0-2+b1
ii libxcb1 1.17.0-2+b1
ii libxext6 2:1.3.4-1+b3
ii zlib1g 1:1.3.dfsg+really1.3.1-1+b2
libimlib2t64 recommends no packages.
libimlib2t64 suggests no packages.
-- no debconf information
From c30f8528585f86fa0dfe68f391251e23187d662a Mon Sep 17 00:00:00 2001
From: Kim Woelders <[email protected]>
Date: Wed, 3 Dec 2025 18:38:07 +0100
Subject: [PATCH] gradients: Fix rendering of gradients in larger images
The color table was generated incorrectly due to integer overflows.
Patch by Brian Lindholm (tweaked).
---
src/lib/grad.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/lib/grad.c b/src/lib/grad.c
index d7b0efa..5afd08f 100644
--- a/src/lib/grad.c
+++ b/src/lib/grad.c
@@ -319,22 +319,22 @@ _DrawGradient(ImlibImage *im, int x, int y, int w, int h,
if (xx < 0)
{
for (i = 0; i < ww; i++)
- hlut[i] = (-xx * (ww - 1 - i) * len) / divw;
+ hlut[i] = (-xx * (ww - 1 - i) * (uint64_t) len) / divw;
}
else
{
for (i = 0; i < ww; i++)
- hlut[i] = (xx * i * len) / divw;
+ hlut[i] = (xx * i * (uint64_t) len) / divw;
}
if (yy < 0)
{
for (i = 0; i < hh; i++)
- vlut[i] = (-yy * (hh - 1 - i) * len) / divh;
+ vlut[i] = (-yy * (hh - 1 - i) * (uint64_t) len) / divh;
}
else
{
for (i = 0; i < hh; i++)
- vlut[i] = (yy * i * len) / divh;
+ vlut[i] = (yy * i * (uint64_t) len) / divh;
}
jump = im->w - w;
From 1e92ccf562de6b26c9dc4713a6b91b8adf666978 Mon Sep 17 00:00:00 2001
From: Kim Woelders <[email protected]>
Date: Mon, 8 Dec 2025 19:39:07 +0100
Subject: [PATCH] gradients: Better gradients with angles
Strech to get full range.
Based on patch by Brian Lindholm.
Also dropping some now unnecessary casts.
---
src/lib/grad.c | 53 +++++++++++++++++++++-----------------------------
1 file changed, 22 insertions(+), 31 deletions(-)
diff --git a/src/lib/grad.c b/src/lib/grad.c
index 5afd08f..f927382 100644
--- a/src/lib/grad.c
+++ b/src/lib/grad.c
@@ -243,9 +243,10 @@ _DrawGradient(ImlibImage *im, int x, int y, int w, int h,
int clx, int cly, int clw, int clh, ImlibRangeMapFunc *rmf)
{
uint32_t *map, *p;
- int *hlut, *vlut, len;
+ int *hlut, *vlut;
+ uint64_t len, ll;
int xx, yy, xoff, yoff, ww, hh, jump;
- int tmp, i, divw, divh;
+ int tmp, i, divw, divh, maxlut;
uint8_t r, g, b, a;
xoff = yoff = 0;
@@ -316,25 +317,30 @@ _DrawGradient(ImlibImage *im, int x, int y, int w, int h,
divw = 1;
if (divh < 1)
divh = 1;
+
if (xx < 0)
{
for (i = 0; i < ww; i++)
- hlut[i] = (-xx * (ww - 1 - i) * (uint64_t) len) / divw;
+ hlut[i] = (-xx * (ww - 1 - i) * len) / divw;
+ maxlut = hlut[0];
}
else
{
for (i = 0; i < ww; i++)
- hlut[i] = (xx * i * (uint64_t) len) / divw;
+ hlut[i] = (xx * i * len) / divw;
+ maxlut = hlut[ww - 1];
}
if (yy < 0)
{
for (i = 0; i < hh; i++)
- vlut[i] = (-yy * (hh - 1 - i) * (uint64_t) len) / divh;
+ vlut[i] = (-yy * (hh - 1 - i) * len) / divh;
+ maxlut += vlut[0];
}
else
{
for (i = 0; i < hh; i++)
- vlut[i] = (yy * i * (uint64_t) len) / divh;
+ vlut[i] = (yy * i * len) / divh;
+ maxlut += vlut[hh - 1];
}
jump = im->w - w;
@@ -349,11 +355,8 @@ _DrawGradient(ImlibImage *im, int x, int y, int w, int h,
{
for (xx = 0; xx < w; xx++)
{
- i = vlut[yoff + yy] + hlut[xoff + xx];
- if (i < 0)
- i = 0;
- else if (i >= len)
- i = len - 1;
+ ll = len * (vlut[yoff + yy] + hlut[xoff + xx]);
+ i = (ll > 0) ? (ll - 1) / maxlut : 0;
ARGB_TO_R_G_B_A(map[i], r, g, b, a);
BLEND_DST_ALPHA(r, g, b, a, p);
p++;
@@ -367,11 +370,8 @@ _DrawGradient(ImlibImage *im, int x, int y, int w, int h,
{
for (xx = 0; xx < w; xx++)
{
- i = vlut[yoff + yy] + hlut[xoff + xx];
- if (i < 0)
- i = 0;
- else if (i >= len)
- i = len - 1;
+ ll = len * (vlut[yoff + yy] + hlut[xoff + xx]);
+ i = (ll > 0) ? (ll - 1) / maxlut : 0;
ARGB_TO_R_G_B_A(map[i], r, g, b, a);
BLEND(r, g, b, a, p);
p++;
@@ -385,11 +385,8 @@ _DrawGradient(ImlibImage *im, int x, int y, int w, int h,
{
for (xx = 0; xx < w; xx++)
{
- i = vlut[yoff + yy] + hlut[xoff + xx];
- if (i < 0)
- i = 0;
- else if (i >= len)
- i = len - 1;
+ ll = len * (vlut[yoff + yy] + hlut[xoff + xx]);
+ i = (ll > 0) ? (ll - 1) / maxlut : 0;
ARGB_TO_R_G_B_A(map[i], r, g, b, a);
BLEND_SUB(r, g, b, a, p);
p++;
@@ -402,11 +399,8 @@ _DrawGradient(ImlibImage *im, int x, int y, int w, int h,
{
for (xx = 0; xx < w; xx++)
{
- i = vlut[yoff + yy] + hlut[xoff + xx];
- if (i < 0)
- i = 0;
- else if (i >= len)
- i = len - 1;
+ ll = len * (vlut[yoff + yy] + hlut[xoff + xx]);
+ i = (ll > 0) ? (ll - 1) / maxlut : 0;
ARGB_TO_R_G_B_A(map[i], r, g, b, a);
BLEND_SUB(r, g, b, a, p);
p++;
@@ -419,11 +413,8 @@ _DrawGradient(ImlibImage *im, int x, int y, int w, int h,
{
for (xx = 0; xx < w; xx++)
{
- i = vlut[yoff + yy] + hlut[xoff + xx];
- if (i < 0)
- i = 0;
- else if (i >= len)
- i = len - 1;
+ ll = len * (vlut[yoff + yy] + hlut[xoff + xx]);
+ i = (ll > 0) ? (ll - 1) / maxlut : 0;
ARGB_TO_R_G_B_A(map[i], r, g, b, a);
BLEND_RE(r, g, b, a, p);
p++;