From aeb9a8a8a97f8b876a378ae4fe330f131437b348 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Tue, 8 Dec 2009 10:23:27 -0700 Subject: [PATCH] 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 --- ChangeLog | 5 +++++ lib/fchdir.c | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) 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; -- 2.11.0