From: Eric Blake Date: Tue, 8 Dec 2009 17:23:27 +0000 (-0700) Subject: fchdir: avoid memory leak on re-registration. X-Git-Tag: v0.1~5082 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=aeb9a8a8a97f8b876a378ae4fe330f131437b348;p=gnulib.git fchdir: avoid memory leak on re-registration. 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 --- diff --git a/ChangeLog b/ChangeLog index 0afec2e66..8597a13e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-12-08 Eric Blake + + fchdir: avoid memory leak on re-registration. + * lib/fchdir.c (ensure_dirs_slot): Avoid memory leak. + 2009-12-08 Jim Meyering init.sh: avoid Solaris 10 /bin/sh portability problem diff --git a/lib/fchdir.c b/lib/fchdir.c index 4cc0f33ce..545b207ff 100644 --- a/lib/fchdir.c +++ b/lib/fchdir.c @@ -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;