Hans Leidekker : wininet: Separate socket destruction from destruction of the connection object.

Alexandre Julliard julliard at winehq.org
Wed Dec 11 13:05:46 CST 2013


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Dec 11 10:48:41 2013 +0100

wininet: Separate socket destruction from destruction of the connection object.

---

 dlls/wininet/dialogs.c       |    2 +-
 dlls/wininet/http.c          |   29 ++++++++++++++---------------
 dlls/wininet/internet.h      |    3 +++
 dlls/wininet/netconnection.c |   16 +++++++++++++++-
 4 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/dlls/wininet/dialogs.c b/dlls/wininet/dialogs.c
index 4acda13..52a18f3 100644
--- a/dlls/wininet/dialogs.c
+++ b/dlls/wininet/dialogs.c
@@ -457,7 +457,7 @@ static INT_PTR WINAPI WININET_InvalidCertificateDialog(
                 /* FIXME: Use helper function */
                 flags |= SECURITY_FLAG_SECURE;
                 req->security_flags |= flags;
-                if(req->netconn)
+                if(is_valid_netconn(req->netconn))
                     req->netconn->security_flags |= flags;
             }
 
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 09a43f8..817fea1 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1947,7 +1947,7 @@ static void http_release_netconn(http_request_t *req, BOOL reuse)
 {
     TRACE("%p %p\n",req, req->netconn);
 
-    if(!req->netconn)
+    if(!is_valid_netconn(req->netconn))
         return;
 
     if(reuse && req->netconn->keep_alive) {
@@ -1988,8 +1988,7 @@ static void http_release_netconn(http_request_t *req, BOOL reuse)
     INTERNET_SendCallback(&req->hdr, req->hdr.dwContext,
                           INTERNET_STATUS_CLOSING_CONNECTION, 0, 0);
 
-    free_netconn(req->netconn);
-    req->netconn = NULL;
+    close_netconn(req->netconn);
 
     INTERNET_SendCallback(&req->hdr, req->hdr.dwContext,
                           INTERNET_STATUS_CONNECTION_CLOSED, 0, 0);
@@ -2092,7 +2091,7 @@ static DWORD HTTPREQ_QueryOption(object_header_t *hdr, DWORD option, void *buffe
             info->Flags |= IDSI_FLAG_KEEP_ALIVE;
         if (req->proxy)
             info->Flags |= IDSI_FLAG_PROXY;
-        if (req->netconn && req->netconn->secure)
+        if (is_valid_netconn(req->netconn) && req->netconn->secure)
             info->Flags |= IDSI_FLAG_SECURE;
 
         return ERROR_SUCCESS;
@@ -2109,7 +2108,7 @@ static DWORD HTTPREQ_QueryOption(object_header_t *hdr, DWORD option, void *buffe
             return ERROR_INSUFFICIENT_BUFFER;
 
         *size = sizeof(DWORD);
-        flags = req->netconn ? req->netconn->security_flags : req->security_flags | req->server->security_flags;
+        flags = is_valid_netconn(req->netconn) ? req->netconn->security_flags : req->security_flags | req->server->security_flags;
         *(DWORD *)buffer = flags;
 
         TRACE("INTERNET_OPTION_SECURITY_FLAGS %x\n", flags);
@@ -2314,7 +2313,7 @@ static DWORD HTTPREQ_SetOption(object_header_t *hdr, DWORD option, void *buffer,
         TRACE("INTERNET_OPTION_SECURITY_FLAGS %08x\n", flags);
         flags &= SECURITY_SET_MASK;
         req->security_flags |= flags;
-        if(req->netconn)
+        if(is_valid_netconn(req->netconn))
             req->netconn->security_flags |= flags;
         return ERROR_SUCCESS;
     }
@@ -2626,7 +2625,7 @@ static DWORD netconn_get_avail_data(data_stream_t *stream, http_request_t *req)
     netconn_stream_t *netconn_stream = (netconn_stream_t*)stream;
     DWORD avail = 0;
 
-    if(req->netconn)
+    if(is_valid_netconn(req->netconn))
         NETCON_query_data_available(req->netconn, &avail);
     return netconn_stream->content_length == ~0u
         ? avail
@@ -2636,7 +2635,7 @@ static DWORD netconn_get_avail_data(data_stream_t *stream, http_request_t *req)
 static BOOL netconn_end_of_data(data_stream_t *stream, http_request_t *req)
 {
     netconn_stream_t *netconn_stream = (netconn_stream_t*)stream;
-    return netconn_stream->content_read == netconn_stream->content_length || !req->netconn;
+    return netconn_stream->content_read == netconn_stream->content_length || !is_valid_netconn(req->netconn);
 }
 
 static DWORD netconn_read(data_stream_t *stream, http_request_t *req, BYTE *buf, DWORD size,
@@ -2654,7 +2653,7 @@ static DWORD netconn_read(data_stream_t *stream, http_request_t *req, BYTE *buf,
             size = avail;
     }
 
-    if(size && req->netconn) {
+    if(size && is_valid_netconn(req->netconn)) {
         if((res = NETCON_recv(req->netconn, buf, size, read_mode == READMODE_SYNC ? MSG_WAITALL : 0, &len)))
             len = 0;
         if(!len)
@@ -2836,7 +2835,7 @@ static DWORD chunked_read(data_stream_t *stream, http_request_t *req, BYTE *buf,
             if(read_mode == READMODE_NOBLOCK) {
                 DWORD avail;
 
-                if(!req->netconn || !NETCON_query_data_available(req->netconn, &avail) || !avail)
+                if(!is_valid_netconn(req->netconn) || !NETCON_query_data_available(req->netconn, &avail) || !avail)
                     break;
                 if(read_bytes > avail)
                     read_bytes = avail;
@@ -3037,7 +3036,7 @@ static BOOL drain_content(http_request_t *req, BOOL blocking)
 {
     BOOL ret;
 
-    if(!req->netconn || req->contentLength == -1)
+    if(!is_valid_netconn(req->netconn) || req->contentLength == -1)
         return FALSE;
 
     if(!strcmpW(req->verb, szHEAD))
@@ -4790,7 +4789,7 @@ static DWORD open_http_connection(http_request_t *request, BOOL *reusing)
 
     if (request->netconn)
     {
-        if (NETCON_is_alive(request->netconn))
+        if (is_valid_netconn(request->netconn) && NETCON_is_alive(request->netconn))
         {
             *reusing = TRUE;
             return ERROR_SUCCESS;
@@ -4812,7 +4811,7 @@ static DWORD open_http_connection(http_request_t *request, BOOL *reusing)
         netconn = LIST_ENTRY(list_head(&request->server->conn_pool), netconn_t, pool_entry);
         list_remove(&netconn->pool_entry);
 
-        if(NETCON_is_alive(netconn))
+        if(is_valid_netconn(netconn) && NETCON_is_alive(netconn))
             break;
 
         TRACE("connection %p closed during idle\n", netconn);
@@ -5219,7 +5218,7 @@ static DWORD HTTP_HttpEndRequestW(http_request_t *request, DWORD dwFlags, DWORD_
     INT responseLen;
     DWORD res = ERROR_SUCCESS;
 
-    if(!request->netconn) {
+    if(!is_valid_netconn(request->netconn)) {
         WARN("Not connected\n");
         send_request_complete(request, 0, ERROR_INTERNET_OPERATION_CANCELLED);
         return ERROR_INTERNET_OPERATION_CANCELLED;
@@ -5891,7 +5890,7 @@ static DWORD HTTP_GetResponseHeaders(http_request_t *request, INT *len)
 
     TRACE("-->\n");
 
-    if(!request->netconn)
+    if(!is_valid_netconn(request->netconn))
         goto lend;
 
     /* clear old response headers (eg. from a redirect response) */
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index 3d948cf..28af0f7 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -108,6 +108,9 @@ typedef struct
     struct list pool_entry;
 } netconn_t;
 
+BOOL is_valid_netconn(netconn_t *) DECLSPEC_HIDDEN;
+void close_netconn(netconn_t *) DECLSPEC_HIDDEN;
+
 static inline void * __WINE_ALLOC_SIZE(1) heap_alloc(size_t len)
 {
     return HeapAlloc(GetProcessHeap(), 0, len);
diff --git a/dlls/wininet/netconnection.c b/dlls/wininet/netconnection.c
index c8879b6..c90ef69 100644
--- a/dlls/wininet/netconnection.c
+++ b/dlls/wininet/netconnection.c
@@ -321,6 +321,7 @@ static DWORD create_netconn_socket(server_t *server, netconn_t *netconn, DWORD t
                 if (!res)
                 {
                     closesocket(netconn->socket);
+                    netconn->socket = -1;
                     return ERROR_INTERNET_CANNOT_CONNECT;
                 }
                 else if (res > 0)
@@ -333,7 +334,10 @@ static DWORD create_netconn_socket(server_t *server, netconn_t *netconn, DWORD t
             }
         }
         if(result == -1)
+        {
             closesocket(netconn->socket);
+            netconn->socket = -1;
+        }
         else {
             flag = 0;
             ioctlsocket(netconn->socket, FIONBIO, &flag);
@@ -378,6 +382,17 @@ DWORD create_netconn(BOOL useSSL, server_t *server, DWORD security_flags, BOOL m
     return result;
 }
 
+BOOL is_valid_netconn(netconn_t *netconn)
+{
+    return netconn && netconn->socket != -1;
+}
+
+void close_netconn(netconn_t *netconn)
+{
+    closesocket(netconn->socket);
+    netconn->socket = -1;
+}
+
 void free_netconn(netconn_t *netconn)
 {
     server_release(netconn->server);
@@ -395,7 +410,6 @@ void free_netconn(netconn_t *netconn)
         DeleteSecurityContext(&netconn->ssl_ctx);
     }
 
-    closesocket(netconn->socket);
     heap_free(netconn);
 }
 




More information about the wine-cvs mailing list