WKWebsiteDataStore remove methods don't properly delete cookies
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 27 Jul 2015 20:56:56 +0000 (20:56 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 27 Jul 2015 20:56:56 +0000 (20:56 +0000)
https://bugs.webkit.org/show_bug.cgi?id=147333
rdar://problem/21948230

Reviewed by Tim Horton.

If there are multiple cookies for a single domain, make sure to delete all of them
and not just the first one we find.

Fix this by keeping a mapping from domain to a list of cookies.

* platform/network/mac/CookieJarMac.mm:
(WebCore::deleteCookiesForHostnames):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@187448 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/network/mac/CookieJarMac.mm

index 2a29797..31e7d6c 100644 (file)
@@ -1,3 +1,19 @@
+2015-07-27  Anders Carlsson  <andersca@apple.com>
+
+        WKWebsiteDataStore remove methods don't properly delete cookies
+        https://bugs.webkit.org/show_bug.cgi?id=147333
+        rdar://problem/21948230
+
+        Reviewed by Tim Horton.
+
+        If there are multiple cookies for a single domain, make sure to delete all of them
+        and not just the first one we find.
+        
+        Fix this by keeping a mapping from domain to a list of cookies.
+
+        * platform/network/mac/CookieJarMac.mm:
+        (WebCore::deleteCookiesForHostnames):
+
 2015-07-27  Simon Fraser  <simon.fraser@apple.com>
 
         Enhance Animation logging slightly
index 90a28cc..5ce4af3 100644 (file)
@@ -227,13 +227,19 @@ void deleteCookiesForHostnames(const NetworkStorageSession& session, const Vecto
     if (!cookies)
         return;
 
-    HashMap<String, RetainPtr<NSHTTPCookie>> cookiesByDomain;
-    for (NSHTTPCookie* cookie in cookies)
-        cookiesByDomain.set(cookie.domain, cookie);
+    HashMap<String, Vector<RetainPtr<NSHTTPCookie>>> cookiesByDomain;
+    for (NSHTTPCookie* cookie in cookies) {
+        auto& cookies = cookiesByDomain.add(cookie.domain, Vector<RetainPtr<NSHTTPCookie>>()).iterator->value;
+        cookies.append(cookie);
+    }
 
     for (const auto& hostname : hostnames) {
-        if (NSHTTPCookie *cookie = cookiesByDomain.get(hostname).get())
-            wkDeleteHTTPCookie(cookieStorage.get(), cookie);
+        auto it = cookiesByDomain.find(hostname);
+        if (it == cookiesByDomain.end())
+            continue;
+
+        for (auto& cookie : it->value)
+            wkDeleteHTTPCookie(cookieStorage.get(), cookie.get());
     }
 
     [WebCore::cookieStorage(session) _saveCookies];