Fix crash on QLocale::monthName().simplified()

Because monthName() returns a fromRawData() view of internal locale
data, we have to avoid simplified()'s optimisation of re-using an
unshared object; even if it's not shared, it's not mutable.

Fixes: QTBUG-113415
Change-Id: Idac93175434c7a8a21228605578adbe4cc918e7a
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Edward Welbourne 2023-05-22 11:47:03 +02:00
parent 79e6df3e84
commit eede428084
2 changed files with 3 additions and 0 deletions

View File

@ -5737,6 +5737,8 @@ QString QString::simplified_helper(const QString &str)
QString QString::simplified_helper(QString &str)
{
if (IS_RAW_DATA(str.d)) // Force a copy, even if not shared:
return QStringAlgorithms<const QString>::simplified_helper(str);
return QStringAlgorithms<QString>::simplified_helper(str);
}

View File

@ -2547,6 +2547,7 @@ void tst_QLocale::monthName()
QCOMPARE(c.monthName(1, QLocale::LongFormat), QLatin1String("January"));
QCOMPARE(c.monthName(1, QLocale::ShortFormat), QLatin1String("Jan"));
QCOMPARE(c.monthName(1, QLocale::NarrowFormat), QLatin1String("1"));
QCOMPARE(c.monthName(3).simplified(), "March"); // QTBUG-113415 (crash)
const QLocale de("de_DE");
QCOMPARE(de.monthName(12, QLocale::LongFormat), QLatin1String("Dezember"));