X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Ftime%2F__tz.c;h=3e2fcdcbb6a48d000497e2bd36234a2e9c88f0cf;hb=937822abb6ac48880939be3c60e6b57bddf62cf6;hp=3044d20673b8c4096dcf1d5e9245e65f54d116ea;hpb=34952fe5de44a833370cbe87b63fb8eec61466d7;p=musl diff --git a/src/time/__tz.c b/src/time/__tz.c index 3044d206..3e2fcdcb 100644 --- a/src/time/__tz.c +++ b/src/time/__tz.c @@ -4,8 +4,10 @@ #include #include #include +#include #include "libc.h" #include "lock.h" +#include "fork_impl.h" #define malloc __libc_malloc #define calloc undef @@ -35,6 +37,7 @@ static char *old_tz = old_tz_buf; static size_t old_tz_size = sizeof old_tz_buf; static volatile int lock[1]; +volatile int *const __timezone_lockptr = lock; static int getint(const char **p) { @@ -152,10 +155,21 @@ static void do_tzset() } if (old_tz) memcpy(old_tz, s, i+1); + int posix_form = 0; + if (*s != ':') { + p = s; + char dummy_name[TZNAME_MAX+1]; + getname(dummy_name, &p); + if (p!=s && (*p == '+' || *p == '-' || isdigit(*p) + || !strcmp(dummy_name, "UTC") + || !strcmp(dummy_name, "GMT"))) + posix_form = 1; + } + /* Non-suid can use an absolute tzfile pathname or a relative * pathame beginning with "."; in secure mode, only the * standard path will be searched. */ - if (*s == ':' || ((p=strchr(s, '/')) && !memchr(s, ',', p-s))) { + if (!posix_form) { if (*s == ':') s++; if (*s == '/' || *s == '.') { if (!libc.secure || !strcmp(s, "/etc/localtime")) @@ -183,7 +197,7 @@ static void do_tzset() zi = map; if (map) { int scale = 2; - if (sizeof(time_t) > 4 && map[4]=='2') { + if (map[4]!='1') { size_t skip = zi_dotprod(zi+20, VEC(1,1,8,5,6,1), 6); trans = zi+skip+44+44; scale++;