]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
test-skeleton: Support temporary files without memory leaks [BZ#18333]
authorFlorian Weimer <fweimer@redhat.com>
Mon, 27 Apr 2015 13:41:03 +0000 (15:41 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Mon, 27 Apr 2015 14:19:55 +0000 (16:19 +0200)
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.

ChangeLog
NEWS
test-skeleton.c
time/tzset.c

index 7d3e69efb06e54a1f8bd7600710cc9b6ae42d465..373b12c593a42ddeb4205affbb4fe15c6d63305c 100644 (file)
--- 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 6408bed542119c253a3d5b7a7e8ba7f62a3fc67f..72e15f523f000259177a6d30ecdded84205b927e 100644 (file)
--- 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.
index 7a8ddfa55b88d5cff3262bfa14c36c18aaaebeff..43fc236fc3b81c1245443206c68d3cd65a89668d 100644 (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;
 }
index d115bae0bef91c07f1f604d6920cc35ea49fd60c..160f5ad460e4f62477ec0ed27fcace2a3dedfc3e 100644 (file)
@@ -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;
 }