1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

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 memoru allocation
failure, found during testing.
This commit is contained in:
Florian Weimer
2015-04-27 15:41:03 +02:00
parent 2dd6ee79b1
commit cc8dcf96e7
4 changed files with 36 additions and 7 deletions

View File

@ -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;
}