--- old/src/solaris/native/java/util/TimeZone_md.c Fri Mar 9 15:12:08 2012 +++ new/src/solaris/native/java/util/TimeZone_md.c Fri Mar 9 15:12:06 2012 @@ -96,9 +96,9 @@ /* * Scans the specified directory and its subdirectories to find a * zoneinfo file which has the same content as /etc/localtime on Linux - * or /usr/share/lib/zoneinfo/localtime (most likely a symbolic link) - * on Solaris given in 'buf'. Returns a zone ID if found, otherwise, - * NULL is returned. + * or /usr/share/lib/zoneinfo/localtime on Solaris given in 'buf'. + * If file is symbolic link, then the contents it points to are in buf. + * Returns a zone ID if found, otherwise, NULL is returned. */ static char * findZoneinfoFile(char *buf, size_t size, const char *dir) @@ -226,6 +226,7 @@ int fd; char *buf; size_t size; + char linkbuf[PATH_MAX+1]; #ifdef __linux__ /* @@ -267,8 +268,9 @@ * of a zoneinfo file. It's no longer possible to get the zone ID * from /etc/localtime.) */ + strcpy(linkbuf, DEFAULT_ZONEINFO_FILE); + linkbuf[strlen(DEFAULT_ZONEINFO_FILE)] = '\0'; if (S_ISLNK(statbuf.st_mode)) { - char linkbuf[PATH_MAX+1]; int len; if ((len = readlink(DEFAULT_ZONEINFO_FILE, linkbuf, sizeof(linkbuf)-1)) == -1) { @@ -280,20 +282,26 @@ tz = getZoneName(linkbuf); if (tz != NULL) { tz = strdup(tz); + return tz; } - return tz; } /* * If it's a regular file, we need to find out the same zoneinfo file * that has been copied as /etc/localtime. + * If initial symbolic link resolution failed, we should treat target + * file as a regular file. Obtain new statbuf for this (using stat) */ + if (stat(linkbuf, &statbuf) == -1) { + return NULL; + } + size = (size_t) statbuf.st_size; buf = (char *) malloc(size); if (buf == NULL) { return NULL; } - if ((fd = open(DEFAULT_ZONEINFO_FILE, O_RDONLY)) == -1) { + if ((fd = open(linkbuf, O_RDONLY)) == -1) { free((void *) buf); return NULL; }