src/solaris/native/java/util/TimeZone_md.c

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 94,106 **** } /* * 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. */ static char * findZoneinfoFile(char *buf, size_t size, const char *dir) { DIR *dirp = NULL; --- 94,106 ---- } /* * 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 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) { DIR *dirp = NULL;
*** 278,304 **** } linkbuf[len] = '\0'; tz = getZoneName(linkbuf); if (tz != NULL) { tz = strdup(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. */ size = (size_t) statbuf.st_size; buf = (char *) malloc(size); if (buf == NULL) { return NULL; } - if ((fd = open(DEFAULT_ZONEINFO_FILE, O_RDONLY)) == -1) { - free((void *) buf); - return NULL; - } if (read(fd, buf, size) != (ssize_t) size) { (void) close(fd); free((void *) buf); return NULL; --- 278,310 ---- } linkbuf[len] = '\0'; tz = getZoneName(linkbuf); if (tz != NULL) { tz = strdup(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. */ + 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; buf = (char *) malloc(size); if (buf == NULL) { + (void) close(fd); return NULL; } if (read(fd, buf, size) != (ssize_t) size) { (void) close(fd); free((void *) buf); return NULL;