]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - windows/winnet.c
Make Windows sockets non-inheritable
[PuTTY.git] / windows / winnet.c
index b4ac166cd2d99710a2c655c1a98619d8e5e0b11c..9875323744cda7ffbdf2377061231176debc848a 100644 (file)
@@ -5,11 +5,15 @@
  * unfix.org.
  */
 
+#include <winsock2.h> /* need to put this first, for winelib builds */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <assert.h>
 
 #define DEFINE_PLUG_METHOD_MACROS
+#define NEED_DECLARATION_OF_SELECT     /* in order to initialise it */
+
 #include "putty.h"
 #include "network.h"
 #include "tree234.h"
 #include <ws2tcpip.h>
 
 #ifndef NO_IPV6
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmissing-braces"
+#endif
 const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
 const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
 #endif
 
 #define ipv4_is_loopback(addr) \
@@ -229,6 +240,13 @@ int sk_startup(int hi, int lo)
     return TRUE;
 }
 
+/* Actually define this function pointer, which won't have been
+ * defined alongside all the others by PUTTY_DO_GLOBALS because of the
+ * annoying winelib header-ordering issue. (See comment in winstuff.h.) */
+DECL_WINDOWS_FUNCTION(/* empty */, int, select,
+                     (int, fd_set FAR *, fd_set FAR *,
+                      fd_set FAR *, const struct timeval FAR *));
+
 void sk_init(void)
 {
 #ifndef NO_IPV6
@@ -756,6 +774,8 @@ static int ipv4_is_local_addr(struct in_addr addr)
        SOCKET s = p_socket(AF_INET, SOCK_DGRAM, 0);
        DWORD retbytes;
 
+       SetHandleInformation((HANDLE)s, HANDLE_FLAG_INHERIT, 0);
+
        if (p_WSAIoctl &&
            p_WSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0,
                       local_interfaces, sizeof(local_interfaces),
@@ -1004,6 +1024,8 @@ static DWORD try_connect(Actual_Socket sock)
        goto ret;
     }
 
+       SetHandleInformation((HANDLE)s, HANDLE_FLAG_INHERIT, 0);
+
     if (sock->oobinline) {
        BOOL b = TRUE;
        p_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (void *) &b, sizeof(b));
@@ -1285,6 +1307,8 @@ Socket sk_newlistener(const char *srcaddr, int port, Plug plug,
        return (Socket) ret;
     }
 
+       SetHandleInformation((HANDLE)s, HANDLE_FLAG_INHERIT, 0);
+
     ret->oobinline = 0;
 
     p_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&on, sizeof(on));