aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2015-04-27 15:41:03 +0200
committerFlorian Weimer <fweimer@redhat.com>2015-04-27 16:19:55 +0200
commitcc8dcf96e71dd643f929e32150904cd6ad69efa8 (patch)
tree0711c094ad29df752a51ffff7120f7b48a945dfd
parentposix_fallocate, posix_fallocate64 stub: Do not set errno (diff)
downloadglibc-cc8dcf96e71dd643f929e32150904cd6ad69efa8.tar.gz
glibc-cc8dcf96e71dd643f929e32150904cd6ad69efa8.tar.bz2
glibc-cc8dcf96e71dd643f929e32150904cd6ad69efa8.zip
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.
-rw-r--r--ChangeLog11
-rw-r--r--NEWS2
-rw-r--r--test-skeleton.c23
-rw-r--r--time/tzset.c7
4 files changed, 36 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 7d3e69efb0..373b12c593 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/NEWS b/NEWS
index 6408bed542..72e15f523f 100644
--- a/NEWS
+++ b/NEWS
@@ -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 7a8ddfa55b..43fc236fc3 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 d115bae0be..160f5ad460 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;
}