diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | time/tzfile.c | 18 |
2 files changed, 23 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog index 58cd9b473e..459d1271a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2004-08-11 Ulrich Drepper <drepper@redhat.com> + + * time/tzset.c (tzset_internal): Add new parameter which is + nonzero if called through tzset. Use TZDEFAULT name including + name comparison if the new parameter is zero. This means implicit + tzset calls will not cause files to be opened and read by tzfile.c + all the time. + +2004-08-11 Jakub Jelinek <jakub@redhat.com> + + * time/tzfile.c (__tzfile_read): Free transitions only if it will + not be reused. + 2004-08-11 Jakub Jelinek <jakub@redhat.com> * sysdeps/ieee754/dbl-64/mpa.c: Include <sys/param.h>. diff --git a/time/tzfile.c b/time/tzfile.c index b118e07dc4..8c2756e7bb 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -104,16 +104,12 @@ __tzfile_read (const char *file, size_t extra, char **extrap) __use_tzfile = 0; - if (transitions != NULL) - free ((void *) transitions); - transitions = NULL; - if (file == NULL) /* No user specification; use the site-wide default. */ file = TZDEFAULT; else if (*file == '\0') /* User specified the empty string; use UTC with no leap seconds. */ - return; + goto ret_free_transitions; else { /* We must not allow to read an arbitrary file in a setuid @@ -127,7 +123,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap) || strstr (file, "../") != NULL)) /* This test is certainly a bit too restrictive but it should catch all critical cases. */ - return; + goto ret_free_transitions; } if (*file != '/') @@ -156,14 +152,14 @@ __tzfile_read (const char *file, size_t extra, char **extrap) disabled. */ f = fopen (file, "rc"); if (f == NULL) - return; + goto ret_free_transitions; /* Get information about the file. */ struct stat64 st; if (fstat64 (fileno (f), &st) != 0) { fclose (f); - return; + goto ret_free_transitions; } if (was_using_tzfile && tzfile_ino == st.st_ino && tzfile_dev == st.st_dev) { @@ -173,6 +169,9 @@ __tzfile_read (const char *file, size_t extra, char **extrap) return; } + free ((void *) transitions); + transitions = NULL; + /* Remember the inode and device number. */ tzfile_dev = st.st_dev; tzfile_ino = st.st_ino; @@ -381,6 +380,9 @@ __tzfile_read (const char *file, size_t extra, char **extrap) lose: fclose (f); + ret_free_transitions: + free ((void *) transitions); + transitions = NULL; } /* The user specified a hand-made timezone, but not its DST rules. |