From d387974e9db902cc2c5da92f54913bdc381d92a3 Mon Sep 17 00:00:00 2001 From: Robert Stanley Judka Date: Sun, 12 Apr 2020 17:49:52 -1000 Subject: [PATCH] fix interleaved channel crashing #2 --- .../f1x/aasdk/Messenger/MessageInStream.hpp | 5 +-- src/Messenger/MessageInStream.cpp | 32 +++++++++++-------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/include/f1x/aasdk/Messenger/MessageInStream.hpp b/include/f1x/aasdk/Messenger/MessageInStream.hpp index c8e24b0..2d40466 100644 --- a/include/f1x/aasdk/Messenger/MessageInStream.hpp +++ b/include/f1x/aasdk/Messenger/MessageInStream.hpp @@ -18,12 +18,14 @@ #pragma once +#include #include #include #include #include #include #include + namespace f1x { namespace aasdk @@ -51,8 +53,7 @@ private: FrameType recentFrameType_; ReceivePromise::Pointer promise_; Message::Pointer message_; - - std::map channel_assembly_buffers; + std::map messageBuffer_; }; } diff --git a/src/Messenger/MessageInStream.cpp b/src/Messenger/MessageInStream.cpp index 81084da..e44ce29 100644 --- a/src/Messenger/MessageInStream.cpp +++ b/src/Messenger/MessageInStream.cpp @@ -18,7 +18,7 @@ #include #include -#include + namespace f1x { namespace aasdk @@ -63,28 +63,32 @@ void MessageInStream::startReceive(ReceivePromise::Pointer promise) void MessageInStream::receiveFrameHeaderHandler(const common::DataConstBuffer& buffer) { FrameHeader frameHeader(buffer); + if(message_ != nullptr && message_->getChannelId() != frameHeader.getChannelId()) { - // we have interleaved channels, stop working on the old one and store it for later; Switch to the new one - channel_assembly_buffers[message_->getChannelId()] = message_; + messageBuffer_[message_->getChannelId()] = message_; message_ = nullptr; - // message_.reset(); - // promise_->reject(error::Error(error::ErrorCode::MESSENGER_INTERTWINED_CHANNELS)); - // promise_.reset(); - // return; } - auto prevBuffer = channel_assembly_buffers.find(frameHeader.getChannelId()); - if(prevBuffer != channel_assembly_buffers.end()){ // is there previous data in our map? - if(frameHeader.getType()!=FrameType::FIRST) //only use the data if we're not on a new frame, otherwise disregard - message_ = prevBuffer->second; - else{ + + auto bufferedMessage = messageBuffer_.find(frameHeader.getChannelId()); + + if(bufferedMessage != messageBuffer_.end()) + { + if(frameHeader.getType() != FrameType::FIRST) + { + message_ = bufferedMessage->second; + } + else + { message_ = std::make_shared(frameHeader.getChannelId(), frameHeader.getEncryptionType(), frameHeader.getMessageType()); } - channel_assembly_buffers.erase(prevBuffer); // get rid of the previously stored data because it's now our working data. + messageBuffer_.erase(bufferedMessage); } - else if(message_ == nullptr){ + else if(message_ == nullptr) + { message_ = std::make_shared(frameHeader.getChannelId(), frameHeader.getEncryptionType(), frameHeader.getMessageType()); } + recentFrameType_ = frameHeader.getType(); const size_t frameSize = FrameSize::getSizeOf(frameHeader.getType() == FrameType::FIRST ? FrameSizeType::EXTENDED : FrameSizeType::SHORT);