Jacek Caban : wininet: Dorectly return error status from NETCON_secure_connect and NETCON_send.

Alexandre Julliard julliard at winehq.org
Mon Nov 30 10:42:45 CST 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Nov 30 00:13:21 2009 +0100

wininet: Dorectly return error status from NETCON_secure_connect and NETCON_send.

---

 dlls/wininet/http.c          |   20 +++++++++++++-------
 dlls/wininet/internet.h      |    4 ++--
 dlls/wininet/netconnection.c |   38 ++++++++++++++++++--------------------
 3 files changed, 33 insertions(+), 29 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 99abc3a..b23fc18 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -2491,17 +2491,20 @@ done:
 
 static BOOL HTTPREQ_WriteFile(object_header_t *hdr, const void *buffer, DWORD size, DWORD *written)
 {
-    BOOL ret;
+    DWORD res;
     http_request_t *lpwhr = (http_request_t*)hdr;
 
     INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_SENDING_REQUEST, NULL, 0);
 
     *written = 0;
-    if ((ret = NETCON_send(&lpwhr->netConnection, buffer, size, 0, (LPINT)written)))
+    res = NETCON_send(&lpwhr->netConnection, buffer, size, 0, (LPINT)written);
+    if (res == ERROR_SUCCESS)
         lpwhr->dwBytesWritten += *written;
+    else
+        SetLastError(res);
 
     INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_REQUEST_SENT, written, sizeof(DWORD));
-    return ret;
+    return res == ERROR_SUCCESS;
 }
 
 static void HTTPREQ_AsyncQueryDataAvailableProc(WORKREQUEST *workRequest)
@@ -3756,7 +3759,7 @@ static BOOL HTTP_SecureProxyConnect(http_request_t *lpwhr)
     INT cnt;
     INT responseLen;
     char *ascii_req;
-    BOOL ret;
+    DWORD res;
     static const WCHAR szConnect[] = {'C','O','N','N','E','C','T',0};
     static const WCHAR szFormat[] = {'%','s',':','%','d',0};
     http_session_t *lpwhs = lpwhr->lpHttpSession;
@@ -3778,10 +3781,12 @@ static BOOL HTTP_SecureProxyConnect(http_request_t *lpwhr)
 
     TRACE("full request -> %s\n", debugstr_an( ascii_req, len ) );
 
-    ret = NETCON_send( &lpwhr->netConnection, ascii_req, len, 0, &cnt );
+    res = NETCON_send( &lpwhr->netConnection, ascii_req, len, 0, &cnt );
     HeapFree( GetProcessHeap(), 0, ascii_req );
-    if (!ret || cnt < 0)
+    if (res != ERROR_SUCCESS || cnt < 0) {
+        INTERNET_SetLastError(res);
         return FALSE;
+    }
 
     responseLen = HTTP_GetResponseHeaders( lpwhr, TRUE );
     if (!responseLen)
@@ -4377,7 +4382,8 @@ static BOOL HTTP_OpenConnection(http_request_t *lpwhr)
         if (hIC->lpszProxy && !HTTP_SecureProxyConnect(lpwhr))
             goto lend;
 
-        if (!NETCON_secure_connect(&lpwhr->netConnection, lpwhs->lpszHostName))
+        res = NETCON_secure_connect(&lpwhr->netConnection, lpwhs->lpszHostName);
+        if(res != ERROR_SUCCESS)
         {
             WARN("Couldn't connect securely to host\n");
             goto lend;
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index b665874..f87e719 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -435,8 +435,8 @@ DWORD NETCON_create(WININET_NETCONNECTION *connection, int domain,
 BOOL NETCON_close(WININET_NETCONNECTION *connection);
 DWORD NETCON_connect(WININET_NETCONNECTION *connection, const struct sockaddr *serv_addr,
 		    unsigned int addrlen);
-BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname);
-BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
+DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname);
+DWORD NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
 		int *sent /* out */);
 BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
 		int *recvd /* out */);
diff --git a/dlls/wininet/netconnection.c b/dlls/wininet/netconnection.c
index 1e4fc35..ca31d0e 100644
--- a/dlls/wininet/netconnection.c
+++ b/dlls/wininet/netconnection.c
@@ -442,8 +442,9 @@ static BOOL check_hostname(X509 *cert, char *hostname)
  * NETCON_secure_connect
  * Initiates a secure connection over an existing plaintext connection.
  */
-BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname)
+DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname)
 {
+    DWORD res = ERROR_NOT_SUPPORTED;
 #ifdef SONAME_LIBSSL
     long verify_res;
     X509 *cert;
@@ -454,7 +455,7 @@ BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname)
     if (connection->useSSL)
     {
         ERR("already connected\n");
-        return FALSE;
+        return ERROR_INTERNET_CANNOT_CONNECT;
     }
 
     connection->ssl_s = pSSL_new(ctx);
@@ -462,7 +463,7 @@ BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname)
     {
         ERR("SSL_new failed: %s\n",
             pERR_error_string(pERR_get_error(), 0));
-        INTERNET_SetLastError(ERROR_OUTOFMEMORY);
+        res = ERROR_OUTOFMEMORY;
         goto fail;
     }
 
@@ -470,7 +471,7 @@ BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname)
     {
         ERR("SSL_set_fd failed: %s\n",
             pERR_error_string(pERR_get_error(), 0));
-        INTERNET_SetLastError(ERROR_INTERNET_SECURITY_CHANNEL_ERROR);
+        res = ERROR_INTERNET_SECURITY_CHANNEL_ERROR;
         goto fail;
     }
 
@@ -478,7 +479,7 @@ BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname)
     {
         ERR("SSL_connect failed: %s\n",
             pERR_error_string(pERR_get_error(), 0));
-        INTERNET_SetLastError(ERROR_INTERNET_SECURITY_CHANNEL_ERROR);
+        res = ERROR_INTERNET_SECURITY_CHANNEL_ERROR;
         goto fail;
     }
     cert = pSSL_get_peer_certificate(connection->ssl_s);
@@ -486,7 +487,7 @@ BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname)
     {
         ERR("no certificate for server %s\n", debugstr_w(hostname));
         /* FIXME: is this the best error? */
-        INTERNET_SetLastError(ERROR_INTERNET_INVALID_CA);
+        res = ERROR_INTERNET_INVALID_CA;
         goto fail;
     }
     verify_res = pSSL_get_verify_result(connection->ssl_s);
@@ -501,7 +502,7 @@ BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname)
     hostname_unix = HeapAlloc(GetProcessHeap(), 0, len);
     if (!hostname_unix)
     {
-        INTERNET_SetLastError(ERROR_OUTOFMEMORY);
+        res = ERROR_OUTOFMEMORY;
         goto fail;
     }
     WideCharToMultiByte(CP_UNIXCP, 0, hostname, -1, hostname_unix, len, NULL, NULL);
@@ -509,13 +510,13 @@ BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname)
     if (!check_hostname(cert, hostname_unix))
     {
         HeapFree(GetProcessHeap(), 0, hostname_unix);
-        INTERNET_SetLastError(ERROR_INTERNET_SEC_CERT_CN_INVALID);
+        res = ERROR_INTERNET_SEC_CERT_CN_INVALID;
         goto fail;
     }
 
     HeapFree(GetProcessHeap(), 0, hostname_unix);
     connection->useSSL = TRUE;
-    return TRUE;
+    return ERROR_SUCCESS;
 
 fail:
     if (connection->ssl_s)
@@ -525,7 +526,7 @@ fail:
         connection->ssl_s = NULL;
     }
 #endif
-    return FALSE;
+    return res;
 }
 
 /******************************************************************************
@@ -555,19 +556,16 @@ DWORD NETCON_connect(WININET_NETCONNECTION *connection, const struct sockaddr *s
  * Basically calls 'send()' unless we should use SSL
  * number of chars send is put in *sent
  */
-BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
+DWORD NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
 		int *sent /* out */)
 {
-    if (!NETCON_connected(connection)) return FALSE;
+    if (!NETCON_connected(connection)) return ERROR_INTERNET_CONNECTION_ABORTED;
     if (!connection->useSSL)
     {
 	*sent = send(connection->socketFD, msg, len, flags);
 	if (*sent == -1)
-	{
-	    INTERNET_SetLastError(sock_get_error(errno));
-	    return FALSE;
-	}
-        return TRUE;
+	    return sock_get_error(errno);
+        return ERROR_SUCCESS;
     }
     else
     {
@@ -576,10 +574,10 @@ BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len,
             FIXME("SSL_write doesn't support any flags (%08x)\n", flags);
 	*sent = pSSL_write(connection->ssl_s, msg, len);
 	if (*sent < 1 && len)
-	    return FALSE;
-        return TRUE;
+	    return ERROR_INTERNET_CONNECTION_ABORTED;
+        return ERROR_SUCCESS;
 #else
-	return FALSE;
+	return ERROR_NOT_SUPPORTED;
 #endif
     }
 }




More information about the wine-cvs mailing list