Changeset 236464 in webkit
- Timestamp:
- Sep 25, 2018, 11:31:21 AM (8 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 10 edited
-
ChangeLog (modified) (1 diff)
-
UIProcess/ChildProcessProxy.h (modified) (1 diff)
-
UIProcess/Network/NetworkProcessProxy.cpp (modified) (3 diffs)
-
UIProcess/Network/NetworkProcessProxy.h (modified) (2 diffs)
-
UIProcess/Plugins/PluginProcessProxy.h (modified) (1 diff)
-
UIProcess/Storage/StorageProcessProxy.cpp (modified) (1 diff)
-
UIProcess/Storage/StorageProcessProxy.h (modified) (2 diffs)
-
UIProcess/WebProcessPool.cpp (modified) (3 diffs)
-
UIProcess/WebProcessPool.h (modified) (1 diff)
-
UIProcess/WebProcessProxy.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r236463 r236464 1 2018-09-25 Chris Dumez <cdumez@apple.com> 2 3 Extending the lifetime of a NetworkProcessProxy / StorageProcessProxy may cause it to have a stale WebProcessPool pointer 4 https://bugs.webkit.org/show_bug.cgi?id=189851 5 <rdar://problem/44696263> 6 7 Reviewed by Alex Christensen. 8 9 Extending the lifetime of a NetworkProcessProxy / StorageProcessProxy may cause it to have a stale WebProcessPool pointer: 10 - NetworkProcessProxy::m_processPool 11 - StorageProcessProxy::m_processPool 12 13 Those data members are C++ references because it is expected that the WebProcessPool owns the NetworkProcessProxy and 14 StorageProcessProxy. However, since NetworkProcessProxy / StorageProcessProxy are refcounted, it has happened that code 15 extends the lifetime of those past their process pool, leading to stale prrocess pool usage. The fix for these crashes 16 so far as been to ref the WebProcessPool instead of the NetworkProcessProxy / StorageProcessProxy. However, it is very 17 tempting for people to simply ref the NetworkProcessProxy / StorageProcessProxy given that they are refcounted. 18 For this reason, this patch updates NetworkProcessProxy / StorageProcessProxy so that they are no longer RefCounted 19 and so that the WebProcessPool truly owns them via std::unique_ptr<>. 20 21 * UIProcess/ChildProcessProxy.h: 22 * UIProcess/Network/NetworkProcessProxy.cpp: 23 (WebKit::NetworkProcessProxy::networkProcessCrashed): 24 (WebKit::NetworkProcessProxy::didClose): 25 (WebKit::NetworkProcessProxy::create): Deleted. 26 * UIProcess/Network/NetworkProcessProxy.h: 27 (WebKit::NetworkProcessProxy::throttler): Deleted. 28 (WebKit::NetworkProcessProxy::processPool): Deleted. 29 * UIProcess/Plugins/PluginProcessProxy.h: 30 (WebKit::PluginProcessProxy::pluginProcessAttributes const): Deleted. 31 (WebKit::PluginProcessProxy::pluginProcessToken const): Deleted. 32 (WebKit::PluginProcessProxy::isValid const): Deleted. 33 * UIProcess/Storage/StorageProcessProxy.cpp: 34 (WebKit::StorageProcessProxy::create): Deleted. 35 * UIProcess/Storage/StorageProcessProxy.h: 36 * UIProcess/WebProcessPool.cpp: 37 (WebKit::WebProcessPool::ensureNetworkProcess): 38 (WebKit::WebProcessPool::ensureStorageProcessAndWebsiteDataStore): 39 (WebKit::WebProcessPool::establishWorkerContextConnectionToStorageProcess): 40 * UIProcess/WebProcessPool.h: 41 * UIProcess/WebProcessProxy.h: 42 1 43 2018-09-25 Alex Christensen <achristensen@webkit.org> 2 44 -
trunk/Source/WebKit/UIProcess/ChildProcessProxy.h
r236425 r236464 37 37 namespace WebKit { 38 38 39 class ChildProcessProxy : ProcessLauncher::Client, public IPC::Connection::Client , public ThreadSafeRefCounted<ChildProcessProxy>{39 class ChildProcessProxy : ProcessLauncher::Client, public IPC::Connection::Client { 40 40 WTF_MAKE_NONCOPYABLE(ChildProcessProxy); 41 41 -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp
r236425 r236464 67 67 } 68 68 69 Ref<NetworkProcessProxy> NetworkProcessProxy::create(WebProcessPool& processPool)70 {71 return adoptRef(*new NetworkProcessProxy(processPool));72 }73 74 69 NetworkProcessProxy::NetworkProcessProxy(WebProcessPool& processPool) 75 70 : ChildProcessProxy(processPool.alwaysRunsAtBackgroundPriority()) … … 206 201 pendingReplies.append(WTFMove(reply)); 207 202 208 // Tell the network process manager to forget about this network process proxy. This maycause us to be deleted.203 // Tell the network process manager to forget about this network process proxy. This will cause us to be deleted. 209 204 m_processPool.networkProcessCrashed(*this, WTFMove(pendingReplies)); 210 205 } … … 274 269 m_updateBlockCookiesCallbackMap.clear(); 275 270 276 // This maycause us to be deleted.271 // This will cause us to be deleted. 277 272 networkProcessCrashed(); 278 273 } -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h
r236425 r236464 65 65 struct WebsiteData; 66 66 67 class NetworkProcessProxy : public ChildProcessProxy, private ProcessThrottlerClient {67 class NetworkProcessProxy final : public ChildProcessProxy, private ProcessThrottlerClient { 68 68 public: 69 static Ref<NetworkProcessProxy> create(WebProcessPool&);69 explicit NetworkProcessProxy(WebProcessPool&); 70 70 ~NetworkProcessProxy(); 71 71 … … 111 111 112 112 private: 113 NetworkProcessProxy(WebProcessPool&);114 115 113 // ChildProcessProxy 116 114 void getLaunchOptions(ProcessLauncher::LaunchOptions&) override; -
trunk/Source/WebKit/UIProcess/Plugins/PluginProcessProxy.h
r236425 r236464 67 67 #endif 68 68 69 class PluginProcessProxy : public ChildProcessProxy{69 class PluginProcessProxy final : public ChildProcessProxy, public ThreadSafeRefCounted<PluginProcessProxy> { 70 70 public: 71 71 static Ref<PluginProcessProxy> create(PluginProcessManager*, const PluginProcessAttributes&, uint64_t pluginProcessToken); -
trunk/Source/WebKit/UIProcess/Storage/StorageProcessProxy.cpp
r236425 r236464 45 45 } 46 46 47 Ref<StorageProcessProxy> StorageProcessProxy::create(WebProcessPool& processPool)48 {49 return adoptRef(*new StorageProcessProxy(processPool));50 }51 52 47 StorageProcessProxy::StorageProcessProxy(WebProcessPool& processPool) 53 48 : ChildProcessProxy(processPool.alwaysRunsAtBackgroundPriority()) -
trunk/Source/WebKit/UIProcess/Storage/StorageProcessProxy.h
r236425 r236464 48 48 struct WebsiteData; 49 49 50 class StorageProcessProxy : public ChildProcessProxy {50 class StorageProcessProxy final : public ChildProcessProxy { 51 51 public: 52 static Ref<StorageProcessProxy> create(WebProcessPool&);52 explicit StorageProcessProxy(WebProcessPool&); 53 53 ~StorageProcessProxy(); 54 54 … … 62 62 63 63 private: 64 StorageProcessProxy(WebProcessPool&);65 66 64 // ChildProcessProxy 67 65 void getLaunchOptions(ProcessLauncher::LaunchOptions&) override; -
trunk/Source/WebKit/UIProcess/WebProcessPool.cpp
r236425 r236464 472 472 } 473 473 474 m_networkProcess = NetworkProcessProxy::create(*this);474 m_networkProcess = std::make_unique<NetworkProcessProxy>(*this); 475 475 476 476 NetworkProcessCreationParameters parameters; … … 613 613 #endif 614 614 615 m_storageProcess = StorageProcessProxy::create(*this);615 m_storageProcess = std::make_unique<StorageProcessProxy>(*this); 616 616 m_storageProcess->send(Messages::StorageProcess::InitializeWebsiteDataStore(parameters), 0); 617 617 } … … 649 649 void WebProcessPool::establishWorkerContextConnectionToStorageProcess(StorageProcessProxy& proxy, SecurityOriginData&& securityOrigin, std::optional<PAL::SessionID> sessionID) 650 650 { 651 ASSERT_UNUSED(proxy, &proxy == m_storageProcess );651 ASSERT_UNUSED(proxy, &proxy == m_storageProcess.get()); 652 652 653 653 if (m_serviceWorkerProcesses.contains(securityOrigin)) -
trunk/Source/WebKit/UIProcess/WebProcessPool.h
r236425 r236464 627 627 bool m_canHandleHTTPSServerTrustEvaluation { true }; 628 628 bool m_didNetworkProcessCrash { false }; 629 RefPtr<NetworkProcessProxy> m_networkProcess;630 RefPtr<StorageProcessProxy> m_storageProcess;629 std::unique_ptr<NetworkProcessProxy> m_networkProcess; 630 std::unique_ptr<StorageProcessProxy> m_storageProcess; 631 631 632 632 HashMap<uint64_t, RefPtr<DictionaryCallback>> m_dictionaryCallbacks; -
trunk/Source/WebKit/UIProcess/WebProcessProxy.h
r236425 r236464 92 92 #endif 93 93 94 class WebProcessProxy : public ChildProcessProxy, public ResponsivenessTimer::Client, p rivate ProcessThrottlerClient {94 class WebProcessProxy : public ChildProcessProxy, public ResponsivenessTimer::Client, public ThreadSafeRefCounted<WebProcessProxy>, private ProcessThrottlerClient { 95 95 public: 96 96 typedef HashMap<uint64_t, RefPtr<WebFrameProxy>> WebFrameProxyMap;
Note:
See TracChangeset
for help on using the changeset viewer.