From 4f32749c176372f0067d2695454e4b5f624f72b2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 21 Mar 2016 11:54:41 -0700 Subject: [PATCH] Fix edge-case where resource can receive a signal after request deleted --- libraries/networking/src/ResourceCache.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index e345bed81c..98c6b22089 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -228,9 +228,10 @@ Resource::Resource(const QUrl& url, bool delayLoad) : Resource::~Resource() { if (_request) { - ResourceCache::requestCompleted(this); + _request->disconnect(this); _request->deleteLater(); _request = nullptr; + ResourceCache::requestCompleted(this); } } @@ -375,7 +376,14 @@ void Resource::handleDownloadProgress(uint64_t bytesReceived, uint64_t bytesTota } void Resource::handleReplyFinished() { - Q_ASSERT(_request); + Q_ASSERT_X(_request, "Resource::handleReplyFinished", "Request should not be null while in handleReplyFinished"); + + if (!_request || _request != sender()) { + // This can happen in the edge case that a request is timed out, but a `finished` signal is emitted before it is deleted. + qWarning(networking) << "Received signal Resource::handleReplyFinished from ResourceRequest that is not the current" + << " request: " << sender() << ", " << _request; + return; + } ResourceCache::requestCompleted(this);