From 7a5f9b62cca4f65b2194c6b842be323ad4c312ff Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> Date: Wed, 6 May 2015 14:27:19 +0200 Subject: [PATCH] Fix crash when updating a storage context with active requests Requests keep pointers to objects owneded by the storage context such as the SSL context handler and HTTP cache. This means we must stop all requests before destroying the context, otherwise the requests will access deleted data. Change-Id: I67863287b3ffb470c8d84ff6cac143493998a6da Reviewed-by: Andras Becsi <andras.becsi@theqtcompany.com> --- src/core/url_request_context_getter_qt.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/core/url_request_context_getter_qt.cpp b/src/core/url_request_context_getter_qt.cpp index dec6b4dbb..4f893175a 100644 --- a/src/core/url_request_context_getter_qt.cpp +++ b/src/core/url_request_context_getter_qt.cpp @@ -124,6 +124,18 @@ void URLRequestContextGetterQt::generateStorage() { Q_ASSERT(m_urlRequestContext); + if (m_storage) { + // We must stop all requests before deleting their backends. + std::set<const net::URLRequest*>* url_requests = m_urlRequestContext->url_requests(); + std::set<const net::URLRequest*>::const_iterator it = url_requests->begin(); + std::set<const net::URLRequest*>::const_iterator end = url_requests->end(); + for ( ; it != end; ++it) { + net::URLRequest* request = const_cast<net::URLRequest*>(*it); + if (request) + request->Cancel(); + } + } + m_storage.reset(new net::URLRequestContextStorage(m_urlRequestContext.get())); net::ProxyConfigService *proxyConfigService = m_proxyConfigService.fetchAndStoreAcquire(0); -- GitLab