From f83a3c4b6e703d3d6b48f2f8d2f71ab69c084b8f Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Wed, 13 Oct 2021 18:26:43 +0200 Subject: Convert Latin1 to UTF-16 before passing to ICU API The ICU UChar type is a UTF-16 type, not a single-byte type, so passing it the data() of a QByteArray representing an ID is misguided. Fixes: QTBUG-97486 Pick-to: 6.2 6.2.1 Change-Id: I6789f491674b1d913eb8655d788b497e2fc06f7a Reviewed-by: Thiago Macieira --- src/corelib/time/qtimezoneprivate_icu.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/corelib/time/qtimezoneprivate_icu.cpp b/src/corelib/time/qtimezoneprivate_icu.cpp index 503c040d69..798f231219 100644 --- a/src/corelib/time/qtimezoneprivate_icu.cpp +++ b/src/corelib/time/qtimezoneprivate_icu.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2013 John Layt +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -264,11 +265,10 @@ static QList uenumToIdList(UEnumeration *uenum) static int ucalDaylightOffset(const QByteArray &id) { UErrorCode status = U_ZERO_ERROR; - const int32_t dstMSecs = ucal_getDSTSavings(reinterpret_cast(id.data()), &status); - if (U_SUCCESS(status)) - return (dstMSecs / 1000); - else - return 0; + const QString utf16 = QString::fromLatin1(id); + const int32_t dstMSecs = ucal_getDSTSavings( + reinterpret_cast(utf16.data()), &status); + return U_SUCCESS(status) ? dstMSecs / 1000 : 0; } // Create the system default time zone -- cgit v1.2.3