I've just discovered that using the saved sessions menu from Unix
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Thu, 23 Nov 2006 14:32:11 +0000 (14:32 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Thu, 23 Nov 2006 14:32:11 +0000 (14:32 +0000)
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
unix/uxnet.c
unix/uxpty.c
unix/uxser.c

index 826e439..7b737d1 100644 (file)
@@ -8,6 +8,7 @@
 #include <unistd.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#include <fcntl.h>
 
 #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) {
index d01a44d..2b3d8cb 100644 (file)
@@ -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));
index 50e5371..e47f798 100644 (file)
@@ -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
index d647108..08f2157 100644 (file)
@@ -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;