diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 1dfdeb5ec0..aa19f7d84a 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -469,6 +469,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 bad33ab0a4..f056cc9fb1 100644 --- a/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp +++ b/tests/auto/gui/text/qfontmetrics/tst_qfontmetrics.cpp @@ -37,6 +37,7 @@ private slots: void largeText_data(); void largeText(); // QTBUG-123339 void typoLineMetrics(); + void hugeFontMetrics(); }; void tst_QFontMetrics::same() @@ -454,5 +455,21 @@ void tst_QFontMetrics::typoLineMetrics() } } +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"