summaryrefslogtreecommitdiff
path: root/time/tzfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'time/tzfile.c')
-rw-r--r--time/tzfile.c18
1 files changed, 10 insertions, 8 deletions
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.