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