diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2015-08-13 12:03:46 +0200 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2015-08-13 12:03:46 +0200 |
commit | 8414beebee8ee751a27f412d2318f0bcf66bf65b (patch) | |
tree | e8b2bcb59891b6e0d003e54aba07a24f424212c3 /main/musl/0001-fix-struct-tm.tm_gmtoff-to-be-posive-east-of-UTC.patch | |
parent | b6576c3f7621281efae1557c60104cf45b55d301 (diff) | |
download | aports-8414beebee8ee751a27f412d2318f0bcf66bf65b.tar.bz2 aports-8414beebee8ee751a27f412d2318f0bcf66bf65b.tar.xz |
main/musl: fix struct tm.tm_gmtoff
ref #4450
Diffstat (limited to 'main/musl/0001-fix-struct-tm.tm_gmtoff-to-be-posive-east-of-UTC.patch')
-rw-r--r-- | main/musl/0001-fix-struct-tm.tm_gmtoff-to-be-posive-east-of-UTC.patch | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/main/musl/0001-fix-struct-tm.tm_gmtoff-to-be-posive-east-of-UTC.patch b/main/musl/0001-fix-struct-tm.tm_gmtoff-to-be-posive-east-of-UTC.patch new file mode 100644 index 0000000000..569182bfd6 --- /dev/null +++ b/main/musl/0001-fix-struct-tm.tm_gmtoff-to-be-posive-east-of-UTC.patch @@ -0,0 +1,123 @@ +From f758bdca98941027145e005543c7e5bc218d98b4 Mon Sep 17 00:00:00 2001 +From: Natanael Copa <ncopa@alpinelinux.org> +Date: Wed, 12 Aug 2015 17:06:00 +0200 +Subject: [PATCH] fix struct tm.tm_gmtoff to be posive east of UTC + +Posix says that tzset() should set the "extern long timezone" (defined +in time.h) "shall be set to the difference, in seconds, between +Coordinated Universal Time (UTC) and local standard time." This means +that locations east of UTC will have negative value timezone value. + +However the value in the glibc additional struct tm field "long +tm_gmtoff" is positive on locations east of UTC, just like the offset in +the zoneinfo database. + +From http://man7.org/linux/man-pages/man3/ctime.3.html + + long tm_gmtoff; /* Seconds east of UTC */ + +This fixes coreutils' 'date -R' and 'ruby -e "puts Time.now"' to display +correct timezone offset. +--- + src/time/__tz.c | 12 ++++++------ + src/time/localtime_r.c | 2 +- + src/time/mktime.c | 6 +++--- + src/time/strftime.c | 4 ++-- + 4 files changed, 12 insertions(+), 12 deletions(-) + +diff --git a/src/time/__tz.c b/src/time/__tz.c +index 102c8bc..8b84b9b 100644 +--- a/src/time/__tz.c ++++ b/src/time/__tz.c +@@ -354,9 +354,9 @@ void __secs_to_zone(long long t, int local, int *isdst, long *offset, long *oppo + size_t alt, i = scan_trans(t, local, &alt); + if (i != -1) { + *isdst = types[6*i+4]; +- *offset = -(int32_t)zi_read32(types+6*i); ++ *offset = (int32_t)zi_read32(types+6*i); + *zonename = (const char *)abbrevs + types[6*i+5]; +- if (oppoff) *oppoff = -(int32_t)zi_read32(types+6*alt); ++ if (oppoff) *oppoff = (int32_t)zi_read32(types+6*alt); + UNLOCK(lock); + return; + } +@@ -390,15 +390,15 @@ void __secs_to_zone(long long t, int local, int *isdst, long *offset, long *oppo + } + std: + *isdst = 0; +- *offset = __timezone; +- if (oppoff) *oppoff = dst_off; ++ *offset = -__timezone; ++ if (oppoff) *oppoff = -dst_off; + *zonename = __tzname[0]; + UNLOCK(lock); + return; + dst: + *isdst = 1; +- *offset = dst_off; +- if (oppoff) *oppoff = __timezone; ++ *offset = -dst_off; ++ if (oppoff) *oppoff = -__timezone; + *zonename = __tzname[1]; + UNLOCK(lock); + } +diff --git a/src/time/localtime_r.c b/src/time/localtime_r.c +index 1d43d9f..2e62c29 100644 +--- a/src/time/localtime_r.c ++++ b/src/time/localtime_r.c +@@ -11,7 +11,7 @@ struct tm *__localtime_r(const time_t *restrict t, struct tm *restrict tm) + return 0; + } + __secs_to_zone(*t, 0, &tm->tm_isdst, &tm->__tm_gmtoff, 0, &tm->__tm_zone); +- if (__secs_to_tm((long long)*t - tm->__tm_gmtoff, tm) < 0) { ++ if (__secs_to_tm((long long)*t + tm->__tm_gmtoff, tm) < 0) { + errno = EOVERFLOW; + return 0; + } +diff --git a/src/time/mktime.c b/src/time/mktime.c +index 0ab4780..bad3f07 100644 +--- a/src/time/mktime.c ++++ b/src/time/mktime.c +@@ -10,14 +10,14 @@ time_t mktime(struct tm *tm) + __secs_to_zone(t, 1, &new.tm_isdst, &new.__tm_gmtoff, &opp, &new.__tm_zone); + + if (tm->tm_isdst>=0 && new.tm_isdst!=tm->tm_isdst) +- t += opp - new.__tm_gmtoff; ++ t -= opp - new.__tm_gmtoff; + +- t += new.__tm_gmtoff; ++ t -= new.__tm_gmtoff; + if ((time_t)t != t) goto error; + + __secs_to_zone(t, 0, &new.tm_isdst, &new.__tm_gmtoff, &opp, &new.__tm_zone); + +- if (__secs_to_tm(t - new.__tm_gmtoff, &new) < 0) goto error; ++ if (__secs_to_tm(t + new.__tm_gmtoff, &new) < 0) goto error; + + *tm = new; + return t; +diff --git a/src/time/strftime.c b/src/time/strftime.c +index 794fbe1..e945bb7 100644 +--- a/src/time/strftime.c ++++ b/src/time/strftime.c +@@ -126,7 +126,7 @@ const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm * + fmt = "%H:%M"; + goto recu_strftime; + case 's': +- val = __tm_to_secs(tm) + tm->__tm_gmtoff; ++ val = __tm_to_secs(tm) - tm->__tm_gmtoff; + width = 1; + goto number; + case 'S': +@@ -178,7 +178,7 @@ const char *__strftime_fmt_1(char (*s)[100], size_t *l, int f, const struct tm * + return ""; + } + *l = snprintf(*s, sizeof *s, "%+.2d%.2d", +- (-tm->__tm_gmtoff)/3600, ++ (tm->__tm_gmtoff)/3600, + abs(tm->__tm_gmtoff%3600)/60); + return *s; + case 'Z': +-- +2.5.0 + |