Jelajahi Sumber

Fix "POST data to CGI-script does not receive EO" for Windows

See #296
(TODO: Tests)
bel 9 tahun lalu
induk
melakukan
6711246563
1 mengubah file dengan 14 tambahan dan 6 penghapusan
  1. 14 6
      src/civetweb.c

+ 14 - 6
src/civetweb.c

@@ -3320,6 +3320,14 @@ spawn_process(struct mg_connection *conn,
 	                TRUE,
 	                DUPLICATE_SAME_ACCESS);
 
+    /* Close unsued handles, so they are not inherited.
+     * (Already tested close, according to https://support.microsoft.com/en-us/kb/190351, but this does not work here)
+     * TODO: check https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499%28v=vs.85%29.aspx
+     */
+    SetHandleInformation((HANDLE)_get_osfhandle(fdin[1]), HANDLE_FLAG_INHERIT, 0);
+    SetHandleInformation((HANDLE)_get_osfhandle(fdout[0]), HANDLE_FLAG_INHERIT, 0);
+    SetHandleInformation((HANDLE)_get_osfhandle(fderr[0]), HANDLE_FLAG_INHERIT, 0);
+
 	/* If CGI file is a script, try to read the interpreter line */
 	interp = conn->ctx->config[CGI_INTERPRETER];
 	if (interp == NULL) {
@@ -7388,12 +7396,12 @@ handle_cgi_request(struct mg_connection *conn, const char *prog)
 	}
 
 	/* Make sure child closes all pipe descriptors. It must dup them to 0,1 */
-	set_close_on_exec((SOCKET)fdin[0], conn);
-	set_close_on_exec((SOCKET)fdin[1], conn);
-	set_close_on_exec((SOCKET)fdout[0], conn);
-	set_close_on_exec((SOCKET)fdout[1], conn);
-	set_close_on_exec((SOCKET)fderr[0], conn);
-	set_close_on_exec((SOCKET)fderr[1], conn);
+	set_close_on_exec((SOCKET)fdin[0], conn);  /* stdin read */
+	set_close_on_exec((SOCKET)fdout[1], conn); /* stdout write */
+	set_close_on_exec((SOCKET)fderr[1], conn); /* stderr write */
+	set_close_on_exec((SOCKET)fdin[1], conn);  /* stdin write */
+	set_close_on_exec((SOCKET)fdout[0], conn); /* stdout read */
+	set_close_on_exec((SOCKET)fderr[0], conn); /* stderr read */
 
 	/* Parent closes only one side of the pipes.
 	 * If we don't mark them as closed, close() attempt before