QStringConverter: make name matching locale-independent

The existing name lookup code used C's toupper() function for
case-insensitive comparison. However, that function's result depends
on the current locale.

Since the matcher is supposed to match the likes of "iso-8859-1" and
"latin-1", matching may fail in locales, such as Turkish, where
toupper(i) is İ (or i, if the former isn't representable in the current
charset), but toupper(I) remains I, causing a False Negative.

To fix, use the US-ASCII-only QtMiscUtils::toAsciiLower() function,
which has the added advantage that it's inline.

Pick-to: 6.3 6.2
Change-Id: I70613c0167d84e3dc3d282c61c716b5dd0b3e6bb
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Marc Mutz 2022-02-18 18:13:08 +01:00
parent b2298b7e94
commit 955106c4fb
1 changed files with 2 additions and 1 deletions

View File

@ -44,6 +44,7 @@
#include "private/qsimd_p.h"
#include "private/qstringiterator_p.h"
#include "private/qtools_p.h"
#include "qbytearraymatcher.h"
#ifdef Q_OS_WIN
@ -1671,7 +1672,7 @@ static bool nameMatch(const char *a, const char *b)
++b;
continue;
}
if (toupper(*a) != toupper(*b))
if (QtMiscUtils::toAsciiLower(*a) != QtMiscUtils::toAsciiLower(*b))
return false;
++a;
++b;