Jacek Caban : winhttp: Make cookie access thread safe.

Alexandre Julliard julliard at winehq.org
Fri Oct 5 16:40:40 CDT 2018


Module: wine
Branch: master
Commit: 533083e4983df98531c79286e6583b98b99a4c30
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=533083e4983df98531c79286e6583b98b99a4c30

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Oct  5 14:59:10 2018 +0200

winhttp: Make cookie access thread safe.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winhttp/cookie.c          | 32 ++++++++++++++++++++++----------
 dlls/winhttp/session.c         |  4 ++++
 dlls/winhttp/winhttp_private.h |  1 +
 3 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/dlls/winhttp/cookie.c b/dlls/winhttp/cookie.c
index 63cbde7..668daba 100644
--- a/dlls/winhttp/cookie.c
+++ b/dlls/winhttp/cookie.c
@@ -116,24 +116,28 @@ static BOOL add_cookie( session_t *session, cookie_t *cookie, WCHAR *domain_name
     cookie_t *old_cookie;
     struct list *item;
 
+    if (!(cookie->path = strdupW( path ))) return FALSE;
+
+    EnterCriticalSection( &session->cs );
+
     LIST_FOR_EACH( item, &session->cookie_cache )
     {
         domain = LIST_ENTRY( item, domain_t, entry );
         if (domain_match( domain_name, domain, FALSE )) break;
         domain = NULL;
     }
-    if (!domain)
-    {
-        if (!(domain = add_domain( session, domain_name ))) return FALSE;
-    }
+    if (!domain) domain = add_domain( session, domain_name );
     else if ((old_cookie = find_cookie( domain, path, cookie->name ))) delete_cookie( old_cookie );
 
-    cookie->path = strdupW( path );
-    list_add_head( &domain->cookies, &cookie->entry );
+    if (domain)
+    {
+        list_add_head( &domain->cookies, &cookie->entry );
+        TRACE("domain %s path %s <- %s=%s\n", debugstr_w(domain_name), debugstr_w(cookie->path),
+              debugstr_w(cookie->name), debugstr_w(cookie->value));
+    }
 
-    TRACE("domain %s path %s <- %s=%s\n", debugstr_w(domain_name), debugstr_w(cookie->path),
-          debugstr_w(cookie->name), debugstr_w(cookie->value));
-    return TRUE;
+    LeaveCriticalSection( &session->cs );
+    return domain != NULL;
 }
 
 static cookie_t *parse_cookie( const WCHAR *string )
@@ -303,6 +307,8 @@ BOOL add_cookie_headers( request_t *request )
     struct list *domain_cursor;
     session_t *session = request->connect->session;
 
+    EnterCriticalSection( &session->cs );
+
     LIST_FOR_EACH( domain_cursor, &session->cookie_cache )
     {
         domain_t *domain = LIST_ENTRY( domain_cursor, domain_t, entry );
@@ -325,7 +331,11 @@ BOOL add_cookie_headers( request_t *request )
 
                     len = len_cookie + len_name;
                     if (cookie->value) len += strlenW( cookie->value ) + 1;
-                    if (!(header = heap_alloc( (len + 1) * sizeof(WCHAR) ))) return FALSE;
+                    if (!(header = heap_alloc( (len + 1) * sizeof(WCHAR) )))
+                    {
+                        LeaveCriticalSection( &session->cs );
+                        return FALSE;
+                    }
 
                     memcpy( header, cookieW, len_cookie * sizeof(WCHAR) );
                     strcpyW( header + len_cookie, cookie->name );
@@ -343,5 +353,7 @@ BOOL add_cookie_headers( request_t *request )
             }
         }
     }
+
+    LeaveCriticalSection( &session->cs );
     return TRUE;
 }
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index 0610915..7078e47 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -102,6 +102,8 @@ static void session_destroy( object_header_t *hdr )
         domain = LIST_ENTRY( item, domain_t, entry );
         delete_domain( domain );
     }
+    session->cs.DebugInfo->Spare[0] = 0;
+    DeleteCriticalSection( &session->cs );
     heap_free( session->agent );
     heap_free( session->proxy_server );
     heap_free( session->proxy_bypass );
@@ -279,6 +281,8 @@ HINTERNET WINAPI WinHttpOpen( LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWST
     session->receive_timeout = DEFAULT_RECEIVE_TIMEOUT;
     session->receive_response_timeout = DEFAULT_RECEIVE_RESPONSE_TIMEOUT;
     list_init( &session->cookie_cache );
+    InitializeCriticalSection( &session->cs );
+    session->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": session.cs");
 
     if (agent && !(session->agent = strdupW( agent ))) goto end;
     if (access == WINHTTP_ACCESS_TYPE_DEFAULT_PROXY)
diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h
index cac87bb..2ea798b 100644
--- a/dlls/winhttp/winhttp_private.h
+++ b/dlls/winhttp/winhttp_private.h
@@ -85,6 +85,7 @@ typedef struct {
 typedef struct
 {
     object_header_t hdr;
+    CRITICAL_SECTION cs;
     LPWSTR agent;
     DWORD access;
     int resolve_timeout;




More information about the wine-cvs mailing list