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:
parent
a6ae999b3b
commit
27c290f7f2
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user