From 9d9f92cf341c8468cef491c51e14f33356b0f8f7 Mon Sep 17 00:00:00 2001 From: Marco Castelluccio Date: Mon, 16 Oct 2023 00:34:16 +0000 Subject: [PATCH] Bug 1856428 - MacOS Sonoma doesn't return correct timezone. r=anba Import from https://unicode-org.atlassian.net/browse/ICU-22541 (https://github.com/unicode-org/icu/pull/2669). Differential Revision: https://phabricator.services.mozilla.com/D191013 UltraBlame original commit: 91657cb1296c904004ace38877b9ca91f502be3f --- intl/icu-patches/bug-1856428-ICU-22541.diff | 399 ++++++++++++++++++++ intl/icu/source/common/putil.cpp | 155 ++++++++ intl/update-icu.sh | 16 + 3 files changed, 570 insertions(+) create mode 100644 intl/icu-patches/bug-1856428-ICU-22541.diff diff --git a/intl/icu-patches/bug-1856428-ICU-22541.diff b/intl/icu-patches/bug-1856428-ICU-22541.diff new file mode 100644 index 0000000000000..4774865569fcf --- /dev/null +++ b/intl/icu-patches/bug-1856428-ICU-22541.diff @@ -0,0 +1,399 @@ +# +Fix +MacOS +14 +default +timezone +issue +# +# +ICU +bug +: +https +: +/ +/ +unicode +- +org +. +atlassian +. +net +/ +browse +/ +ICU +- +22541 +diff +- +- +git +a +/ +intl +/ +icu +/ +source +/ +common +/ +putil +. +cpp +b +/ +intl +/ +icu +/ +source +/ +common +/ +putil +. +cpp +- +- +- +a +/ +intl +/ +icu +/ +source +/ +common +/ +putil +. +cpp ++ ++ ++ +b +/ +intl +/ +icu +/ +source +/ +common +/ +putil +. +cpp +- +1170 +16 ++ +1170 +31 +uprv_tzname +( +int +n +) +This +is +a +trick +to +look +at +the +name +of +the +link +to +get +the +Olson +ID +because +the +tzfile +contents +is +underspecified +. +This +isn +' +t +guaranteed +to +work +because +it +may +not +be +a +symlink +. +* +/ +char +* +ret += +realpath +( +TZDEFAULT +gTimeZoneBuffer +) +; +if +( +ret +! += +nullptr +& +& +uprv_strcmp +( +TZDEFAULT +gTimeZoneBuffer +) +! += +0 +) +{ +int32_t +tzZoneInfoTailLen += +uprv_strlen +( +TZZONEINFOTAIL +) +; +const +char +* +tzZoneInfoTailPtr += +uprv_strstr +( +gTimeZoneBuffer +TZZONEINFOTAIL +) +; ++ +/ +/ +MacOS14 +has +the +realpath +as +something +like ++ +/ +/ +/ +usr +/ +share +/ +zoneinfo +. +default +/ +Australia +/ +Melbourne ++ +/ +/ +which +will +not +have +" +/ +zoneinfo +/ +" +in +the +path +. ++ +/ +/ +Therefore +if +we +fail +we +fall +back +to +read +the +link +which +is ++ +/ +/ +/ +var +/ +db +/ +timezone +/ +zoneinfo +/ +Australia +/ +Melbourne ++ +/ +/ +We +also +fall +back +to +reading +the +link +if +the +realpath +leads +to +something +like ++ +/ +/ +/ +usr +/ +share +/ +zoneinfo +/ +posixrules ++ +if +( +tzZoneInfoTailPtr += += +nullptr +| +| ++ +uprv_strcmp +( +tzZoneInfoTailPtr ++ +tzZoneInfoTailLen +" +posixrules +" +) += += +0 +) +{ ++ +ssize_t +size += +readlink +( +TZDEFAULT +gTimeZoneBuffer +sizeof +( +gTimeZoneBuffer +) +- +1 +) +; ++ +if +( +size +> +0 +) +{ ++ +gTimeZoneBuffer +[ +size +] += +0 +; ++ +tzZoneInfoTailPtr += +uprv_strstr +( +gTimeZoneBuffer +TZZONEINFOTAIL +) +; ++ +} ++ +} +if +( +tzZoneInfoTailPtr +! += +nullptr +) +{ +tzZoneInfoTailPtr ++ += +tzZoneInfoTailLen +; +skipZoneIDPrefix +( +& +tzZoneInfoTailPtr +) +; +if +( +isValidOlsonID +( +tzZoneInfoTailPtr +) +) +{ +return +( +gTimeZoneBufferPtr += +tzZoneInfoTailPtr +) +; +} +} +} +else +{ diff --git a/intl/icu/source/common/putil.cpp b/intl/icu/source/common/putil.cpp index a06d856ae1a6e..1b289bf3f5077 100644 --- a/intl/icu/source/common/putil.cpp +++ b/intl/icu/source/common/putil.cpp @@ -9318,6 +9318,161 @@ gTimeZoneBuffer TZZONEINFOTAIL ) ; +/ +/ +MacOS14 +has +the +realpath +as +something +like +/ +/ +/ +usr +/ +share +/ +zoneinfo +. +default +/ +Australia +/ +Melbourne +/ +/ +which +will +not +have +" +/ +zoneinfo +/ +" +in +the +path +. +/ +/ +Therefore +if +we +fail +we +fall +back +to +read +the +link +which +is +/ +/ +/ +var +/ +db +/ +timezone +/ +zoneinfo +/ +Australia +/ +Melbourne +/ +/ +We +also +fall +back +to +reading +the +link +if +the +realpath +leads +to +something +like +/ +/ +/ +usr +/ +share +/ +zoneinfo +/ +posixrules +if +( +tzZoneInfoTailPtr += += +nullptr +| +| +uprv_strcmp +( +tzZoneInfoTailPtr ++ +tzZoneInfoTailLen +" +posixrules +" +) += += +0 +) +{ +ssize_t +size += +readlink +( +TZDEFAULT +gTimeZoneBuffer +sizeof +( +gTimeZoneBuffer +) +- +1 +) +; +if +( +size +> +0 +) +{ +gTimeZoneBuffer +[ +size +] += +0 +; +tzZoneInfoTailPtr += +uprv_strstr +( +gTimeZoneBuffer +TZZONEINFOTAIL +) +; +} +} if ( tzZoneInfoTailPtr diff --git a/intl/update-icu.sh b/intl/update-icu.sh index 5f49af735b36b..fc2ef7a9a2ca8 100644 --- a/intl/update-icu.sh +++ b/intl/update-icu.sh @@ -644,6 +644,22 @@ iso8601 . diff \ +double +- +conversion +. +diff +\ +bug +- +1856428 +- +ICU +- +22541 +. +diff +\ ; do echo