Source: imlib2
Severity: normal

Dear Maintainer,

rendering an imlib image to a X11 window while simultaneously scaling it, causes
a crash when the image width is > 32768 (or 32767 or so).

The bug originally appeared when using feh to view a wide PNG image in
fullscreen (causing it to be downsampled while rendering).

The (apparent) cause of the crash is the __imlib_CalcXPoints calculating
offsets (into image data I think) incorrectly. For not-so-wide images, all
offsets are positive, which makes sense. For wider images, all but the first
offsets are negative, which subsequently causes out-of-bounds memory accesses
and a crash.

I guess this is because the calculations happen with int = 32 bit (even on
amd64). Several intermediate calculations shift left by 16 -> sign bit flips
for > 32768 -> calculated offset becomes negative. (The resulting value is
right shifted by 16 later again, but then of course it is still negative).

A first quick fix that doesn't appear to completely fall apart is attached.
It appears to fix the problem, however I am not sure if there are other parts
that should also use 64 bit numbers.

-- System Information:
Debian Release: 8.0
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.12-1-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: sysvinit (via /sbin/init)
--- a/src/lib/scale.c	2013-12-22 05:20:31.000000000 +0100
+++ b/src/lib/scale.c	2015-04-24 20:29:59.623533552 +0200
@@ -112,7 +112,7 @@
    if (dw > (b1 + b2))
      {
         val = (b1 << 16);
-        inc = ((sw - b1 - b2) << 16) / (dw - b1 - b2);
+        inc = ((long long)(sw - b1 - b2) << 16) / (dw - b1 - b2);
         for (i = 0; i < (dw - b1 - b2); i++)
           {
              p[j++] = (val >> 16);

Reply via email to