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 <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2014-06-27 12:37:00 +02:00
parent a6ae999b3b
commit 27c290f7f2

View File

@ -620,9 +620,7 @@ popen_ls(const char *opt)
const char *argv[5]; const char *argv[5];
struct fd_pair outfd; struct fd_pair outfd;
pid_t pid; pid_t pid;
#if !BB_MMU
int cur_fd = xopen(".", O_RDONLY | O_DIRECTORY);
#endif
argv[0] = "ftpd"; argv[0] = "ftpd";
argv[1] = opt; /* "-l" or "-1" */ argv[1] = opt; /* "-l" or "-1" */
argv[2] = "--"; argv[2] = "--";
@ -646,6 +644,9 @@ popen_ls(const char *opt)
/*fflush_all(); - so far we dont use stdio on output */ /*fflush_all(); - so far we dont use stdio on output */
pid = BB_MMU ? xfork() : xvfork(); pid = BB_MMU ? xfork() : xvfork();
if (pid == 0) { if (pid == 0) {
#if !BB_MMU
int cur_fd;
#endif
/* child */ /* child */
/* NB: close _first_, then move fd! */ /* NB: close _first_, then move fd! */
close(outfd.rd); close(outfd.rd);
@ -660,6 +661,7 @@ popen_ls(const char *opt)
/* memset(&G, 0, sizeof(G)); - ls_main does it */ /* memset(&G, 0, sizeof(G)); - ls_main does it */
exit(ls_main(ARRAY_SIZE(argv) - 1, (char**) argv)); exit(ls_main(ARRAY_SIZE(argv) - 1, (char**) argv));
#else #else
cur_fd = xopen(".", O_RDONLY | O_DIRECTORY);
/* On NOMMU, we want to execute a child - copy of ourself /* On NOMMU, we want to execute a child - copy of ourself
* in order to unblock parent after vfork. * in order to unblock parent after vfork.
* In chroot we usually can't re-exec. Thus we escape * In chroot we usually can't re-exec. Thus we escape