Author: akhaldi
Date: Tue Sep 20 09:42:51 2016
New Revision: 72747

URL: http://svn.reactos.org/svn/reactos?rev=72747&view=rev
Log:
[IPHLPAPI] Don't (de)initialize ws2 on dll process (attach/detach), do it on 
IcmpCreateFile/IcmpCloseHandle instead, due to the circular dependency ws2_32 
-> mswsock -> dnsapi(adns lib) -> iphlpapi -> ws2_32. This creates 2 references 
to ws2_32 and ws2_32 can't cleanup on WSACleanup. By Peter Hater. CORE-10440

Modified:
    trunk/reactos/dll/win32/iphlpapi/icmp.c
    trunk/reactos/dll/win32/iphlpapi/iphlpapi_main.c

Modified: trunk/reactos/dll/win32/iphlpapi/icmp.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/iphlpapi/icmp.c?rev=72747&r1=72746&r2=72747&view=diff
==============================================================================
--- trunk/reactos/dll/win32/iphlpapi/icmp.c     [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/iphlpapi/icmp.c     [iso-8859-1] Tue Sep 20 
09:42:51 2016
@@ -114,8 +114,18 @@
 HANDLE WINAPI Icmp6CreateFile(VOID)
 {
     icmp_t* icp;
-
-    int sid=socket(AF_INET6,SOCK_RAW,IPPROTO_ICMPV6);
+    int sid;
+#ifdef __REACTOS__
+    WSADATA wsaData;
+
+    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != ERROR_SUCCESS)
+    {
+        ERR_(winediag)("Failed to use ICMPV6 (network ping), this requires 
special permissions.\n");
+        return INVALID_HANDLE_VALUE;
+    }
+#endif
+
+    sid=socket(AF_INET6,SOCK_RAW,IPPROTO_ICMPV6);
 #ifndef __REACTOS__
     if (sid < 0)
     {
@@ -133,6 +143,7 @@
     if (icp==NULL) {
 #ifdef __REACTOS__
         closesocket(sid);
+        WSACleanup();
 #else
         close(sid);
 #endif
@@ -180,8 +191,17 @@
     static int once;
 #endif
     icmp_t* icp;
-
-    int sid=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
+    int sid;
+#ifdef __REACTOS__
+    WSADATA wsaData;
+
+    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != ERROR_SUCCESS)
+    {
+        ERR_(winediag)("Failed to use ICMPV6 (network ping), this requires 
special permissions.\n");
+        return INVALID_HANDLE_VALUE;
+    }
+#endif
+    sid=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
 #ifdef __REACTOS__
     if (sid < 0) {
         ERR_(winediag)("Failed to use ICMP (network ping), this requires 
special permissions.\n");
@@ -204,6 +224,7 @@
     if (icp==NULL) {
 #ifdef __REACTOS__
         closesocket(sid);
+        WSACleanup();
 #else
         if (sid >= 0) close(sid);
 #endif
@@ -235,6 +256,9 @@
     if (icp->sid >= 0) close(icp->sid);
 #endif
     HeapFree(GetProcessHeap (), 0, icp);
+#ifdef __REACTOS__
+    WSACleanup();
+#endif
     return TRUE;
 }
 

Modified: trunk/reactos/dll/win32/iphlpapi/iphlpapi_main.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/iphlpapi/iphlpapi_main.c?rev=72747&r1=72746&r2=72747&view=diff
==============================================================================
--- trunk/reactos/dll/win32/iphlpapi/iphlpapi_main.c    [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/iphlpapi/iphlpapi_main.c    [iso-8859-1] Tue Sep 20 
09:42:51 2016
@@ -35,17 +35,13 @@
 
 BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 {
-  WSADATA wsaData;
-
   switch (fdwReason) {
     case DLL_PROCESS_ATTACH:
       DisableThreadLibraryCalls( hinstDLL );
       interfaceMapInit();
-      WSAStartup(MAKEWORD(2, 2), &wsaData);
       break;
 
     case DLL_PROCESS_DETACH:
-      WSACleanup();
       interfaceMapFree();
       break;
   }


Reply via email to