Fix bilinear filter computation in wide pipeline

pixman 0.38.x has a regression that causes incorrect rendering in some
circumstances. This can be triggered by the use of cairo with
CAIRO_OPERATOR_SATURATE and subpixel positioning, and causes OpenSlide
to produce incorrect output.

This patch is a cherry-pick of [1], rebasing it on top of `c8s`.

It backports commit 8256c235d9b3 ("Fix bilinear filter computation in
wide pipeline") [2] from pixman 0.40.0 to fix the mentioned regression.

At the moment of writing this, pixman's version is:

 - Fedora: 0.42.2
 - CentOS Stream 9: 0.40.0
 - CentOS Stream 8: 0.38.4

Therefore, CentOS Stream 8 needs to be patched.

A reproducer can be found in the original bug report [3].

[1] https://gitlab.com/redhat/centos-stream/rpms/pixman/-/merge_requests/2
[2] 8256c235d9
[3] https://bugzilla.redhat.com/show_bug.cgi?id=2124013
Resolves: https://issues.redhat.com/browse/RHEL-3061
This commit is contained in:
Benjamin Gilbert 2022-09-03 19:02:16 -04:00 committed by José Expósito
parent 58f4a3a987
commit aae78bea47
2 changed files with 89 additions and 1 deletions

View File

@ -0,0 +1,84 @@
From 8256c235d9b3854d039242356905eca854a890ba Mon Sep 17 00:00:00 2001
From: Basile Clement <basile-pixman@clement.pm>
Date: Tue, 9 Apr 2019 23:16:13 +0200
Subject: [PATCH] Fix bilinear filter computation in wide pipeline
The recently introduced wide pipeline for filters has a typo which
causes it to improperly compute bilinear interpolation positions,
causing various glitches when enabled.
This patch uses the proper computation for bilinear interpolation in the
wide pipeline. It also makes related `if` statements conformant to the
CODING_STYLE:
* If a substatement spans multiple lines, then there must be braces
around it.
* If one substatement of an if statement has braces, then the other
must too.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
---
pixman/pixman-bits-image.c | 9 +++++++++
pixman/pixman-inlines.h | 2 +-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/pixman/pixman-bits-image.c b/pixman/pixman-bits-image.c
index 564789e..7bc2ba8 100644
--- a/pixman/pixman-bits-image.c
+++ b/pixman/pixman-bits-image.c
@@ -432,29 +432,38 @@ bits_image_fetch_pixel_filtered (bits_image_t *image,
case PIXMAN_FILTER_CONVOLUTION:
if (wide)
+ {
bits_image_fetch_pixel_convolution (image, x, y,
get_pixel, out,
accum_float,
reduce_float);
+ }
else
+ {
bits_image_fetch_pixel_convolution (image, x, y,
get_pixel, out,
accum_32, reduce_32);
+ }
break;
case PIXMAN_FILTER_SEPARABLE_CONVOLUTION:
if (wide)
+ {
bits_image_fetch_pixel_separable_convolution (image, x, y,
get_pixel, out,
accum_float,
reduce_float);
+ }
else
+ {
bits_image_fetch_pixel_separable_convolution (image, x, y,
get_pixel, out,
accum_32, reduce_32);
+ }
break;
default:
+ assert (0);
break;
}
}
diff --git a/pixman/pixman-inlines.h b/pixman/pixman-inlines.h
index 332e208..f785910 100644
--- a/pixman/pixman-inlines.h
+++ b/pixman/pixman-inlines.h
@@ -231,7 +231,7 @@ bilinear_interpolation_float (argb_t tl, argb_t tr,
argb_t r;
distxy = distx * disty;
- distxiy = distx - (1.f - distxy);
+ distxiy = distx * (1.f - disty);
distixy = (1.f - distx) * disty;
distixiy = (1.f - distx) * (1.f - disty);
--
2.37.1

View File

@ -3,7 +3,7 @@
Name: pixman
Version: 0.38.4
Release: 2%{?dist}
Release: 3%{?dist}
Summary: Pixel manipulation library
Group: System Environment/Libraries
@ -17,6 +17,7 @@ Source0: https://xorg.freedesktop.org/archive/individual/lib/%{name}-%{ve
Source1: make-pixman-snapshot.sh
Patch0: 0001-Initialize-temporary-buffers-in-general_composite_re.patch
Patch1: 0001-Fix-bilinear-filter-computation-in-wide-pipeline.patch
BuildRequires: automake autoconf libtool
BuildRequires: gcc
@ -68,6 +69,9 @@ make check %{?_smp_mflags} V=1
%{_libdir}/pkgconfig/pixman-1.pc
%changelog
* Sat Sep 03 2022 Benjamin Gilbert <bgilbert@backtick.net> - 0.38.4-3
- Fix bilinear filter computation in wide pipeline
* Tue Feb 22 2022 Adam Jackson <ajax@redhat.com> - 0.38.4-2
- Backport the pixman part of cairo CVE-2020-35492