From a0752a7f1565c6eb1fe68b8a4441691a68d31045 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 18 Jul 2022 17:20:04 +0200 Subject: [PATCH] Port qt_repeatCount() to qsizetype While it's true that the typical user of the function won't expect more than half a dozen repeats, this function is fed with user-supplied input, so it could be asked to return in excess of INT_MAX matches. The truncation then means we're misreporting the number mod INT_MAX, which is as good as a random number and leads to false positive matches in users of the function. Just return the true result instead of a truncated one. Task-number: QTBUG-103531 Change-Id: I5e3aa23dec873c6f9af255e90748fb38619d2f5d Reviewed-by: Thiago Macieira Reviewed-by: Edward Welbourne (cherry picked from commit d6b38be3dfa4579cbe99cc442452a45779a71e70) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/text/qlocale.cpp | 6 +++--- src/corelib/text/qlocale_mac.mm | 2 +- src/corelib/text/qlocale_p.h | 2 +- src/corelib/text/qlocale_win.cpp | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index 536c5c3be52..85df96c7d8e 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -668,7 +668,7 @@ QString qt_readEscapedFormatString(QStringView format, int *idx) qt_repeatCount(u"aab"); // == 2 \endcode */ -int qt_repeatCount(QStringView s) +qsizetype qt_repeatCount(QStringView s) { if (s.isEmpty()) return 0; @@ -676,7 +676,7 @@ int qt_repeatCount(QStringView s) qsizetype j = 1; while (j < s.size() && s.at(j) == c) ++j; - return int(j); + return j; } Q_CONSTINIT static const QLocaleData *default_data = nullptr; @@ -3333,7 +3333,7 @@ QString QCalendarBackend::dateTimeToString(QStringView format, const QDateTime & } const QChar c = format.at(i); - int repeat = qt_repeatCount(format.mid(i)); + qsizetype repeat = qt_repeatCount(format.mid(i)); bool used = false; if (formatDate) { switch (c.unicode()) { diff --git a/src/corelib/text/qlocale_mac.mm b/src/corelib/text/qlocale_mac.mm index 67f8039309a..7ed7c34f3b6 100644 --- a/src/corelib/text/qlocale_mac.mm +++ b/src/corelib/text/qlocale_mac.mm @@ -267,7 +267,7 @@ static QVariant macToQtFormat(QStringView sys_fmt) } QChar c = sys_fmt.at(i); - int repeat = qt_repeatCount(sys_fmt.mid(i)); + qsizetype repeat = qt_repeatCount(sys_fmt.mid(i)); switch (c.unicode()) { // Qt does not support the following options diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h index beec496d442..061e566d68f 100644 --- a/src/corelib/text/qlocale_p.h +++ b/src/corelib/text/qlocale_p.h @@ -479,7 +479,7 @@ inline char QLocaleData::numericToCLocale(QStringView in) const QString qt_readEscapedFormatString(QStringView format, int *idx); [[nodiscard]] bool qt_splitLocaleName(QStringView name, QStringView *lang = nullptr, QStringView *script = nullptr, QStringView *cntry = nullptr); -[[nodiscard]] int qt_repeatCount(QStringView s); +[[nodiscard]] qsizetype qt_repeatCount(QStringView s); enum { AsciiSpaceMask = (1u << (' ' - 1)) | (1u << ('\t' - 1)) | // 9: HT - horizontal tab diff --git a/src/corelib/text/qlocale_win.cpp b/src/corelib/text/qlocale_win.cpp index 89a8af497af..f61c724aee4 100644 --- a/src/corelib/text/qlocale_win.cpp +++ b/src/corelib/text/qlocale_win.cpp @@ -729,7 +729,7 @@ QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt) } QChar c = sys_fmt.at(i); - int repeat = qt_repeatCount(sys_fmt.mid(i)); + qsizetype repeat = qt_repeatCount(sys_fmt.mid(i)); switch (c.unicode()) { // Date