diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | test-skeleton.c | 23 | ||||
-rw-r--r-- | time/tzset.c | 7 |
4 files changed, 36 insertions, 7 deletions
@@ -1,3 +1,14 @@ +2015-04-27 Florian Weimer <fweimer@redhat.com> + + [BZ#18333] + * time/tzset.c (parse_tzname): Return error on memory allocation + failure. + * test-skeleton.c (struct temp_name_list): Change type of name + member to non-const. + (add_temp_file): Create a copy of the file name. + (delete_temp_files): Deallocate memory. + (create_temp_file): Add comment. + 2015-04-24 Florian Weimer <fweimer@redhat.com> * io/posix_fallocate.c (posix_fallocate): Do not set errno. @@ -16,7 +16,7 @@ Version 2.22 17967, 17969, 17978, 17987, 17991, 17996, 17998, 17999, 18019, 18020, 18029, 18030, 18032, 18036, 18038, 18039, 18042, 18043, 18046, 18047, 18068, 18080, 18093, 18100, 18104, 18110, 18111, 18128, 18138, 18185, - 18197, 18206, 18210, 18211, 18247, 18287. + 18197, 18206, 18210, 18211, 18247, 18287, 18333. * Cache information can be queried via sysconf() function on s390 e.g. with _SC_LEVEL1_ICACHE_SIZE as argument. diff --git a/test-skeleton.c b/test-skeleton.c index 7a8ddfa..43fc236 100644 --- a/test-skeleton.c +++ b/test-skeleton.c @@ -73,7 +73,7 @@ static const char *test_dir; struct temp_name_list { struct qelem q; - const char *name; + char *name; } *temp_name_list; /* Add temporary files in list. */ @@ -83,14 +83,17 @@ add_temp_file (const char *name) { struct temp_name_list *newp = (struct temp_name_list *) calloc (sizeof (*newp), 1); - if (newp != NULL) + char *newname = strdup (name); + if (newp != NULL && newname != NULL) { - newp->name = name; + newp->name = newname; if (temp_name_list == NULL) temp_name_list = (struct temp_name_list *) &newp->q; else insque (newp, temp_name_list); } + else + free (newp); } /* Delete all temporary files. */ @@ -100,11 +103,19 @@ delete_temp_files (void) while (temp_name_list != NULL) { remove (temp_name_list->name); - temp_name_list = (struct temp_name_list *) temp_name_list->q.q_forw; + free (temp_name_list->name); + + struct temp_name_list *next + = (struct temp_name_list *) temp_name_list->q.q_forw; + free (temp_name_list); + temp_name_list = next; } } -/* Create a temporary file. */ +/* Create a temporary file. Return the opened file descriptor on + success, or -1 on failure. Write the file name to *FILENAME if + FILENAME is not NULL. In this case, the caller is expected to free + *FILENAME. */ static int __attribute__ ((unused)) create_temp_file (const char *base, char **filename) @@ -132,6 +143,8 @@ create_temp_file (const char *base, char **filename) add_temp_file (fname); if (filename != NULL) *filename = fname; + else + free (fname); return fd; } diff --git a/time/tzset.c b/time/tzset.c index d115bae..160f5ad 100644 --- a/time/tzset.c +++ b/time/tzset.c @@ -201,7 +201,12 @@ parse_tzname (const char **tzp, int whichrule) if (*p++ != '>' || len < 3) return false; } - tz_rules[whichrule].name = __tzstring_len (start, len); + + const char *name = __tzstring_len (start, len); + if (name == NULL) + return false; + tz_rules[whichrule].name = name; + *tzp = p; return true; } |