Fix QString::arg() for format strings with a huge amount of placeholders

QString::arg()s placeholders are limited to triple-digits, so 1000
different ones. By the same token, the length of any one of them is
bounded to five (%L?\d{,3}). But the total possible length of escape
sequences is _not_ 5000B, because there's no limit on the number of
_equal_ placeholders, so a format string where the total escape sequence
length exceeded 2Gi characters, e.g.

  QString("%L100").repeated(INT_MAX/5 + 1).arg(42);

would produce corrupt data.

Pick-to: 6.4 6.3
Task-number: QTBUG-103531
Change-Id: Id27ee02579387efcbb5928de1eb9acbeb9f954c9
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
bb10
Marc Mutz 2022-07-20 22:21:12 +02:00
parent f9d002ea20
commit 15a80cf8a9
1 changed files with 1 additions and 1 deletions

View File

@ -7937,7 +7937,7 @@ struct ArgEscapeData
int occurrences; // number of occurrences of the lowest escape sequence number
int locale_occurrences; // number of occurrences of the lowest escape sequence number that
// contain 'L'
int escape_len; // total length of escape sequences which will be replaced
qsizetype escape_len; // total length of escape sequences which will be replaced
};
static ArgEscapeData findArgEscapes(QStringView s)