From dee140a79a3c87184abbe7d7edac4533b137ca16 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 10 Jun 2020 10:12:29 +0200 Subject: [PATCH] Windows: Fix registry string read failures On Windows 7, it has been observed that the time zone registry key is a string of size 256 padded with 0. Use QString::fromWCharArray(), relying on 0-termination to cope with it. Pick-to: 5.15 Fixes: QTBUG-84455 Change-Id: I5d242e2de73c1ea09344aee8de8eea941bc52bab Reviewed-by: Oliver Wolff Reviewed-by: Volker Hilsheimer --- src/corelib/kernel/qwinregistry.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/corelib/kernel/qwinregistry.cpp b/src/corelib/kernel/qwinregistry.cpp index 6566dd3c763..ac3b2ec3702 100644 --- a/src/corelib/kernel/qwinregistry.cpp +++ b/src/corelib/kernel/qwinregistry.cpp @@ -86,17 +86,15 @@ QString QWinRegistryKey::stringValue(QStringView subKey) const || (type != REG_SZ && type != REG_EXPAND_SZ) || size <= 2) { return result; } - // Reserve more for rare cases where trailing '\0' are missing in registry, - // otherwise chop off the '\0' received. - QString buffer(int(size / sizeof(wchar_t)), Qt::Uninitialized); - if (RegQueryValueEx(m_key, subKeyC, nullptr, &type, - reinterpret_cast(buffer.data()), &size) == ERROR_SUCCESS) { - if (buffer.endsWith(QChar::Null)) - buffer.chop(1); - } else { - buffer.clear(); - } - return buffer; + // Reserve more for rare cases where trailing '\0' are missing in registry. + // Rely on 0-termination since strings of size 256 padded with 0 have been + // observed (QTBUG-84455). + size += 2; + QVarLengthArray buffer(static_cast(size)); + std::fill(buffer.data(), buffer.data() + size, 0u); + if (RegQueryValueEx(m_key, subKeyC, nullptr, &type, buffer.data(), &size) == ERROR_SUCCESS) + result = QString::fromWCharArray(reinterpret_cast(buffer.constData())); + return result; } QPair QWinRegistryKey::dwordValue(QStringView subKey) const