WebUserContentController::removeUserScriptMessageHandlerInternal may deref and delete...
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Jan 2019 13:15:03 +0000 (13:15 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Jan 2019 13:15:03 +0000 (13:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=193901
<rdar://problem/47338669>

Reviewed by David Kilzer.

Don't know how to repro.

* WebProcess/UserContent/WebUserContentController.cpp:
(WebKit::WebUserContentController::removeUserScriptMessageHandlerInternal):

Calling userMessageHandlers.removeFirstMatching() may remove the last ref to this
(because WebUserMessageHandlerDescriptorProxy refs WebUserContentController).
Fix by protecting this over the function.

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

Source/WebKit/ChangeLog
Source/WebKit/WebProcess/UserContent/WebUserContentController.cpp

index d93f922..00243e1 100644 (file)
@@ -1,3 +1,20 @@
+2019-01-28  Antti Koivisto  <antti@apple.com>
+
+        WebUserContentController::removeUserScriptMessageHandlerInternal may deref and delete itself
+        https://bugs.webkit.org/show_bug.cgi?id=193901
+        <rdar://problem/47338669>
+
+        Reviewed by David Kilzer.
+
+        Don't know how to repro.
+
+        * WebProcess/UserContent/WebUserContentController.cpp:
+        (WebKit::WebUserContentController::removeUserScriptMessageHandlerInternal):
+
+        Calling userMessageHandlers.removeFirstMatching() may remove the last ref to this
+        (because WebUserMessageHandlerDescriptorProxy refs WebUserContentController).
+        Fix by protecting this over the function.
+
 2018-12-15  Darin Adler  <darin@apple.com>
 
         Replace many uses of String::format with more type-safe alternatives
index 0fa2725..693bc55 100644 (file)
@@ -330,6 +330,8 @@ void WebUserContentController::removeUserScriptMessageHandlerInternal(InjectedBu
     if (it == m_userMessageHandlers.end())
         return;
 
+    auto protectedThis = makeRef(*this);
+
     auto& userMessageHandlers = it->value;
     bool userMessageHandlersChanged = userMessageHandlers.removeFirstMatching([userScriptMessageHandlerIdentifier](auto& pair) {
         return pair.first ==  userScriptMessageHandlerIdentifier;