fchdir: avoid memory leak on re-registration.
authorEric Blake <ebb9@byu.net>
Tue, 8 Dec 2009 17:23:27 +0000 (10:23 -0700)
committerEric Blake <ebb9@byu.net>
Wed, 9 Dec 2009 04:14:26 +0000 (21:14 -0700)
Some code paths (such as dup3) could overwrite one registered
directory fd with another, and must not leak the old name.

* lib/fchdir.c (ensure_dirs_slot): Avoid memory leak.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
lib/fchdir.c

index 0afec2e..8597a13 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-12-08  Eric Blake  <ebb9@byu.net>
+
+       fchdir: avoid memory leak on re-registration.
+       * lib/fchdir.c (ensure_dirs_slot): Avoid memory leak.
+
 2009-12-08  Jim Meyering  <meyering@redhat.com>
 
        init.sh: avoid Solaris 10 /bin/sh portability problem
index 4cc0f33..545b207 100644 (file)
@@ -60,12 +60,15 @@ typedef struct
 static dir_info_t *dirs;
 static size_t dirs_allocated;
 
-/* Try to ensure dirs has enough room for a slot at index fd.  Return
-   false and set errno to ENOMEM on allocation failure.  */
+/* Try to ensure dirs has enough room for a slot at index fd; free any
+   contents already in that slot.  Return false and set errno to
+   ENOMEM on allocation failure.  */
 static bool
 ensure_dirs_slot (size_t fd)
 {
-  if (fd >= dirs_allocated)
+  if (fd < dirs_allocated)
+    free (dirs[fd].name);
+  else
     {
       size_t new_allocated;
       dir_info_t *new_dirs;