From e51d03e334b18cd34fbfb708b9835327658f2075 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Thu, 30 Jan 2025 10:11:21 +0100 Subject: [PATCH] Escape calculating vertical windows-metrics if they're too big MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This amends 073fae097ce40bee1532c252a8c696840b5dfc16 which added an escape before calculating the vertical metrics if they were too big and would overflow. It missed one spot, which was when using the winAscent/winDescent instead of the typo-metrics. Change-Id: Ib6a7705f6676c66bfd04b37efa30fe2d1b99581c Reviewed-by: Robert Löhning (cherry picked from commit f846754663aae1652e4eec9a441ee222af352319) Reviewed-by: Qt Cherry-pick Bot --- src/gui/text/qfontengine.cpp | 3 +++ .../gui/text/qfontmetrics/tst_qfontmetrics.cpp | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index d4eeee5aefa..d33965b5ea1 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -473,6 +473,9 @@ bool QFontEngine::processOS2Table() const // Some fonts may have invalid OS/2 data. We detect this and bail out. if (winAscent == 0 && winDescent == 0) return false; + const auto limitForQFixed = std::numeric_limits::max() / (fontDef.pixelSize * 64); + if (winAscent > limitForQFixed || winDescent > limitForQFixed) + return false; m_ascent = QFixed::fromReal(winAscent * fontDef.pixelSize) / unitsPerEm; m_descent = QFixed::fromReal(winDescent * fontDef.pixelSize) / unitsPerEm; m_leading = QFixed{}; diff --git a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp index 429eab131a6..5e0a974ab9c 100644 --- a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp +++ b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp @@ -39,6 +39,7 @@ private slots: void typoLineMetrics(); void defaultIgnorableHorizontalAdvance_data(); void defaultIgnorableHorizontalAdvance(); + void hugeFontMetrics(); }; void tst_QFontMetrics::same() @@ -511,5 +512,21 @@ void tst_QFontMetrics::defaultIgnorableHorizontalAdvance() QCOMPARE_GT(withSupportWithIgnorablesAdvance, withSupportWithoutIgnorablesAdvance); } +void tst_QFontMetrics::hugeFontMetrics() +{ + QFont bigFont; + bigFont.setPixelSize(10000); + + QFont hugeFont; + hugeFont.setPixelSize(32000); + + QFont hugeFontWithTypoLineMetrics; + hugeFontWithTypoLineMetrics.setStyleStrategy(QFont::PreferTypoLineMetrics); + hugeFontWithTypoLineMetrics.setPixelSize(30000); + + QVERIFY(QFontMetricsF(bigFont).height() < QFontMetricsF(hugeFont).height()); + QVERIFY(QFontMetricsF(bigFont).height() < QFontMetricsF(hugeFontWithTypoLineMetrics).height()); +} + QTEST_MAIN(tst_QFontMetrics) #include "tst_qfontmetrics.moc"