RESOLVED FIXED Bug 197079
Crash in FrameLoader::stopAllLoaders via [WebView dealloc] inside ~ObjCEventListener
https://bugs.webkit.org/show_bug.cgi?id=197079
Summary Crash in FrameLoader::stopAllLoaders via [WebView dealloc] inside ~ObjCEventL...
Ryosuke Niwa
Reported 2019-04-18 15:48:21 PDT
Some WebKit clients crash in FrameLoader::stopAllLoaders via [WebView dealloc] inside ~ObjCEventListener while deleting event targets. <rdar://problem/40888424>
Attachments
Fixes the bug (6.13 KB, patch)
2019-04-18 16:02 PDT, Ryosuke Niwa
no flags
Fixes the bug (9.74 KB, patch)
2019-04-18 16:03 PDT, Ryosuke Niwa
darin: review+
Ryosuke Niwa
Comment 1 2019-04-18 16:02:31 PDT
Created attachment 367769 [details] Fixes the bug
Ryosuke Niwa
Comment 2 2019-04-18 16:03:48 PDT
Created attachment 367770 [details] Fixes the bug
Darin Adler
Comment 3 2019-04-19 09:59:58 PDT
Comment on attachment 367770 [details] Fixes the bug View in context: https://bugs.webkit.org/attachment.cgi?id=367770&action=review > Source/WebKitLegacy/mac/DOM/ObjCEventListener.mm:75 > + // Avoid executing arbitrary code during GC; e.g. inside Node::~Node. > + [m_listener.get() retain]; > + [m_listener.get() autorelease]; Some day we will move to ARC. To be prepared for when we do, it will be much more future-proof to use CFRetain and CFAutorelease, which can be used for this purpose even under ARC. I suggest doing that. CFRetain((__bridge CFTypeRef)m_listener.get()); CFAutorelease((__bridge CFTypeRef)m_listener.get()); To make it cleaner, if this idiom comes up more often, we could add a RetainPtr member function designed for this purpose. Unfortunately, the current RetainPtr::autorelease is not what we want because it compiles to a bridging release under ARC, not an autorelease.
Ryosuke Niwa
Comment 4 2019-04-19 11:46:51 PDT
(In reply to Darin Adler from comment #3) > Comment on attachment 367770 [details] > Fixes the bug > > View in context: > https://bugs.webkit.org/attachment.cgi?id=367770&action=review > > > Source/WebKitLegacy/mac/DOM/ObjCEventListener.mm:75 > > + // Avoid executing arbitrary code during GC; e.g. inside Node::~Node. > > + [m_listener.get() retain]; > > + [m_listener.get() autorelease]; > > Some day we will move to ARC. To be prepared for when we do, it will be much > more future-proof to use CFRetain and CFAutorelease, which can be used for > this purpose even under ARC. I suggest doing that. > > CFRetain((__bridge CFTypeRef)m_listener.get()); > CFAutorelease((__bridge CFTypeRef)m_listener.get()); > > To make it cleaner, if this idiom comes up more often, we could add a > RetainPtr member function designed for this purpose. Unfortunately, the > current RetainPtr::autorelease is not what we want because it compiles to a > bridging release under ARC, not an autorelease. Okay, sure, I'll use CF*.
Ryosuke Niwa
Comment 5 2019-04-19 12:01:40 PDT
Note You need to log in before you can comment on or make changes to this bug.