| commit cc8dcf96e71dd643f929e32150904cd6ad69efa8 |
| Author: Florian Weimer <fweimer@redhat.com> |
| Date: Mon Apr 27 15:41:03 2015 +0200 |
| |
| test-skeleton: Support temporary files without memory leaks [BZ#18333] |
| |
| add_temp_file now makes a copy which is freed by delete_temp_files. |
| Callers to create_temp_file can now free the returned file name to |
| avoid the memory leak. These changes do not affect the leak behavior |
| of existing code. |
| |
| Also address a NULL pointer derefence in tzset after a memory allocation |
| failure, found during testing. |
| |
| diff --git a/test-skeleton.c b/test-skeleton.c |
| index 7a8ddfa..43fc236 100644 |
| |
| |
| @@ -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 |
| |
| |
| @@ -202,7 +202,10 @@ |
| 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; |