about summary refs log tree commit diff
path: root/src/time/strftime.c
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2015-08-13 17:28:39 +0200
committerRich Felker <dalias@aerifal.cx>2015-08-14 00:47:46 +0000
commitc13f2af1fe1856e36dd1b2773cac05d5d72641dc (patch)
tree4c37476636be82f48d057379699f896433f18d9e /src/time/strftime.c
parente5b086e1d5fe52bf1553357ee790de86eda27bf1 (diff)
downloadmusl-c13f2af1fe1856e36dd1b2773cac05d5d72641dc.tar.gz
musl-c13f2af1fe1856e36dd1b2773cac05d5d72641dc.tar.xz
musl-c13f2af1fe1856e36dd1b2773cac05d5d72641dc.zip
match historical behavior for tm_gmtoff member of struct tm
tm_gmtoff is a nonstandard field, but on historical systems which have
this field, it stores the offset of the local time zone from GMT or
UTC. this is the opposite of the POSIX extern long timezone object and
the offsets used in POSIX-form TZ strings, which represent the offset
from local time to UTC. previously we were storing these negated
offsets in tm_gmtoff too.

programs which only used this field indirectly via strftime were not
affected since strftime performed the negation for presentation.
however, some programs and libraries accesse tm_gmtoff directly and
were obtaining negated time zone offsets.
Diffstat (limited to 'src/time/strftime.c')
-rw-r--r--src/time/strftime.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/time/strftime.c b/src/time/strftime.c
index 794fbe1d..e945bb7d 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':