X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=windows%2Fwinproxy.c;h=813c4fe9a76bc21ac0a1d0667a4bd47faf5f2e80;hb=21101c7397e460933635a7bfed813864fc4f88fe;hp=4430a8cbc9f265dbc53ae000a48af1a9155658e2;hpb=3d4d4004e83f19310d90e6341dbf363a47382ec2;p=PuTTY.git diff --git a/windows/winproxy.c b/windows/winproxy.c index 4430a8cb..813c4fe9 100644 --- a/windows/winproxy.c +++ b/windows/winproxy.c @@ -13,8 +13,8 @@ #include "network.h" #include "proxy.h" -Socket make_handle_socket(HANDLE send_H, HANDLE recv_H, Plug plug, - int overlapped); +Socket make_handle_socket(HANDLE send_H, HANDLE recv_H, HANDLE stderr_H, + Plug plug, int overlapped); Socket platform_new_connection(SockAddr addr, const char *hostname, int port, int privport, @@ -22,7 +22,9 @@ Socket platform_new_connection(SockAddr addr, const char *hostname, Plug plug, Conf *conf) { char *cmd; - HANDLE us_to_cmd, us_from_cmd, cmd_to_us, cmd_from_us; + HANDLE us_to_cmd, cmd_from_us; + HANDLE us_from_cmd, cmd_to_us; + HANDLE us_from_cmd_err, cmd_err_to_us; SECURITY_ATTRIBUTES sa; STARTUPINFO si; PROCESS_INFORMATION pi; @@ -64,8 +66,25 @@ Socket platform_new_connection(SockAddr addr, const char *hostname, return ret; } + if (flags & FLAG_STDERR) { + /* If we have a sensible stderr, the proxy command can send + * its own standard error there, so we won't interfere. */ + us_from_cmd_err = cmd_err_to_us = NULL; + } else { + /* If we don't have a sensible stderr, we should catch the + * proxy command's standard error to put in our event log. */ + if (!CreatePipe(&us_from_cmd_err, &cmd_err_to_us, &sa, 0)) { + Socket ret = new_error_socket + ("Unable to create pipes for proxy command", plug); + sfree(cmd); + return ret; + } + } + SetHandleInformation(us_to_cmd, HANDLE_FLAG_INHERIT, 0); SetHandleInformation(us_from_cmd, HANDLE_FLAG_INHERIT, 0); + if (us_from_cmd_err != NULL) + SetHandleInformation(us_from_cmd_err, HANDLE_FLAG_INHERIT, 0); si.cb = sizeof(si); si.lpReserved = NULL; @@ -76,7 +95,7 @@ Socket platform_new_connection(SockAddr addr, const char *hostname, si.lpReserved2 = NULL; si.hStdInput = cmd_from_us; si.hStdOutput = cmd_to_us; - si.hStdError = NULL; + si.hStdError = cmd_err_to_us; CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); @@ -88,5 +107,9 @@ Socket platform_new_connection(SockAddr addr, const char *hostname, CloseHandle(cmd_from_us); CloseHandle(cmd_to_us); - return make_handle_socket(us_to_cmd, us_from_cmd, plug, FALSE); + if (cmd_err_to_us != NULL) + CloseHandle(cmd_err_to_us); + + return make_handle_socket(us_to_cmd, us_from_cmd, us_from_cmd_err, + plug, FALSE); }