diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2022-07-06 13:52:46 +0200 |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2022-07-14 10:54:46 +0200 |
commit | 1b5ab50692bd7df0bb044aec1f95120ae20560ad (patch) | |
tree | f73d17da78ddb08bd59b8ae57205db815c51bcc3 /src | |
parent | 5d446a25212c4492980aba1b04c238ea905ce74f (diff) | |
download | qtsvg-1b5ab50692bd7df0bb044aec1f95120ae20560ad.tar.gz |
Avoid undefined behavior when painter transform goes oob
With some broken input files, we can end up with a matrix
that scales or translates so far that it ends up with
NaNs or Infs. This causes undefined behavior later when
doing comparisons. We protect against this by checking
for matrix validity after transforming and resetting the
matrix if it becomes invalid.
Pick-to: 5.15 6.2 6.3 6.4
Fixes: QTBUG-101698
Change-Id: Iabc745c1e7a0c36449f14c4c6d9bc8066eaa8eac
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/svg/qsvgtinydocument.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/svg/qsvgtinydocument.cpp b/src/svg/qsvgtinydocument.cpp index f6dacd8..49a796c 100644 --- a/src/svg/qsvgtinydocument.cpp +++ b/src/svg/qsvgtinydocument.cpp @@ -397,8 +397,16 @@ void QSvgTinyDocument::draw(QPainter *p, QSvgExtraStates &) draw(p); } +static bool isValidMatrix(const QTransform &transform) +{ + qreal determinant = transform.determinant(); + return qIsFinite(determinant); +} + void QSvgTinyDocument::mapSourceToTarget(QPainter *p, const QRectF &targetRect, const QRectF &sourceRect) { + QTransform oldTransform = p->worldTransform(); + QRectF target = targetRect; if (target.isEmpty()) { QPaintDevice *dev = p->device(); @@ -447,6 +455,9 @@ void QSvgTinyDocument::mapSourceToTarget(QPainter *p, const QRectF &targetRect, p->translate(-source.x(), -source.y()); } } + + if (!isValidMatrix(p->worldTransform())) + p->setWorldTransform(oldTransform); } QRectF QSvgTinyDocument::boundsOnElement(const QString &id) const |