From 27c290f7f29fc57385d53893bfd7301db4708e9c Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 27 Jun 2014 12:37:00 +0200 Subject: [PATCH] ftpd: for LIST, open current directory *in the child* Last change introduced an open fd leak. This is the fix. Signed-off-by: Denys Vlasenko --- networking/ftpd.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/networking/ftpd.c b/networking/ftpd.c index 839a85d73..e7cf5f431 100644 --- a/networking/ftpd.c +++ b/networking/ftpd.c @@ -620,9 +620,7 @@ popen_ls(const char *opt) const char *argv[5]; struct fd_pair outfd; pid_t pid; -#if !BB_MMU - int cur_fd = xopen(".", O_RDONLY | O_DIRECTORY); -#endif + argv[0] = "ftpd"; argv[1] = opt; /* "-l" or "-1" */ argv[2] = "--"; @@ -646,6 +644,9 @@ popen_ls(const char *opt) /*fflush_all(); - so far we dont use stdio on output */ pid = BB_MMU ? xfork() : xvfork(); if (pid == 0) { +#if !BB_MMU + int cur_fd; +#endif /* child */ /* NB: close _first_, then move fd! */ close(outfd.rd); @@ -660,6 +661,7 @@ popen_ls(const char *opt) /* memset(&G, 0, sizeof(G)); - ls_main does it */ exit(ls_main(ARRAY_SIZE(argv) - 1, (char**) argv)); #else + cur_fd = xopen(".", O_RDONLY | O_DIRECTORY); /* On NOMMU, we want to execute a child - copy of ourself * in order to unblock parent after vfork. * In chroot we usually can't re-exec. Thus we escape