From b77868cbfd9f2faeac7934a46919db5354dc8013 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 30 Nov 2009 00:13:21 +0100 Subject: [PATCH] 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 99abc3a0af..b23fc18e2a 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 b665874174..f87e719f22 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 1e4fc35bb0..ca31d0e0fa 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 } }