<div dir="ltr"><div>From 991ce8e253fe794dcf77c31dc1eca75c6c654289 Mon Sep 17 00:00:00 2001</div><div>From: Matt Durgavich <<a href="mailto:mattdurgavich@gmail.com">mattdurgavich@gmail.com</a>></div><div>Date: Fri, 31 Jul 2015 23:05:49 -0400</div><div>Subject: ws2_32: WSACleanup cleans up open sockets (OSX only)</div><div><br></div><div>---</div><div> <a href="http://configure.ac">configure.ac</a>         |  2 +-</div><div> dlls/ws2_32/socket.c | 38 ++++++++++++++++++++++++++++++++++++++</div><div> 2 files changed, 39 insertions(+), 1 deletion(-)</div><div><br></div><div>diff --git a/<a href="http://configure.ac">configure.ac</a> b/<a href="http://configure.ac">configure.ac</a></div><div>index 45b8fdb..9b2fe14 100644</div><div>--- a/<a href="http://configure.ac">configure.ac</a></div><div>+++ b/<a href="http://configure.ac">configure.ac</a></div><div>@@ -867,7 +867,7 @@ uninstall::</div><div>     libwine_targets="libwine.dylib libwine.$libwine_soversion.dylib libwine.$libwine_version.dylib"</div><div>     AC_SUBST(LIBWINE_RULES,["</div><div> OBJS = \$(C_SRCS:.c=.o) \$(EXTRA_OBJS)</div><div>-</div><div>+    AC_CHECK_HEADER(libproc.h, AC_DEFINE(HAVE_LIBPROC_H))</div><div> all: libwine.dylib</div><div> </div><div> libwine.$libwine_version.dylib: \$(OBJS)</div><div>diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c</div><div>index b06d7e7..f9cef96 100644</div><div>--- a/dlls/ws2_32/socket.c</div><div>+++ b/dlls/ws2_32/socket.c</div><div>@@ -132,6 +132,14 @@</div><div> # include <sys/time.h></div><div> #endif</div><div> </div><div>+#ifdef HAVE_LIBPROC_H</div><div>+# include <libproc.h></div><div>+#endif</div><div>+</div><div>+#include <unistd.h></div><div>+#include <stdio.h></div><div>+#include <stdlib.h></div><div>+</div><div> #define NONAMELESSUNION</div><div> #define NONAMELESSSTRUCT</div><div> #include "ntstatus.h"</div><div>@@ -1449,6 +1457,30 @@ int WINAPI WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)</div><div>     return 0;</div><div> }</div><div> </div><div>+static void close_open_sockets() {</div><div>+#ifdef HAVE_LIBPROC_H</div><div>+    int pid = getpid();</div><div>+    int bufferSizeNeeded = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0);</div><div>+    if (bufferSizeNeeded > 0) {</div><div>+        struct proc_fdinfo *infos = (struct proc_fdinfo*)malloc(bufferSizeNeeded);</div><div>+        int ret = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, infos, bufferSizeNeeded);</div><div>+        int numfds = bufferSizeNeeded / PROC_PIDLISTFD_SIZE;</div><div>+        if (ret >= 0) {</div><div>+            for (int i = 0; i < numfds; ++i ) {</div><div>+                int32_t fd = infos[i].proc_fd;</div><div>+                uint32_t type = infos[i].proc_fdtype;</div><div>+                if (type == PROX_FDTYPE_SOCKET) {</div><div>+                    TRACE("Closing socket with descriptor %d\n", fd);</div><div>+                    close(fd);</div><div>+                } </div><div>+            }</div><div>+        }</div><div>+        free(infos);</div><div>+    }</div><div>+#else</div><div>+    FIXME("stub")</div><div>+#endif</div><div>+}</div><div> </div><div> /***********************************************************************</div><div>  *      WSACleanup<span class="Apple-tab-span" style="white-space:pre">                  </span>(WS2_32.116)</div><div>@@ -1458,8 +1490,14 @@ INT WINAPI WSACleanup(void)</div><div>     if (num_startup) {</div><div>         num_startup--;</div><div>         TRACE("pending cleanups: %d\n", num_startup);</div><div>+        if (num_startup == 0) {</div><div>+            TRACE("cleaning up open sockets");</div><div>+            close_open_sockets();</div><div>+        }</div><div>         return 0;</div><div>     }</div><div>+</div><div>+    /* Close all sockets */</div><div>     SetLastError(WSANOTINITIALISED);</div><div>     return SOCKET_ERROR;</div><div> }</div></div>