X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=windows%2Fwinproxy.c;h=813c4fe9a76bc21ac0a1d0667a4bd47faf5f2e80;hb=9c3700a6d3d037bd823a65f5837264605891b2ea;hp=949546000f0c833fb80ed3e7131d7dc1b1675d6c;hpb=f7713d452d37e9b314af48bb295d418b185989b7;p=PuTTY.git diff --git a/windows/winproxy.c b/windows/winproxy.c index 94954600..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; @@ -37,9 +39,7 @@ Socket platform_new_connection(SockAddr addr, const char *hostname, { char *msg = dupprintf("Starting local proxy command: %s", cmd); - /* We're allowed to pass NULL here, because we're part of the Windows - * front end so we know logevent doesn't expect any data. */ - logevent(NULL, msg); + plug_log(plug, 2, NULL, 0, msg, 0); sfree(msg); } @@ -66,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; @@ -78,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); @@ -90,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); }