winhttp: Don't close child handles on release.

Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hans Leidekker 2020-06-22 21:39:20 +02:00 committed by Alexandre Julliard
parent 449b8c7e92
commit 9336651477
5 changed files with 25 additions and 24 deletions

View File

@ -79,7 +79,6 @@ void release_object( struct object_header *hdr )
send_callback( hdr, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, &hdr->handle, sizeof(HINTERNET) );
TRACE("destroying object %p\n", hdr);
if (hdr->type != WINHTTP_HANDLE_TYPE_SESSION) list_remove( &hdr->entry );
hdr->vtbl->destroy( hdr );
}
}
@ -89,7 +88,6 @@ HINTERNET alloc_handle( struct object_header *hdr )
struct object_header **p;
ULONG_PTR handle, num;
list_init( &hdr->children );
hdr->handle = NULL;
EnterCriticalSection( &handle_cs );
@ -123,7 +121,7 @@ BOOL free_handle( HINTERNET hinternet )
{
BOOL ret = FALSE;
ULONG_PTR handle = (ULONG_PTR)hinternet;
struct object_header *hdr = NULL, *child, *next;
struct object_header *hdr = NULL;
EnterCriticalSection( &handle_cs );
@ -141,15 +139,7 @@ BOOL free_handle( HINTERNET hinternet )
LeaveCriticalSection( &handle_cs );
if (hdr)
{
LIST_FOR_EACH_ENTRY_SAFE( child, next, &hdr->children, struct object_header, entry )
{
TRACE("freeing child handle %p for parent handle 0x%lx\n", child->handle, handle + 1);
free_handle( child->handle );
}
release_object( hdr );
}
if (hdr) release_object( hdr );
EnterCriticalSection( &handle_cs );
if (next_handle > handle && !handles[handle]) next_handle = handle;

View File

@ -3102,11 +3102,9 @@ HINTERNET WINAPI WinHttpWebSocketCompleteUpgrade( HINTERNET hrequest, DWORD_PTR
socket->hdr.vtbl = &socket_vtbl;
socket->hdr.refs = 1;
socket->hdr.context = context;
list_init( &socket->hdr.children );
addref_object( &request->hdr );
socket->request = request;
list_add_head( &request->hdr.children, &socket->hdr.entry );
if ((hsocket = alloc_handle( &socket->hdr ))) socket->hdr.handle = hsocket;

View File

@ -246,7 +246,6 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWST
session->hdr.flags = flags;
session->hdr.refs = 1;
session->hdr.redirect_policy = WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP;
list_init( &session->hdr.children );
session->resolve_timeout = DEFAULT_RESOLVE_TIMEOUT;
session->connect_timeout = DEFAULT_CONNECT_TIMEOUT;
session->send_timeout = DEFAULT_SEND_TIMEOUT;
@ -552,11 +551,9 @@ HINTERNET WINAPI WinHttpConnect( HINTERNET hsession, LPCWSTR server, INTERNET_PO
connect->hdr.notify_mask = session->hdr.notify_mask;
connect->hdr.context = session->hdr.context;
connect->hdr.redirect_policy = session->hdr.redirect_policy;
list_init( &connect->hdr.children );
addref_object( &session->hdr );
connect->session = session;
list_add_head( &session->hdr.children, &connect->hdr.entry );
if (!(connect->hostname = strdupW( server ))) goto end;
connect->hostport = port;
@ -1121,12 +1118,10 @@ HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR o
request->hdr.notify_mask = connect->hdr.notify_mask;
request->hdr.context = connect->hdr.context;
request->hdr.redirect_policy = connect->hdr.redirect_policy;
list_init( &request->hdr.children );
list_init( &request->task_queue );
addref_object( &connect->hdr );
request->connect = connect;
list_add_head( &connect->hdr.children, &request->hdr.entry );
request->resolve_timeout = connect->session->resolve_timeout;
request->connect_timeout = connect->session->connect_timeout;

View File

@ -3099,6 +3099,7 @@ static void test_websocket(int port)
{
HINTERNET session, connection, request, socket;
DWORD size, len, count, status, index, error;
DWORD_PTR ctx;
WCHAR header[32];
char buf[128];
BOOL ret;
@ -3244,10 +3245,28 @@ static void test_websocket(int port)
/* Send/Receive on websock */
WinHttpCloseHandle(request);
WinHttpCloseHandle(socket);
WinHttpCloseHandle(connection);
WinHttpCloseHandle(session);
ret = WinHttpCloseHandle(connection);
ok(ret, "got %u\n", GetLastError());
/* request handle is still valid */
size = sizeof(ctx);
ret = WinHttpQueryOption(request, WINHTTP_OPTION_CONTEXT_VALUE, &ctx, &size);
ok(ret, "got %u\n", GetLastError());
ret = WinHttpCloseHandle(socket);
ok(ret, "got %u\n", GetLastError());
ret = WinHttpQueryOption(request, WINHTTP_OPTION_CONTEXT_VALUE, &ctx, &size);
ok(ret, "got %u\n", GetLastError());
ret = WinHttpCloseHandle(session);
ok(ret, "got %u\n", GetLastError());
ret = WinHttpQueryOption(request, WINHTTP_OPTION_CONTEXT_VALUE, &ctx, &size);
ok(ret, "got %u\n", GetLastError());
ret = WinHttpCloseHandle(request);
ok(ret, "got %u\n", GetLastError());
}
static void test_not_modified(int port)

View File

@ -51,7 +51,6 @@ struct object_header
WINHTTP_STATUS_CALLBACK callback;
DWORD notify_mask;
struct list entry;
struct list children;
};
struct hostdata