Skip to content

Commit

Permalink
Bug 1856428 - MacOS Sonoma doesn't return correct timezone. r=anba
Browse files Browse the repository at this point in the history
  • Loading branch information
makotokato committed Oct 15, 2023
1 parent f225b12 commit 66ef209
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
39 changes: 39 additions & 0 deletions intl/icu-patches/bug-1856428-ICU-22541.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# 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 {
15 changes: 15 additions & 0 deletions intl/icu/source/common/putil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1175,6 +1175,21 @@ uprv_tzname(int n)
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);
Expand Down
1 change: 1 addition & 0 deletions intl/update-icu.sh
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ for patch in \
bug-1790071-ICU-22132-standardize-vtzone-output.diff \
bug-1838173-ICU-22412-start-time-iso8601.diff \
double-conversion.diff \
bug-1856428-ICU-22541.diff \
; do
echo "Applying local patch $patch"
patch -d ${icu_dir}/../../ -p1 --no-backup-if-mismatch < ${icu_dir}/../icu-patches/$patch
Expand Down

0 comments on commit 66ef209

Please sign in to comment.