diff options
author | maxim <maxim@FreeBSD.org> | 2004-09-24 13:21:52 +0000 |
---|---|---|
committer | maxim <maxim@FreeBSD.org> | 2004-09-24 13:21:52 +0000 |
commit | b218fbfba398a6e12e69d299b5d54a1680ba641b (patch) | |
tree | e3c02feaa82a40882009e79e9f3ac64d894992ae | |
parent | 0894086aa2327afe4a2847350385fd55db6c7e1b (diff) | |
download | FreeBSD-src-b218fbfba398a6e12e69d299b5d54a1680ba641b.zip FreeBSD-src-b218fbfba398a6e12e69d299b5d54a1680ba641b.tar.gz |
o Merge rev. 1.5 libexec/ftpd/ftpd.c from DragonflyBSD:
Do not unconditionally fork() after accept(). accept() can
return -1 due to an interrupted system call (i.e. SIGCHLD).
If we fork in that case ftpd can get into an
accept()/SIGCHLD/fork/[fail]/repeat loop.
Reported-by: fabian <fabian.duelli@bluewin.ch>
Obtained from: DragonflyBSD
MFC after: 1 month
-rw-r--r-- | libexec/ftpd/ftpd.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/libexec/ftpd/ftpd.c b/libexec/ftpd/ftpd.c index 46b1101..a721ca2 100644 --- a/libexec/ftpd/ftpd.c +++ b/libexec/ftpd/ftpd.c @@ -503,6 +503,7 @@ main(int argc, char *argv[], char **envp) fd = accept(ctl_sock[i], (struct sockaddr *)&his_addr, &addrlen); + if (fd >= 0) { if ((pid = fork()) == 0) { /* child */ (void) dup2(fd, 0); @@ -510,6 +511,7 @@ main(int argc, char *argv[], char **envp) close(ctl_sock[i]); } else close(fd); + } } if (pid == 0) break; |