Title: [269512] trunk/Source/WebCore
- Revision
- 269512
- Author
- [email protected]
- Date
- 2020-11-06 08:01:31 -0800 (Fri, 06 Nov 2020)
Log Message
Fix crashes around NetworkStorageSession::registerCookieChangeListenersIfNecessary
https://bugs.webkit.org/show_bug.cgi?id=218626
<rdar://66837628>
Patch by Alex Christensen <[email protected]> on 2020-11-06
Reviewed by Chris Dumez.
We need to check if the NetworkStorageSession has been deallocated before using its member variables in a callback from CFNetwork.
* platform/network/NetworkStorageSession.h:
* platform/network/cocoa/NetworkStorageSessionCocoa.mm:
(WebCore::NetworkStorageSession::registerCookieChangeListenersIfNecessary):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (269511 => 269512)
--- trunk/Source/WebCore/ChangeLog 2020-11-06 15:50:49 UTC (rev 269511)
+++ trunk/Source/WebCore/ChangeLog 2020-11-06 16:01:31 UTC (rev 269512)
@@ -1,3 +1,17 @@
+2020-11-06 Alex Christensen <[email protected]>
+
+ Fix crashes around NetworkStorageSession::registerCookieChangeListenersIfNecessary
+ https://bugs.webkit.org/show_bug.cgi?id=218626
+ <rdar://66837628>
+
+ Reviewed by Chris Dumez.
+
+ We need to check if the NetworkStorageSession has been deallocated before using its member variables in a callback from CFNetwork.
+
+ * platform/network/NetworkStorageSession.h:
+ * platform/network/cocoa/NetworkStorageSessionCocoa.mm:
+ (WebCore::NetworkStorageSession::registerCookieChangeListenersIfNecessary):
+
2020-11-06 Antti Koivisto <[email protected]>
[LFC][Integration] localCaretOffset should use iterator
Modified: trunk/Source/WebCore/platform/network/NetworkStorageSession.h (269511 => 269512)
--- trunk/Source/WebCore/platform/network/NetworkStorageSession.h 2020-11-06 15:50:49 UTC (rev 269511)
+++ trunk/Source/WebCore/platform/network/NetworkStorageSession.h 2020-11-06 16:01:31 UTC (rev 269512)
@@ -36,6 +36,7 @@
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/WallTime.h>
+#include <wtf/WeakPtr.h>
#include <wtf/text/WTFString.h>
#if PLATFORM(COCOA) || USE(CFURLCONNECTION)
@@ -98,7 +99,7 @@
};
#endif
-class NetworkStorageSession {
+class NetworkStorageSession : public CanMakeWeakPtr<NetworkStorageSession> {
WTF_MAKE_NONCOPYABLE(NetworkStorageSession); WTF_MAKE_FAST_ALLOCATED;
public:
using TopFrameDomain = WebCore::RegistrableDomain;
Modified: trunk/Source/WebCore/platform/network/cocoa/NetworkStorageSessionCocoa.mm (269511 => 269512)
--- trunk/Source/WebCore/platform/network/cocoa/NetworkStorageSessionCocoa.mm 2020-11-06 15:50:49 UTC (rev 269511)
+++ trunk/Source/WebCore/platform/network/cocoa/NetworkStorageSessionCocoa.mm 2020-11-06 16:01:31 UTC (rev 269512)
@@ -33,6 +33,7 @@
#import "SameSiteInfo.h"
#import <pal/spi/cf/CFNetworkSPI.h>
#import <wtf/BlockObjCExceptions.h>
+#import <wtf/BlockPtr.h>
#import <wtf/Optional.h>
#import <wtf/ProcessPrivilege.h>
#import <wtf/URL.h>
@@ -624,7 +625,9 @@
m_didRegisterCookieListeners = true;
- [nsCookieStorage() _setCookiesChangedHandler:^(NSArray<NSHTTPCookie*>* addedCookies, NSString* domainForChangedCookie) {
+ [nsCookieStorage() _setCookiesChangedHandler:makeBlockPtr([this, weakThis = makeWeakPtr(*this)](NSArray<NSHTTPCookie *> *addedCookies, NSString *domainForChangedCookie) {
+ if (!weakThis)
+ return;
String host = domainForChangedCookie;
auto it = m_cookieChangeObservers.find(host);
if (it == m_cookieChangeObservers.end())
@@ -634,9 +637,11 @@
return;
for (auto* observer : it->value)
observer->cookiesAdded(host, cookies);
- } onQueue:dispatch_get_main_queue()];
+ }).get() onQueue:dispatch_get_main_queue()];
- [nsCookieStorage() _setCookiesRemovedHandler:^(NSArray<NSHTTPCookie*>* removedCookies, NSString* domainForRemovedCookies, bool removeAllCookies) {
+ [nsCookieStorage() _setCookiesRemovedHandler:makeBlockPtr([this, weakThis = makeWeakPtr(*this)](NSArray<NSHTTPCookie *> *removedCookies, NSString *domainForRemovedCookies, bool removeAllCookies) {
+ if (!weakThis)
+ return;
if (removeAllCookies) {
for (auto& observers : m_cookieChangeObservers.values()) {
for (auto* observer : observers)
@@ -655,7 +660,7 @@
return;
for (auto* observer : it->value)
observer->cookiesDeleted(host, cookies);
- } onQueue:dispatch_get_main_queue()];
+ }).get() onQueue:dispatch_get_main_queue()];
}
void NetworkStorageSession::unregisterCookieChangeListenersIfNecessary()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes