[PATCH 2.1][BZ #15670] Replace alloca in __tzfile_read by malloc.
Ondřej Bílka
neleai@seznam.cz
Fri Oct 18 09:00:00 GMT 2013
On Wed, Oct 16, 2013 at 10:43:42PM -0400, Mike Frysinger wrote:
> On Wednesday 16 October 2013 12:40:40 OndÅej BÃlka wrote:
> > @@ -173,6 +164,7 @@ __tzfile_read (const char *file, size_t extra, char
> > **extrap) {
> > /* Nothing to do. */
> > __use_tzfile = 1;
> > + free (new);
> > return;
> > }
>
> i wonder if this would benefit from a "goto done" and then adding "done:" at
> the end ...
>
> > @@ -528,11 +520,13 @@ __tzfile_read (const char *file, size_t extra, char
> > **extrap) __timezone = -rule_stdoff;
> >
> > __use_tzfile = 1;
> > + free (new);
> > return;
>
> this would get a new "done:" label
>
> either way, LGTM
> -mike
Done.
ok now?
[BZ #15670]
* time/tzfile.c (__tzfile_read): Replace alloca with malloc.
diff --git a/time/tzfile.c b/time/tzfile.c
index 9dd5130..3ea3051 100644
--- a/time/tzfile.c
+++ b/time/tzfile.c
@@ -114,6 +114,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
int was_using_tzfile = __use_tzfile;
int trans_width = 4;
size_t tzspec_len;
+ char *new = NULL;
if (sizeof (time_t) != 4 && sizeof (time_t) != 8)
abort ();
@@ -145,22 +146,12 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
if (*file != '/')
{
const char *tzdir;
- unsigned int len, tzdir_len;
- char *new, *tmp;
tzdir = getenv ("TZDIR");
if (tzdir == NULL || *tzdir == '\0')
- {
- tzdir = default_tzdir;
- tzdir_len = sizeof (default_tzdir) - 1;
- }
- else
- tzdir_len = strlen (tzdir);
- len = strlen (file) + 1;
- new = (char *) __alloca (tzdir_len + 1 + len);
- tmp = __mempcpy (new, tzdir, tzdir_len);
- *tmp++ = '/';
- memcpy (tmp, file, len);
+ tzdir = default_tzdir;
+ if (__asprintf (&new, "%s/%s", tzdir, file) == -1)
+ goto ret_free_transitions;
file = new;
}
@@ -170,11 +161,7 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
&& stat64 (file, &st) == 0
&& tzfile_ino == st.st_ino && tzfile_dev == st.st_dev
&& tzfile_mtime == st.st_mtime)
- {
- /* Nothing to do. */
- __use_tzfile = 1;
- return;
- }
+ goto done; /* Nothing to do. */
/* Note the file is opened with cancellation in the I/O functions
disabled and if available FD_CLOEXEC set. */
@@ -527,12 +514,15 @@ __tzfile_read (const char *file, size_t extra, char **extrap)
__daylight = rule_stdoff != rule_dstoff;
__timezone = -rule_stdoff;
+ done:
__use_tzfile = 1;
+ free (new);
return;
lose:
fclose (f);
ret_free_transitions:
+ free (new);
free ((void *) transitions);
transitions = NULL;
}
More information about the Libc-alpha
mailing list