From e7e9c716253e8e942b03d6abdbbfef5bf4150034 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 11 Oct 2016 12:54:29 -0700 Subject: [PATCH] Fix AssetClient crash Do not access message data until message is complete --- libraries/networking/src/AssetClient.cpp | 23 ++++++++++---------- libraries/networking/src/AssetClient.h | 2 +- libraries/networking/src/ReceivedMessage.cpp | 2 +- libraries/networking/src/ReceivedMessage.h | 2 +- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp index f5e2caa60d..6a2cbf20cf 100644 --- a/libraries/networking/src/AssetClient.cpp +++ b/libraries/networking/src/AssetClient.cpp @@ -141,7 +141,11 @@ bool haveAssetServer() { } GetMappingRequest* AssetClient::createGetMappingRequest(const AssetPath& path) { - return new GetMappingRequest(path); + auto request = new GetMappingRequest(path); + + request->moveToThread(thread()); + + return request; } GetAllMappingsRequest* AssetClient::createGetAllMappingsRequest() { @@ -305,7 +309,7 @@ void AssetClient::handleAssetGetInfoReply(QSharedPointer messag void AssetClient::handleAssetGetReply(QSharedPointer message, SharedNodePointer senderNode) { Q_ASSERT(QThread::currentThread() == thread()); - auto assetHash = message->read(SHA256_HASH_LENGTH); + auto assetHash = message->readHead(SHA256_HASH_LENGTH); qCDebug(asset_client) << "Got reply for asset: " << assetHash.toHex(); MessageID messageID; @@ -349,8 +353,8 @@ void AssetClient::handleAssetGetReply(QSharedPointer message, S } else { auto weakNode = senderNode.toWeakRef(); - connect(message.data(), &ReceivedMessage::progress, this, [this, weakNode, messageID, length]() { - handleProgressCallback(weakNode, messageID, length); + connect(message.data(), &ReceivedMessage::progress, this, [this, weakNode, messageID, length](qint64 size) { + handleProgressCallback(weakNode, messageID, size, length); }); connect(message.data(), &ReceivedMessage::completed, this, [this, weakNode, messageID]() { handleCompleteCallback(weakNode, messageID); @@ -358,7 +362,8 @@ void AssetClient::handleAssetGetReply(QSharedPointer message, S } } -void AssetClient::handleProgressCallback(const QWeakPointer& node, MessageID messageID, DataOffset length) { +void AssetClient::handleProgressCallback(const QWeakPointer& node, MessageID messageID, + qint64 size, DataOffset length) { auto senderNode = node.toStrongRef(); if (!senderNode) { @@ -381,13 +386,7 @@ void AssetClient::handleProgressCallback(const QWeakPointer& node, Message } auto& callbacks = requestIt->second; - auto& message = callbacks.message; - - if (!message) { - return; - } - - callbacks.progressCallback(message->getSize(), length); + callbacks.progressCallback(size, length); } void AssetClient::handleCompleteCallback(const QWeakPointer& node, MessageID messageID) { diff --git a/libraries/networking/src/AssetClient.h b/libraries/networking/src/AssetClient.h index f951be762d..536a2e3603 100644 --- a/libraries/networking/src/AssetClient.h +++ b/libraries/networking/src/AssetClient.h @@ -93,7 +93,7 @@ private: bool cancelGetAssetRequest(MessageID id); bool cancelUploadAssetRequest(MessageID id); - void handleProgressCallback(const QWeakPointer& node, MessageID messageID, DataOffset length); + void handleProgressCallback(const QWeakPointer& node, MessageID messageID, qint64 size, DataOffset length); void handleCompleteCallback(const QWeakPointer& node, MessageID messageID); struct GetAssetRequestData { diff --git a/libraries/networking/src/ReceivedMessage.cpp b/libraries/networking/src/ReceivedMessage.cpp index cd3eb03473..d37878be95 100644 --- a/libraries/networking/src/ReceivedMessage.cpp +++ b/libraries/networking/src/ReceivedMessage.cpp @@ -61,7 +61,7 @@ void ReceivedMessage::appendPacket(NLPacket& packet) { _data.append(packet.getPayload(), packet.getPayloadSize()); if (_numPackets % EMIT_PROGRESS_EVERY_X_PACKETS == 0) { - emit progress(); + emit progress(getSize()); } if (packet.getPacketPosition() == NLPacket::PacketPosition::LAST) { diff --git a/libraries/networking/src/ReceivedMessage.h b/libraries/networking/src/ReceivedMessage.h index e9131c074f..3acb7163e7 100644 --- a/libraries/networking/src/ReceivedMessage.h +++ b/libraries/networking/src/ReceivedMessage.h @@ -78,7 +78,7 @@ public: template qint64 readHeadPrimitive(T* data); signals: - void progress(); + void progress(qint64 size); void completed(); private slots: