Commit fd067c80 authored by Alexander Alashkin's avatar Alexander Alashkin Committed by Cesanta Bot

Fix handles leak in CGI

PUBLISHED_FROM=6052b7bfec6af33328cbe369da60e9672ebac437
parent 04012760
...@@ -6676,7 +6676,7 @@ static void mg_abs_path(const char *utf8_path, char *abs_path, size_t len) { ...@@ -6676,7 +6676,7 @@ static void mg_abs_path(const char *utf8_path, char *abs_path, size_t len) {
WideCharToMultiByte(CP_UTF8, 0, buf2, wcslen(buf2) + 1, abs_path, len, 0, 0); WideCharToMultiByte(CP_UTF8, 0, buf2, wcslen(buf2) + 1, abs_path, len, 0, 0);
} }
static pid_t mg_start_process(const char *interp, const char *cmd, static int mg_start_process(const char *interp, const char *cmd,
const char *env, const char *envp[], const char *env, const char *envp[],
const char *dir, sock_t sock) { const char *dir, sock_t sock) {
STARTUPINFOW si; STARTUPINFOW si;
...@@ -6733,6 +6733,12 @@ static pid_t mg_start_process(const char *interp, const char *cmd, ...@@ -6733,6 +6733,12 @@ static pid_t mg_start_process(const char *interp, const char *cmd,
(void *) env, full_dir, &si, &pi) != 0) { (void *) env, full_dir, &si, &pi) != 0) {
mg_spawn_stdio_thread(sock, a[1], mg_push_to_stdin); mg_spawn_stdio_thread(sock, a[1], mg_push_to_stdin);
mg_spawn_stdio_thread(sock, b[0], mg_pull_from_stdout); mg_spawn_stdio_thread(sock, b[0], mg_pull_from_stdout);
CloseHandle(si.hStdOutput);
CloseHandle(si.hStdInput);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
} else { } else {
CloseHandle(a[1]); CloseHandle(a[1]);
CloseHandle(b[0]); CloseHandle(b[0]);
...@@ -6741,17 +6747,11 @@ static pid_t mg_start_process(const char *interp, const char *cmd, ...@@ -6741,17 +6747,11 @@ static pid_t mg_start_process(const char *interp, const char *cmd,
DBG(("CGI command: [%ls] -> %p", wcmd, pi.hProcess)); DBG(("CGI command: [%ls] -> %p", wcmd, pi.hProcess));
/* Not closing a[0] and b[1] because we've used DUPLICATE_CLOSE_SOURCE */ /* Not closing a[0] and b[1] because we've used DUPLICATE_CLOSE_SOURCE */
CloseHandle(si.hStdOutput);
CloseHandle(si.hStdInput);
/* TODO(lsm): check if we need close process and thread handles too */
/* CloseHandle(pi.hThread); */
/* CloseHandle(pi.hProcess); */
(void) envp; (void) envp;
return pi.hProcess; return (pi.hProcess != NULL);
} }
#else #else
static pid_t mg_start_process(const char *interp, const char *cmd, static int mg_start_process(const char *interp, const char *cmd,
const char *env, const char *envp[], const char *env, const char *envp[],
const char *dir, sock_t sock) { const char *dir, sock_t sock) {
char buf[500]; char buf[500];
...@@ -6791,7 +6791,7 @@ static pid_t mg_start_process(const char *interp, const char *cmd, ...@@ -6791,7 +6791,7 @@ static pid_t mg_start_process(const char *interp, const char *cmd,
exit(EXIT_FAILURE); /* exec call failed */ exit(EXIT_FAILURE); /* exec call failed */
} }
return pid; return (pid != 0);
} }
#endif /* _WIN32 */ #endif /* _WIN32 */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment