提交 80584c90 编写于 作者: C coffeys

7149608: Default TZ detection fails on linux when symbolic links to non default location used.

Reviewed-by: alanb, okutsu
上级 f0eb9f23
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -96,9 +96,9 @@ getPathName(const char *dir, const char *name) { ...@@ -96,9 +96,9 @@ getPathName(const char *dir, const char *name) {
/* /*
* Scans the specified directory and its subdirectories to find a * Scans the specified directory and its subdirectories to find a
* zoneinfo file which has the same content as /etc/localtime on Linux * zoneinfo file which has the same content as /etc/localtime on Linux
* or /usr/share/lib/zoneinfo/localtime (most likely a symbolic link) * or /usr/share/lib/zoneinfo/localtime on Solaris given in 'buf'.
* on Solaris given in 'buf'. Returns a zone ID if found, otherwise, * If file is symbolic link, then the contents it points to are in buf.
* NULL is returned. * Returns a zone ID if found, otherwise, NULL is returned.
*/ */
static char * static char *
findZoneinfoFile(char *buf, size_t size, const char *dir) findZoneinfoFile(char *buf, size_t size, const char *dir)
...@@ -280,21 +280,27 @@ getPlatformTimeZoneID() ...@@ -280,21 +280,27 @@ getPlatformTimeZoneID()
tz = getZoneName(linkbuf); tz = getZoneName(linkbuf);
if (tz != NULL) { if (tz != NULL) {
tz = strdup(tz); tz = strdup(tz);
return tz;
} }
return tz;
} }
/* /*
* If it's a regular file, we need to find out the same zoneinfo file * If it's a regular file, we need to find out the same zoneinfo file
* that has been copied as /etc/localtime. * that has been copied as /etc/localtime.
* If initial symbolic link resolution failed, we should treat target
* file as a regular file.
*/ */
if ((fd = open(DEFAULT_ZONEINFO_FILE, O_RDONLY)) == -1) {
return NULL;
}
if (fstat(fd, &statbuf) == -1) {
(void) close(fd);
return NULL;
}
size = (size_t) statbuf.st_size; size = (size_t) statbuf.st_size;
buf = (char *) malloc(size); buf = (char *) malloc(size);
if (buf == NULL) { if (buf == NULL) {
return NULL; (void) close(fd);
}
if ((fd = open(DEFAULT_ZONEINFO_FILE, O_RDONLY)) == -1) {
free((void *) buf);
return NULL; return NULL;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册