File 0001-Avoid-converting-supersized-QRectF-to-QRect.patch of Package libqt5-qtbase.29707
From 27f1a68dcc74010e109facd9f75d9895743b1b61 Mon Sep 17 00:00:00 2001
From: Allan Sandfeld Jensen <allan.jensen@qt.io>
Date: Tue, 23 Jun 2020 09:50:54 +0200
Subject: [PATCH 01/11] Avoid converting supersized QRectF to QRect
Check that the sizes are even representable when checking if clipping is
necessary.
Fixes oss-fuzz 23630
Change-Id: I95d6873d28b0e4f47aae7666f7ee96b745dc997b
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
(cherry picked from commit 177c0ef204e35938f3fef7bd7be5425d6804ec82)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit 43f2244581bd739a61c07eb318261e28b2792650)
---
src/gui/painting/qpaintengine_raster.cpp | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 885c46e121..4dfdf20bf0 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -1810,9 +1810,9 @@ void QRasterPaintEngine::fill(const QVectorPath &path, const QBrush &brush)
// ### Optimize for non transformed ellipses and rectangles...
QRectF cpRect = path.controlPointRect();
- const QRect pathDeviceRect = s->matrix.mapRect(cpRect).toRect();
+ const QRectF pathDeviceRect = s->matrix.mapRect(cpRect);
// Skip paths that by conservative estimates are completely outside the paint device.
- if (!pathDeviceRect.intersects(d->deviceRect))
+ if (!pathDeviceRect.intersects(QRectF(d->deviceRect)))
return;
ProcessSpans blend = d->getBrushFunc(pathDeviceRect, &s->brushData);
@@ -3074,7 +3074,12 @@ bool QRasterPaintEnginePrivate::isUnclipped(const QRect &rect,
inline bool QRasterPaintEnginePrivate::isUnclipped(const QRectF &rect,
int penWidth) const
{
- return isUnclipped(rect.normalized().toAlignedRect(), penWidth);
+ const QRectF norm = rect.normalized();
+ if (norm.left() < INT_MIN || norm.top() < INT_MIN
+ || norm.right() > INT_MAX || norm.bottom() > INT_MAX
+ || norm.width() > INT_MAX || norm.height() > INT_MAX)
+ return false;
+ return isUnclipped(norm.toAlignedRect(), penWidth);
}
inline ProcessSpans
--
2.25.1