diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/time/__tz.c | 20 | 
1 files changed, 8 insertions, 12 deletions
| diff --git a/src/time/__tz.c b/src/time/__tz.c index 9d56a618..fbe3d492 100644 --- a/src/time/__tz.c +++ b/src/time/__tz.c @@ -121,7 +121,7 @@ int __munmap(void *, size_t);  static void do_tzset()  {  	char buf[NAME_MAX+25], *pathname=buf+24; -	const char *try, *s; +	const char *try, *s, *p;  	const unsigned char *map = 0;  	size_t i;  	static const char search[] = @@ -147,19 +147,16 @@ static void do_tzset()  	}  	if (old_tz) memcpy(old_tz, s, i+1); -	if (*s == ':') s++; -  	/* 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 == '/' || *s == '.') { -		if (!libc.secure) map = __map_file(s, &map_size); -	} else { -		for (i=0; s[i] && s[i]!=','; i++) { -			if (s[i]=='/') { -				size_t l = strlen(s); -				if (l > NAME_MAX || strchr(s, '.')) -					break; +	if (*s == ':' || ((p=strchr(s, '/')) && !memchr(s, ',', p-s))) { +		if (*s == ':') s++; +		if (*s == '/' || *s == '.') { +			if (!libc.secure) map = __map_file(s, &map_size); +		} else { +			size_t l = strlen(s); +			if (l <= NAME_MAX && !strchr(s, '.')) {  				memcpy(pathname, s, l+1);  				pathname[l] = 0;  				for (try=search; !map && *try; try+=l+1) { @@ -167,7 +164,6 @@ static void do_tzset()  					memcpy(pathname-l, try, l);  					map = __map_file(pathname-l, &map_size);  				} -				break;  			}  		}  	} | 
