Misha Koshelev : wininet: Track child handles, free all child handles on WININET_FreeHandle as native.

Alexandre Julliard julliard at winehq.org
Fri Sep 21 07:23:02 CDT 2007


Module: wine
Branch: master
Commit: 728e5fa55966987c3a2fdc96d8890987eb7b7e9d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=728e5fa55966987c3a2fdc96d8890987eb7b7e9d

Author: Misha Koshelev <mk144210 at bcm.edu>
Date:   Thu Sep 20 20:59:40 2007 -0500

wininet: Track child handles, free all child handles on WININET_FreeHandle as native.

---

 dlls/wininet/cookie.c   |    2 --
 dlls/wininet/ftp.c      |    3 +++
 dlls/wininet/http.c     |    2 ++
 dlls/wininet/internet.c |   15 ++++++++++++++-
 dlls/wininet/internet.h |    3 +++
 dlls/wininet/urlcache.c |    1 -
 6 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/dlls/wininet/cookie.c b/dlls/wininet/cookie.c
index b479aa7..abf897a 100644
--- a/dlls/wininet/cookie.c
+++ b/dlls/wininet/cookie.c
@@ -39,8 +39,6 @@
 #include "wine/debug.h"
 #include "internet.h"
 
-#include "wine/list.h"
-
 #define RESPONSE_TIMEOUT        30            /* FROM internet.c */
 
 
diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c
index 901f0a2..805ab44 100644
--- a/dlls/wininet/ftp.c
+++ b/dlls/wininet/ftp.c
@@ -1128,6 +1128,7 @@ HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs,
 
         WININET_AddRef( &lpwfs->hdr );
         lpwh->lpFtpSession = lpwfs;
+        list_add_head( &lpwfs->hdr.children, &lpwh->hdr.entry );
 	
         handle = WININET_AllocHandle( &lpwh->hdr );
         if( !handle )
@@ -1904,6 +1905,7 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
 
     WININET_AddRef( &hIC->hdr );
     lpwfs->lpAppInfo = hIC;
+    list_add_head( &hIC->hdr.children, &lpwfs->hdr.entry );
 
     handle = WININET_AllocHandle( &lpwfs->hdr );
     if( !handle )
@@ -3012,6 +3014,7 @@ static HINTERNET FTP_ReceiveFileList(LPWININETFTPSESSIONW lpwfs, INT nSocket, LP
 
             WININET_AddRef( &lpwfs->hdr );
             lpwfn->lpFtpSession = lpwfs;
+            list_add_head( &lpwfs->hdr.children, &lpwfn->hdr.entry );
 
             handle = WININET_AllocHandle( &lpwfn->hdr );
         }
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index c1b8864..454d332 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1371,6 +1371,7 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
 
     WININET_AddRef( &lpwhs->hdr );
     lpwhr->lpHttpSession = lpwhs;
+    list_add_head( &lpwhs->hdr.children, &lpwhr->hdr.entry );
 
     handle = WININET_AllocHandle( &lpwhr->hdr );
     if (NULL == handle)
@@ -2824,6 +2825,7 @@ HINTERNET HTTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
 
     WININET_AddRef( &hIC->hdr );
     lpwhs->lpAppInfo = hIC;
+    list_add_head( &hIC->hdr.children, &lpwhs->hdr.entry );
 
     handle = WININET_AllocHandle( &lpwhs->hdr );
     if (NULL == handle)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 345b2aa..5e95a12 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -105,6 +105,8 @@ HINTERNET WININET_AllocHandle( LPWININETHANDLEHEADER info )
     LPWININETHANDLEHEADER *p;
     UINT handle = 0, num;
 
+    list_init( &info->children );
+
     EnterCriticalSection( &WININET_cs );
     if( !WININET_dwMaxHandles )
     {
@@ -182,6 +184,8 @@ BOOL WININET_Release( LPWININETHANDLEHEADER info )
                               INTERNET_STATUS_HANDLE_CLOSING, &info->hInternet,
                               sizeof(HINTERNET));
         TRACE( "destroying object %p\n", info);
+        if ( info->htype != WH_HINIT )
+            list_remove( &info->entry );
         info->destroy( info );
     }
     return TRUE;
@@ -191,7 +195,7 @@ BOOL WININET_FreeHandle( HINTERNET hinternet )
 {
     BOOL ret = FALSE;
     UINT handle = (UINT) hinternet;
-    LPWININETHANDLEHEADER info = NULL;
+    LPWININETHANDLEHEADER info = NULL, child, next;
 
     EnterCriticalSection( &WININET_cs );
 
@@ -212,7 +216,16 @@ BOOL WININET_FreeHandle( HINTERNET hinternet )
     LeaveCriticalSection( &WININET_cs );
 
     if( info )
+    {
+        /* Free all children as native does */
+        LIST_FOR_EACH_ENTRY_SAFE( child, next, &info->children, WININETHANDLEHEADER, entry )
+        {
+            TRACE( "freeing child handle %d for parent handle %d\n",
+                   (UINT)child->hInternet, handle+1);
+            WININET_FreeHandle( child->hInternet );
+        }
         WININET_Release( info );
+    }
 
     return ret;
 }
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index c820975..0f283e1 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -28,6 +28,7 @@
 #endif
 
 #include "wine/unicode.h"
+#include "wine/list.h"
 
 #include <time.h>
 #ifdef HAVE_NETDB_H
@@ -149,6 +150,8 @@ struct _WININETHANDLEHEADER
     WININET_object_function close_connection;
     WININET_object_function destroy;
     INTERNET_STATUS_CALLBACK lpfnStatusCB;
+    struct list entry;
+    struct list children;
 };
 
 
diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c
index 2692dfe..d9db16f 100644
--- a/dlls/wininet/urlcache.c
+++ b/dlls/wininet/urlcache.c
@@ -46,7 +46,6 @@
 #include "shlobj.h"
 
 #include "wine/unicode.h"
-#include "wine/list.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(wininet);




More information about the wine-cvs mailing list