From 89e97516fedf1d0a7fe9c569bb569fa7ea872afa Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 23 Nov 2006 14:32:11 +0000 Subject: [PATCH] I've just discovered that using the saved sessions menu from Unix PuTTY causes the child process to inherit a lot of socket fds from its parent, which is a pain if one of them then ends up holding open a listening socket which the parent was using for port forwarding after the parent itself is dead. Therefore, this checkin sprinkles FD_CLOEXEC throughout the Unix platform directory wherever there looks like being a long-lived fd. git-svn-id: svn://svn.tartarus.org/sgt/putty@6917 cda61777-01e9-0310-a592-d414129be87e --- unix/uxagentc.c | 3 +++ unix/uxnet.c | 4 ++++ unix/uxpty.c | 8 +++++++- unix/uxser.c | 2 ++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/unix/uxagentc.c b/unix/uxagentc.c index 826e4394..7b737d1d 100644 --- a/unix/uxagentc.c +++ b/unix/uxagentc.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "putty.h" #include "misc.h" @@ -121,6 +122,8 @@ int agent_query(void *in, int inlen, void **out, int *outlen, exit(1); } + fcntl(sock, F_SETFD, FD_CLOEXEC); + addr.sun_family = AF_UNIX; strncpy(addr.sun_path, name, sizeof(addr.sun_path)); if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { diff --git a/unix/uxnet.c b/unix/uxnet.c index d01a44d9..2b3d8cbc 100644 --- a/unix/uxnet.c +++ b/unix/uxnet.c @@ -470,6 +470,8 @@ static int try_connect(Actual_Socket sock) goto ret; } + fcntl(s, F_SETFD, FD_CLOEXEC); + if (sock->oobinline) { int b = TRUE; setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (void *) &b, sizeof(b)); @@ -723,6 +725,8 @@ Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only, i return (Socket) ret; } + fcntl(s, F_SETFD, FD_CLOEXEC); + ret->oobinline = 0; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on)); diff --git a/unix/uxpty.c b/unix/uxpty.c index 50e53714..e47f7981 100644 --- a/unix/uxpty.c +++ b/unix/uxpty.c @@ -275,8 +275,10 @@ static void fatal_sig_handler(int signum) static int pty_open_slave(Pty pty) { - if (pty->slave_fd < 0) + if (pty->slave_fd < 0) { pty->slave_fd = open(pty->name, O_RDWR); + fcntl(pty->slave_fd, F_SETFD, FD_CLOEXEC); + } return pty->slave_fd; } @@ -307,6 +309,8 @@ static void pty_open_master(Pty pty) strcpy(pty->name, master_name); pty->name[5] = 't'; /* /dev/ptyXX -> /dev/ttyXX */ + fcntl(pty->master_fd, F_SETFD, FD_CLOEXEC); + if (pty_open_slave(pty) >= 0 && access(pty->name, R_OK | W_OK) == 0) goto got_one; @@ -346,6 +350,8 @@ static void pty_open_master(Pty pty) exit(1); } + fcntl(pty->master_fd, F_SETFD, FD_CLOEXEC); + pty->name[FILENAME_MAX-1] = '\0'; strncpy(pty->name, ptsname(pty->master_fd), FILENAME_MAX-1); #endif diff --git a/unix/uxser.c b/unix/uxser.c index d6471084..08f21575 100644 --- a/unix/uxser.c +++ b/unix/uxser.c @@ -257,6 +257,8 @@ static const char *serial_init(void *frontend_handle, void **backend_handle, if (serial->fd < 0) return "Unable to open serial port"; + fcntl(serial->fd, F_SETFD, FD_CLOEXEC); + err = serial_configure(serial, cfg); if (err) return err; -- 2.11.0