X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/0f0a25075f6e788462506686cf538bc13a5beedb..deb0e1cf33f66de19d6621e54177faa76017786a:/unix/uxproxy.c diff --git a/unix/uxproxy.c b/unix/uxproxy.c index cd256fdb..f4e67589 100644 --- a/unix/uxproxy.c +++ b/unix/uxproxy.c @@ -98,6 +98,8 @@ static void sk_localproxy_close (Socket s) del234(localproxy_by_fromfd, ps); del234(localproxy_by_tofd, ps); + uxsel_del(ps->to_cmd); + uxsel_del(ps->from_cmd); close(ps->to_cmd); close(ps->from_cmd); @@ -221,8 +223,8 @@ static int localproxy_select_result(int fd, int event) Socket platform_new_connection(SockAddr addr, char *hostname, int port, int privport, - int oobinline, int nodelay, Plug plug, - const Config *cfg) + int oobinline, int nodelay, int keepalive, + Plug plug, const Config *cfg) { char *cmd; @@ -263,6 +265,8 @@ Socket platform_new_connection(SockAddr addr, char *hostname, ret->error = dupprintf("pipe: %s", strerror(errno)); return (Socket)ret; } + cloexec(to_cmd_pipe[1]); + cloexec(from_cmd_pipe[0]); pid = fork(); @@ -270,16 +274,15 @@ Socket platform_new_connection(SockAddr addr, char *hostname, ret->error = dupprintf("fork: %s", strerror(errno)); return (Socket)ret; } else if (pid == 0) { - int i; close(0); close(1); dup2(to_cmd_pipe[0], 0); dup2(from_cmd_pipe[1], 1); - for (i = 3; i < 127; i++) - close(i); + close(to_cmd_pipe[0]); + close(from_cmd_pipe[1]); fcntl(0, F_SETFD, 0); fcntl(1, F_SETFD, 0); - execl("/bin/sh", "sh", "-c", cmd, NULL); + execl("/bin/sh", "sh", "-c", cmd, (void *)NULL); _exit(255); } @@ -299,5 +302,8 @@ Socket platform_new_connection(SockAddr addr, char *hostname, uxsel_set(ret->from_cmd, 1, localproxy_select_result); + /* We are responsible for this and don't need it any more */ + sk_addr_free(addr); + return (Socket) ret; }