Title: [281384] trunk/Source
Revision
281384
Author
sihui_...@apple.com
Date
2021-08-21 18:33:10 -0700 (Sat, 21 Aug 2021)

Log Message

IndexedDB: crash when triggering IDBOpenRequest completion back on a worker thread
https://bugs.webkit.org/show_bug.cgi?id=229375

Source/WebCore:

Reviewed by Brady Eidson.

Client may dispatch custom events to an IDBRequest, and we should only change request state based on events
created internally.

* Modules/indexeddb/IDBRequest.cpp:
(WebCore::IDBRequest::dispatchEvent):

Source/WTF:

Protect callee in CrossThreadTask if it inherits from ThreadSafeRefCounted<T>.

Reviewed by Brady Eidson.

* wtf/CrossThreadTask.h:

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (281383 => 281384)


--- trunk/Source/WTF/ChangeLog	2021-08-22 00:26:53 UTC (rev 281383)
+++ trunk/Source/WTF/ChangeLog	2021-08-22 01:33:10 UTC (rev 281384)
@@ -1,3 +1,14 @@
+2021-08-21  Sihui Liu  <sihui_...@apple.com>
+
+        IndexedDB: crash when triggering IDBOpenRequest completion back on a worker thread
+        https://bugs.webkit.org/show_bug.cgi?id=229375
+
+        Protect callee in CrossThreadTask if it inherits from ThreadSafeRefCounted<T>.
+
+        Reviewed by Brady Eidson.
+
+        * wtf/CrossThreadTask.h:
+
 2021-08-20  Mark Lam  <mark....@apple.com>
 
         Make ptrTagName and tagForPtr WTF_EXPORT_PRIVATE.

Modified: trunk/Source/WTF/wtf/CrossThreadTask.h (281383 => 281384)


--- trunk/Source/WTF/wtf/CrossThreadTask.h	2021-08-22 00:26:53 UTC (rev 281383)
+++ trunk/Source/WTF/wtf/CrossThreadTask.h	2021-08-22 01:33:10 UTC (rev 281384)
@@ -87,7 +87,7 @@
     callMemberFunctionForCrossThreadTaskImpl(object, function, std::forward<ArgsTuple>(args), ArgsIndicies());
 }
 
-template<typename T, typename std::enable_if<std::is_base_of<ThreadSafeRefCounted<T>, T>::value, int>::type = 0, typename... Parameters, typename... Arguments>
+template<typename T, typename std::enable_if<std::is_base_of<ThreadSafeRefCountedBase, T>::value, int>::type = 0, typename... Parameters, typename... Arguments>
 CrossThreadTask createCrossThreadTask(T& callee, void (T::*method)(Parameters...), const Arguments&... arguments)
 {
     return CrossThreadTask([callee = makeRefPtr(&callee), method, arguments = std::make_tuple(crossThreadCopy(arguments)...)]() mutable {
@@ -95,7 +95,7 @@
     });
 }
 
-template<typename T, typename std::enable_if<!std::is_base_of<ThreadSafeRefCounted<T>, T>::value, int>::type = 0, typename... Parameters, typename... Arguments>
+template<typename T, typename std::enable_if<!std::is_base_of<ThreadSafeRefCountedBase, T>::value, int>::type = 0, typename... Parameters, typename... Arguments>
 CrossThreadTask createCrossThreadTask(T& callee, void (T::*method)(Parameters...), const Arguments&... arguments)
 {
     return CrossThreadTask([callee = &callee, method, arguments = std::make_tuple(crossThreadCopy(arguments)...)]() mutable {

Modified: trunk/Source/WebCore/ChangeLog (281383 => 281384)


--- trunk/Source/WebCore/ChangeLog	2021-08-22 00:26:53 UTC (rev 281383)
+++ trunk/Source/WebCore/ChangeLog	2021-08-22 01:33:10 UTC (rev 281384)
@@ -1,3 +1,16 @@
+2021-08-21  Sihui Liu  <sihui_...@apple.com>
+
+        IndexedDB: crash when triggering IDBOpenRequest completion back on a worker thread
+        https://bugs.webkit.org/show_bug.cgi?id=229375
+
+        Reviewed by Brady Eidson.
+
+        Client may dispatch custom events to an IDBRequest, and we should only change request state based on events
+        created internally.
+
+        * Modules/indexeddb/IDBRequest.cpp:
+        (WebCore::IDBRequest::dispatchEvent):
+
 2021-08-21  Zalan Bujtas  <za...@apple.com>
 
         [IFC][Integration] Group non-standard CSS properties

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBRequest.cpp (281383 => 281384)


--- trunk/Source/WebCore/Modules/indexeddb/IDBRequest.cpp	2021-08-22 00:26:53 UTC (rev 281383)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBRequest.cpp	2021-08-22 01:33:10 UTC (rev 281384)
@@ -308,7 +308,8 @@
     else if (m_transaction && !m_transaction->didDispatchAbortOrCommit())
         targets = { this, m_transaction.get(), &m_transaction->database() };
 
-    m_hasPendingActivity = false;
+    if (event.isTrusted())
+        m_hasPendingActivity = false;
 
     {
         TransactionActivator activator(m_transaction.get());
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to