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"