Crash in StorageAreaMap::applyChange when clearing local storage in another web process
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Jun 2013 23:43:38 +0000 (23:43 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Jun 2013 23:43:38 +0000 (23:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=117440
<rdar://problem/13961548>

Reviewed by Tim Horton.

Add an early return so we won't try to look up a null key in the m_pendingValueChanges map.
Also, fix an assertion - it's fine for m_storageMap to be null in applyChange.

* WebProcess/Storage/StorageAreaMap.cpp:
(WebKit::StorageAreaMap::applyChange):

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

Source/WebKit2/ChangeLog
Source/WebKit2/WebProcess/Storage/StorageAreaMap.cpp

index 2d9f8fb..c480eb5 100644 (file)
@@ -1,3 +1,17 @@
+2013-06-10  Anders Carlsson  <andersca@apple.com>
+
+        Crash in StorageAreaMap::applyChange when clearing local storage in another web process
+        https://bugs.webkit.org/show_bug.cgi?id=117440
+        <rdar://problem/13961548>
+
+        Reviewed by Tim Horton.
+
+        Add an early return so we won't try to look up a null key in the m_pendingValueChanges map.
+        Also, fix an assertion - it's fine for m_storageMap to be null in applyChange.
+
+        * WebProcess/Storage/StorageAreaMap.cpp:
+        (WebKit::StorageAreaMap::applyChange):
+
 2013-06-10  Sergio Correia  <sergio.correia@openbossa.org>
 
         [WK2][CoordinatedGraphics] Add default case to switches to fix strict build
index d8115de..4a8582d 100644 (file)
@@ -240,7 +240,7 @@ bool StorageAreaMap::shouldApplyChangeForKey(const String& key) const
 
 void StorageAreaMap::applyChange(const String& key, const String& newValue)
 {
-    ASSERT(m_storageMap->hasOneRef());
+    ASSERT(!m_storageMap || m_storageMap->hasOneRef());
 
     // There's a clear pending or getValues pending we don't want to apply any changes until we get the corresponding DidClear/DidGetValues messages.
     if (m_hasPendingClear || m_hasPendingGetValues)
@@ -265,6 +265,7 @@ void StorageAreaMap::applyChange(const String& key, const String& newValue)
         }
 
         m_storageMap = newStorageMap.release();
+        return;
     }
 
     if (!shouldApplyChangeForKey(key))