coar 98/10/01 19:02:42
Modified: src/main alloc.c
Log:
When the pipe handles are created, the security descriptor
indicates that the handle can be inherited. However, we do not
want the server side handles to the pipe to be inherited by the
child CGI process. If the child CGI does inherit the server
side handles, then the child may be left around if the server
closes its handles (e.g. if the http connection is aborted),
because the child will have a valid copy of handles to both
sides of the pipes, and no I/O error will occur. Microsoft
recommends using DuplicateHandle to turn off the inherit bit
under NT and Win95.
PR: 2884, 2910
Submitted by: Ken Parzygnat <[EMAIL PROTECTED]>
Reviewed by: Ken Coar
Revision Changes Path
1.101 +55 -0 apache-1.3/src/main/alloc.c
Index: alloc.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/main/alloc.c,v
retrieving revision 1.100
retrieving revision 1.101
diff -u -r1.100 -r1.101
--- alloc.c 1998/09/25 23:01:49 1.100
+++ alloc.c 1998/10/02 02:02:41 1.101
@@ -2222,6 +2222,10 @@
HANDLE hPipeInputWrite = NULL;
HANDLE hPipeErrorRead = NULL;
HANDLE hPipeErrorWrite = NULL;
+ HANDLE hPipeInputWriteDup = NULL;
+ HANDLE hPipeOutputReadDup = NULL;
+ HANDLE hPipeErrorReadDup = NULL;
+ HANDLE hCurrentProcess;
int pid = 0;
child_info info;
@@ -2259,6 +2263,57 @@
CloseHandle(hPipeOutputWrite);
}
return 0;
+ }
+ /*
+ * When the pipe handles are created, the security descriptor
+ * indicates that the handle can be inherited. However, we do not
+ * want the server side handles to the pipe to be inherited by the
+ * child CGI process. If the child CGI does inherit the server
+ * side handles, then the child may be left around if the server
+ * closes its handles (e.g. if the http connection is aborted),
+ * because the child will have a valid copy of handles to both
+ * sides of the pipes, and no I/O error will occur. Microsoft
+ * recommends using DuplicateHandle to turn off the inherit bit
+ * under NT and Win95.
+ */
+ hCurrentProcess = GetCurrentProcess();
+ if ((pipe_in && !DuplicateHandle(hCurrentProcess, hPipeInputWrite,
+ hCurrentProcess,
+ &hPipeInputWriteDup, 0, FALSE,
+ DUPLICATE_SAME_ACCESS))
+ || (pipe_out && !DuplicateHandle(hCurrentProcess, hPipeOutputRead,
+ hCurrentProcess, &hPipeOutputReadDup,
+ 0, FALSE, DUPLICATE_SAME_ACCESS))
+ || (pipe_err && !DuplicateHandle(hCurrentProcess, hPipeErrorRead,
+ hCurrentProcess, &hPipeErrorReadDup,
+ 0, FALSE, DUPLICATE_SAME_ACCESS))) {
+ if (pipe_in) {
+ CloseHandle(hPipeInputRead);
+ CloseHandle(hPipeInputWrite);
+ }
+ if (pipe_out) {
+ CloseHandle(hPipeOutputRead);
+ CloseHandle(hPipeOutputWrite);
+ }
+ if (pipe_err) {
+ CloseHandle(hPipeErrorRead);
+ CloseHandle(hPipeErrorWrite);
+ }
+ return 0;
+ }
+ else {
+ if (pipe_in) {
+ CloseHandle(hPipeInputWrite);
+ hPipeInputWrite = hPipeInputWriteDup;
+ }
+ if (pipe_out) {
+ CloseHandle(hPipeOutputRead);
+ hPipeOutputRead = hPipeOutputReadDup;
+ }
+ if (pipe_err) {
+ CloseHandle(hPipeErrorRead);
+ hPipeErrorRead = hPipeErrorReadDup;
+ }
}
/* The script writes stdout to this pipe handle */