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>
+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
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;