You are viewing a plain text version of this content. The canonical link for it is here.
Posted to bugs@httpd.apache.org by bu...@apache.org on 2004/10/06 17:52:18 UTC
DO NOT REPLY [Bug 31565] New: -
Won't start correctly if parent closed stdin, stdout and stderr
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=31565>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://issues.apache.org/bugzilla/show_bug.cgi?id=31565
Won't start correctly if parent closed stdin, stdout and stderr
Summary: Won't start correctly if parent closed stdin, stdout and
stderr
Product: Apache httpd-2.0
Version: 2.0.51
Platform: PC
OS/Version: Linux
Status: NEW
Severity: Normal
Priority: Other
Component: All
AssignedTo: bugs@httpd.apache.org
ReportedBy: tchan@austin.rr.com
I have this test program which starts apache. The result is the child processes
all die on an accept() call with errno 88 (ENOTSOCK).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
int main (int argc, char *argv[]) {
int i;
char *arg;
if (argc < 2) {
printf("Must specify the path to the executable\n");
exit(1);
}
close(0);
close(1);
close(2);
arg = malloc(strlen(argv[1]) + 1);
strcpy(arg, argv[1]);
for (i = 2; i < argc; i++) {
arg = realloc(arg, strlen(arg) + strlen(argv[i]) + 2);
strcat(arg, " ");
strcat(arg, argv[i]);
}
syslog(LOG_ERR, "Calling system(%s)", arg);
system(arg);
exit(0);
}
If I comment out the close()'s (or open /dev/null in their place), the child
processes will have no problems.
I think the problem is with the order of these events:
First, apache processes the config file with a LISTEN directive, opens the
listen socket(s) and keeps the file descriptor(s) in its table. With no stdin,
stdout, etc, the first listen socket will be fd 0 and so on.
Then later, apr_proc_detach() in srclib/apr/threadproc/unix/procsup.c does
freopen() on stdin, stdout and stderr which, regardless of whether fd 0, 1 and 2
are sockets or the std files, may wipe out listen sockets created earlier.
Later, when accept() is called on the first listen socket, it has already been
freopen() to a file, causing ENOTSOCK.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org