Jacek Caban : wininet: Moved critical section locking to get_cookie callers so that cookie_set_t is also protected.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Sep 17 14:07:09 CDT 2014
Module: wine
Branch: master
Commit: c639e757d5ebdff307f623da2db2d5c94f187a64
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c639e757d5ebdff307f623da2db2d5c94f187a64
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Sep 17 12:09:13 2014 +0200
wininet: Moved critical section locking to get_cookie callers so that cookie_set_t is also protected.
---
dlls/wininet/cookie.c | 78 ++++++++++++++++++++++++++++-----------------------
1 file changed, 43 insertions(+), 35 deletions(-)
diff --git a/dlls/wininet/cookie.c b/dlls/wininet/cookie.c
index 57e5424..aec3edd 100644
--- a/dlls/wininet/cookie.c
+++ b/dlls/wininet/cookie.c
@@ -576,8 +576,6 @@ static DWORD get_cookie(const WCHAR *host, const WCHAR *path, DWORD flags, cooki
GetSystemTimeAsFileTime(&tm);
- EnterCriticalSection(&cookie_cs);
-
len = strlenW(host);
p = host+len;
while(p>host && p[-1]!='.') p--;
@@ -604,7 +602,6 @@ static DWORD get_cookie(const WCHAR *host, const WCHAR *path, DWORD flags, cooki
domain = get_cookie_domain(host, FALSE);
if(!domain) {
TRACE("Unknown host %s\n", debugstr_w(host));
- LeaveCriticalSection(&cookie_cs);
return ERROR_NO_MORE_ITEMS;
}
@@ -660,7 +657,6 @@ static DWORD get_cookie(const WCHAR *host, const WCHAR *path, DWORD flags, cooki
}
}
- LeaveCriticalSection(&cookie_cs);
return ERROR_SUCCESS;
}
@@ -694,35 +690,43 @@ static void cookie_set_to_string(const cookie_set_t *cookie_set, WCHAR *str)
DWORD get_cookie_header(const WCHAR *host, const WCHAR *path, WCHAR **ret)
{
cookie_set_t cookie_set = {0};
- WCHAR *header, *ptr;
DWORD res;
static const WCHAR cookieW[] = {'C','o','o','k','i','e',':',' '};
+ EnterCriticalSection(&cookie_cs);
+
res = get_cookie(host, path, INTERNET_COOKIE_HTTPONLY, &cookie_set);
- if(res != ERROR_SUCCESS)
+ if(res != ERROR_SUCCESS) {
+ LeaveCriticalSection(&cookie_cs);
return res;
- if(!cookie_set.cnt) {
- *ret = NULL;
- return ERROR_SUCCESS;
}
- ptr = header = heap_alloc(sizeof(cookieW) + (cookie_set.string_len + 3 /* crlf0 */) * sizeof(WCHAR));
- if(!header)
- return ERROR_NOT_ENOUGH_MEMORY;
+ if(cookie_set.cnt) {
+ WCHAR *header, *ptr;
- memcpy(ptr, cookieW, sizeof(cookieW));
- ptr += sizeof(cookieW)/sizeof(*cookieW);
+ ptr = header = heap_alloc(sizeof(cookieW) + (cookie_set.string_len + 3 /* crlf0 */) * sizeof(WCHAR));
+ if(header) {
+ memcpy(ptr, cookieW, sizeof(cookieW));
+ ptr += sizeof(cookieW)/sizeof(*cookieW);
- cookie_set_to_string(&cookie_set, ptr);
- heap_free(cookie_set.cookies);
- ptr += cookie_set.string_len;
+ cookie_set_to_string(&cookie_set, ptr);
+ heap_free(cookie_set.cookies);
+ ptr += cookie_set.string_len;
- *ptr++ = '\r';
- *ptr++ = '\n';
- *ptr++ = 0;
+ *ptr++ = '\r';
+ *ptr++ = '\n';
+ *ptr++ = 0;
- *ret = header;
+ *ret = header;
+ }else {
+ res = ERROR_NOT_ENOUGH_MEMORY;
+ }
+ }else {
+ *ret = NULL;
+ }
+
+ LeaveCriticalSection(&cookie_cs);
return ERROR_SUCCESS;
}
@@ -765,32 +769,36 @@ BOOL WINAPI InternetGetCookieExW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName,
return FALSE;
}
+ EnterCriticalSection(&cookie_cs);
+
res = get_cookie(host, path, flags, &cookie_set);
if(res != ERROR_SUCCESS) {
+ LeaveCriticalSection(&cookie_cs);
SetLastError(res);
return FALSE;
}
- if(!cookie_set.cnt) {
+ if(cookie_set.cnt) {
+ if(!lpCookieData || cookie_set.string_len+1 > *lpdwSize) {
+ *lpdwSize = (cookie_set.string_len + 1) * sizeof(WCHAR);
+ TRACE("returning %u\n", *lpdwSize);
+ if(lpCookieData) {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ ret = FALSE;
+ }
+ }else {
+ *lpdwSize = cookie_set.string_len + 1;
+ cookie_set_to_string(&cookie_set, lpCookieData);
+ lpCookieData[cookie_set.string_len] = 0;
+ }
+ }else {
TRACE("no cookies found for %s\n", debugstr_w(host));
SetLastError(ERROR_NO_MORE_ITEMS);
return FALSE;
}
- if(!lpCookieData || cookie_set.string_len+1 > *lpdwSize) {
- *lpdwSize = (cookie_set.string_len + 1) * sizeof(WCHAR);
- TRACE("returning %u\n", *lpdwSize);
- if(lpCookieData) {
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- ret = FALSE;
- }
- }else {
- *lpdwSize = cookie_set.string_len + 1;
- cookie_set_to_string(&cookie_set, lpCookieData);
- lpCookieData[cookie_set.string_len] = 0;
- }
-
heap_free(cookie_set.cookies);
+ LeaveCriticalSection(&cookie_cs);
return ret;
}
More information about the wine-cvs
mailing list