[PATCH] wininet: move freeing netconn into create_netconn_socket (Coverity)

Marcus Meissner marcus at jet.franken.de
Wed Nov 14 12:59:31 CST 2012


create_netconn_socket incorrectly assumed ownership
of netconn and freed it on error, move it to the respective
callers.

(create_conn needs a free, NETCON_secure_connect() will go back
and then get to open_http_connection() which frees netconn already
in the error path.

Ciao, Marcus
---
 dlls/wininet/netconnection.c |   11 ++++++-----
 1 Datei geändert, 6 Zeilen hinzugefügt(+), 5 Zeilen entfernt(-)

diff --git a/dlls/wininet/netconnection.c b/dlls/wininet/netconnection.c
index b746b54..2abb676 100644
--- a/dlls/wininet/netconnection.c
+++ b/dlls/wininet/netconnection.c
@@ -655,7 +655,6 @@ static DWORD create_netconn_socket(server_t *server, netconn_t *netconn, DWORD t
                 if (!res)
                 {
                     closesocket(netconn->socketFD);
-                    heap_free(netconn);
                     return ERROR_INTERNET_CANNOT_CONNECT;
                 }
                 else if (res > 0)
@@ -674,10 +673,8 @@ static DWORD create_netconn_socket(server_t *server, netconn_t *netconn, DWORD t
             ioctlsocket(netconn->socketFD, FIONBIO, &flag);
         }
     }
-    if(result == -1) {
-        heap_free(netconn);
+    if(result == -1)
         return sock_get_error(errno);
-    }
 
 #ifdef TCP_NODELAY
     flag = 1;
@@ -717,9 +714,13 @@ DWORD create_netconn(BOOL useSSL, server_t *server, DWORD security_flags, BOOL m
     list_init(&netconn->pool_entry);
 
     result = create_netconn_socket(server, netconn, timeout);
+    if (result != ERROR_SUCCESS) {
+        heap_free(netconn);
+        return result;
+    }
+
     server_addref(server);
     netconn->server = server;
-
     *ret = netconn;
     return result;
 }
-- 
1.7.10.4




More information about the wine-patches mailing list