Module: wine Branch: master Commit: 543bfdf1af21bac4261c227fc84efabd93726c95 URL: https://source.winehq.org/git/wine.git/?a=commit;h=543bfdf1af21bac4261c227fc...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Oct 5 14:59:18 2018 +0200
winhttp: Make accessing session credential handle thread safe.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winhttp/request.c | 24 ++++++++++++++++-------- dlls/winhttp/session.c | 2 ++ 2 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index 960c755..d101023 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -1608,21 +1608,29 @@ static DWORD map_secure_protocols( DWORD mask )
static BOOL ensure_cred_handle( session_t *session ) { - SCHANNEL_CRED cred; - SECURITY_STATUS status; + SECURITY_STATUS status = SEC_E_OK;
if (session->cred_handle_initialized) return TRUE;
- memset( &cred, 0, sizeof(cred) ); - cred.dwVersion = SCHANNEL_CRED_VERSION; - cred.grbitEnabledProtocols = map_secure_protocols( session->secure_protocols ); - if ((status = AcquireCredentialsHandleW( NULL, (WCHAR *)UNISP_NAME_W, SECPKG_CRED_OUTBOUND, NULL, &cred, - NULL, NULL, &session->cred_handle, NULL )) != SEC_E_OK) + EnterCriticalSection( &session->cs ); + if (!session->cred_handle_initialized) + { + SCHANNEL_CRED cred; + memset( &cred, 0, sizeof(cred) ); + cred.dwVersion = SCHANNEL_CRED_VERSION; + cred.grbitEnabledProtocols = map_secure_protocols( session->secure_protocols ); + status = AcquireCredentialsHandleW( NULL, (WCHAR *)UNISP_NAME_W, SECPKG_CRED_OUTBOUND, NULL, + &cred, NULL, NULL, &session->cred_handle, NULL ); + if (status == SEC_E_OK) + session->cred_handle_initialized = TRUE; + } + LeaveCriticalSection( &session->cs ); + + if (status != SEC_E_OK) { WARN( "AcquireCredentialsHandleW failed: 0x%08x\n", status ); return FALSE; } - session->cred_handle_initialized = TRUE; return TRUE; }
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index 7078e47..b9d9ab8 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -198,7 +198,9 @@ static BOOL session_set_option( object_header_t *hdr, DWORD option, LPVOID buffe set_last_error( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } + EnterCriticalSection( &session->cs ); session->secure_protocols = *(DWORD *)buffer; + LeaveCriticalSection( &session->cs ); TRACE("0x%x\n", session->secure_protocols); return TRUE; }