Changeset 243252 in webkit
- Timestamp:
- Mar 20, 2019, 4:15:04 PM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
-
ChangeLog (modified) (1 diff)
-
Modules/websockets/WebSocketChannel.cpp (modified) (12 diffs)
-
Modules/websockets/WebSocketChannel.h (modified) (1 diff)
-
Modules/websockets/WebSocketChannelClient.h (modified) (1 diff)
-
Modules/websockets/WebSocketHandshake.cpp (modified) (1 diff)
-
Modules/websockets/WebSocketHandshake.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r243249 r243252 1 2019-03-20 Alex Christensen <achristensen@webkit.org> 2 3 Use WeakPtr instead of storing raw pointers in WebSocket code 4 https://bugs.webkit.org/show_bug.cgi?id=196034 5 6 Reviewed by Geoff Garen. 7 8 This could prevent using freed memory if we forget to reset a pointer somewhere. 9 10 * Modules/websockets/WebSocketChannel.cpp: 11 (WebCore::WebSocketChannel::WebSocketChannel): 12 (WebCore::WebSocketChannel::connect): 13 (WebCore::WebSocketChannel::fail): 14 (WebCore::WebSocketChannel::disconnect): 15 (WebCore::WebSocketChannel::didOpenSocketStream): 16 (WebCore::WebSocketChannel::didCloseSocketStream): 17 (WebCore::WebSocketChannel::didFailSocketStream): 18 (WebCore::WebSocketChannel::processBuffer): 19 (WebCore::WebSocketChannel::processFrame): 20 (WebCore::WebSocketChannel::processOutgoingFrameQueue): 21 (WebCore::WebSocketChannel::sendFrame): 22 * Modules/websockets/WebSocketChannel.h: 23 * Modules/websockets/WebSocketChannelClient.h: 24 * Modules/websockets/WebSocketHandshake.cpp: 25 (WebCore::WebSocketHandshake::WebSocketHandshake): 26 * Modules/websockets/WebSocketHandshake.h: 27 1 28 2019-03-20 Dean Jackson <dino@apple.com> 2 29 -
trunk/Source/WebCore/Modules/websockets/WebSocketChannel.cpp
r241244 r243252 64 64 65 65 WebSocketChannel::WebSocketChannel(Document& document, WebSocketChannelClient& client, SocketProvider& provider) 66 : m_document( &document)67 , m_client( &client)66 : m_document(makeWeakPtr(document)) 67 , m_client(makeWeakPtr(client)) 68 68 , m_resumeTimer(*this, &WebSocketChannel::resumeTimerFired) 69 69 , m_closingTimer(*this, &WebSocketChannel::closingTimerFired) … … 113 113 ASSERT(!m_handle); 114 114 ASSERT(!m_suspended); 115 m_handshake = std::make_unique<WebSocketHandshake>(url, protocol, m_document , allowCookies);115 m_handshake = std::make_unique<WebSocketHandshake>(url, protocol, m_document.get(), allowCookies); 116 116 m_handshake->reset(); 117 117 if (m_deflateFramer.canDeflate()) 118 118 m_handshake->addExtensionProcessor(m_deflateFramer.createExtensionProcessor()); 119 119 if (m_identifier) 120 InspectorInstrumentation::didCreateWebSocket(m_document , m_identifier, url);120 InspectorInstrumentation::didCreateWebSocket(m_document.get(), m_identifier, url); 121 121 122 122 if (Frame* frame = m_document->frame()) { … … 215 215 ASSERT(!m_suspended); 216 216 if (m_document) { 217 InspectorInstrumentation::didReceiveWebSocketFrameError(m_document , m_identifier, reason);217 InspectorInstrumentation::didReceiveWebSocketFrameError(m_document.get(), m_identifier, reason); 218 218 219 219 String consoleMessage; … … 246 246 LOG(Network, "WebSocketChannel %p disconnect()", this); 247 247 if (m_identifier && m_document) 248 InspectorInstrumentation::didCloseWebSocket(m_document , m_identifier);248 InspectorInstrumentation::didCloseWebSocket(m_document.get(), m_identifier); 249 249 if (m_handshake) 250 250 m_handshake->clearDocument(); … … 274 274 return; 275 275 if (m_identifier && UNLIKELY(InspectorInstrumentation::hasFrontends())) 276 InspectorInstrumentation::willSendWebSocketHandshakeRequest(m_document , m_identifier, m_handshake->clientHandshakeRequest());276 InspectorInstrumentation::willSendWebSocketHandshakeRequest(m_document.get(), m_identifier, m_handshake->clientHandshakeRequest()); 277 277 auto handshakeMessage = m_handshake->clientHandshakeMessage(); 278 278 auto cookieRequestHeaderFieldProxy = m_handshake->clientHandshakeCookieRequestHeaderFieldProxy(); … … 290 290 LOG(Network, "WebSocketChannel %p didCloseSocketStream()", this); 291 291 if (m_identifier && m_document) 292 InspectorInstrumentation::didCloseWebSocket(m_document , m_identifier);292 InspectorInstrumentation::didCloseWebSocket(m_document.get(), m_identifier); 293 293 ASSERT_UNUSED(handle, &handle == m_handle || !m_handle); 294 294 m_closed = true; … … 301 301 if (m_suspended) 302 302 return; 303 WebSocketChannelClient* client = m_client ;303 WebSocketChannelClient* client = m_client.get(); 304 304 m_client = nullptr; 305 305 m_document = nullptr; … … 364 364 else 365 365 message = "WebSocket network error: " + error.localizedDescription(); 366 InspectorInstrumentation::didReceiveWebSocketFrameError(m_document , m_identifier, message);366 InspectorInstrumentation::didReceiveWebSocketFrameError(m_document.get(), m_identifier, message); 367 367 m_document->addConsoleMessage(MessageSource::Network, MessageLevel::Error, message); 368 368 } … … 449 449 if (m_handshake->mode() == WebSocketHandshake::Connected) { 450 450 if (m_identifier) 451 InspectorInstrumentation::didReceiveWebSocketHandshakeResponse(m_document , m_identifier, m_handshake->serverHandshakeResponse());451 InspectorInstrumentation::didReceiveWebSocketHandshakeResponse(m_document.get(), m_identifier, m_handshake->serverHandshakeResponse()); 452 452 String serverSetCookie = m_handshake->serverSetCookie(); 453 453 if (!serverSetCookie.isEmpty()) { … … 583 583 } 584 584 585 InspectorInstrumentation::didReceiveWebSocketFrame(m_document , m_identifier, frame);585 InspectorInstrumentation::didReceiveWebSocketFrame(m_document.get(), m_identifier, frame); 586 586 587 587 switch (frame.opCode) { … … 769 769 m_blobLoader = std::make_unique<FileReaderLoader>(FileReaderLoader::ReadAsArrayBuffer, this); 770 770 m_blobLoaderStatus = BlobLoaderStarted; 771 m_blobLoader->start(m_document , *frame->blobData);771 m_blobLoader->start(m_document.get(), *frame->blobData); 772 772 m_outgoingFrameQueue.prepend(WTFMove(frame)); 773 773 return; … … 821 821 822 822 WebSocketFrame frame(opCode, true, false, true, data, dataLength); 823 InspectorInstrumentation::didSendWebSocketFrame(m_document , m_identifier, frame);823 InspectorInstrumentation::didSendWebSocketFrame(m_document.get(), m_identifier, frame); 824 824 825 825 auto deflateResult = m_deflateFramer.deflate(frame); -
trunk/Source/WebCore/Modules/websockets/WebSocketChannel.h
r241824 r243252 194 194 }; 195 195 196 Document*m_document;197 We bSocketChannelClient*m_client;196 WeakPtr<Document> m_document; 197 WeakPtr<WebSocketChannelClient> m_client; 198 198 std::unique_ptr<WebSocketHandshake> m_handshake; 199 199 RefPtr<SocketStreamHandle> m_handle; -
trunk/Source/WebCore/Modules/websockets/WebSocketChannelClient.h
r223728 r243252 32 32 33 33 #include <wtf/Forward.h> 34 #include <wtf/WeakPtr.h> 34 35 35 36 namespace WebCore { 36 37 37 class WebSocketChannelClient {38 class WebSocketChannelClient : public CanMakeWeakPtr<WebSocketChannelClient> { 38 39 public: 39 40 virtual ~WebSocketChannelClient() = default; -
trunk/Source/WebCore/Modules/websockets/WebSocketHandshake.cpp
r241244 r243252 124 124 , m_clientProtocol(protocol) 125 125 , m_secure(m_url.protocolIs("wss")) 126 , m_document( document)126 , m_document(makeWeakPtr(document)) 127 127 , m_mode(Incomplete) 128 128 , m_allowCookies(allowCookies) -
trunk/Source/WebCore/Modules/websockets/WebSocketHandshake.h
r239427 r243252 36 36 #include "WebSocketExtensionDispatcher.h" 37 37 #include "WebSocketExtensionProcessor.h" 38 #include <wtf/WeakPtr.h> 38 39 #include <wtf/text/WTFString.h> 39 40 … … 101 102 String m_clientProtocol; 102 103 bool m_secure; 103 Document*m_document;104 WeakPtr<Document> m_document; 104 105 105 106 Mode m_mode;
Note:
See TracChangeset
for help on using the changeset viewer.