From 880133d24877b1afbdd46854672bfa8f06578003 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Sun, 13 Dec 2009 15:31:24 -0800 Subject: [PATCH] wininet: Store hostname for secure connection in its SSL context. --- dlls/wininet/internet.h | 2 +- dlls/wininet/netconnection.c | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h index c528193324a..e5b9dc3084e 100644 --- a/dlls/wininet/internet.h +++ b/dlls/wininet/internet.h @@ -427,7 +427,7 @@ DWORD NETCON_create(WININET_NETCONNECTION *connection, int domain, DWORD NETCON_close(WININET_NETCONNECTION *connection); DWORD NETCON_connect(WININET_NETCONNECTION *connection, const struct sockaddr *serv_addr, unsigned int addrlen); -DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname); +DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPWSTR hostname); DWORD NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags, int *sent /* out */); DWORD NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags, diff --git a/dlls/wininet/netconnection.c b/dlls/wininet/netconnection.c index b73df94a738..6650359df8f 100644 --- a/dlls/wininet/netconnection.c +++ b/dlls/wininet/netconnection.c @@ -113,6 +113,7 @@ static void *OpenSSL_crypto_handle; static SSL_METHOD *meth; static SSL_CTX *ctx; +static int hostname_idx; #define MAKE_FUNCPTR(f) static typeof(f) * p##f @@ -130,6 +131,8 @@ MAKE_FUNCPTR(SSL_shutdown); MAKE_FUNCPTR(SSL_write); MAKE_FUNCPTR(SSL_read); MAKE_FUNCPTR(SSL_pending); +MAKE_FUNCPTR(SSL_get_ex_new_index); +MAKE_FUNCPTR(SSL_set_ex_data); MAKE_FUNCPTR(SSL_get_verify_result); MAKE_FUNCPTR(SSL_get_peer_certificate); MAKE_FUNCPTR(SSL_CTX_get_timeout); @@ -220,6 +223,8 @@ DWORD NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL) DYNSSL(SSL_write); DYNSSL(SSL_read); DYNSSL(SSL_pending); + DYNSSL(SSL_get_ex_new_index); + DYNSSL(SSL_set_ex_data); DYNSSL(SSL_get_verify_result); DYNSSL(SSL_get_peer_certificate); DYNSSL(SSL_CTX_get_timeout); @@ -258,6 +263,8 @@ DWORD NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL) LeaveCriticalSection(&init_ssl_cs); return ERROR_OUTOFMEMORY; } + hostname_idx = pSSL_get_ex_new_index(0, (void *)"hostname index", + NULL, NULL, NULL); pCRYPTO_set_id_callback(ssl_thread_id); ssl_locks = HeapAlloc(GetProcessHeap(), 0, @@ -435,7 +442,7 @@ static BOOL check_hostname(X509 *cert, LPCWSTR hostname) * NETCON_secure_connect * Initiates a secure connection over an existing plaintext connection. */ -DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname) +DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPWSTR hostname) { DWORD res = ERROR_NOT_SUPPORTED; #ifdef SONAME_LIBSSL @@ -473,6 +480,7 @@ DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname) res = ERROR_INTERNET_SECURITY_CHANNEL_ERROR; goto fail; } + pSSL_set_ex_data(connection->ssl_s, hostname_idx, hostname); cert = pSSL_get_peer_certificate(connection->ssl_s); if (!cert) { -- 2.11.4.GIT