From 5d7b2bf332efff05c8addccba7f8d09bf1de0bd1 Mon Sep 17 00:00:00 2001 From: Cole Brinsfield Date: Fri, 20 Mar 2020 23:01:59 -0700 Subject: [PATCH 1/2] Fixes interleaved channel crashing --- .../f1x/aasdk/Messenger/MessageInStream.hpp | 4 ++- src/Messenger/MessageInStream.cpp | 31 ++++++++++++------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/include/f1x/aasdk/Messenger/MessageInStream.hpp b/include/f1x/aasdk/Messenger/MessageInStream.hpp index 262c3f5..c8e24b0 100644 --- a/include/f1x/aasdk/Messenger/MessageInStream.hpp +++ b/include/f1x/aasdk/Messenger/MessageInStream.hpp @@ -23,7 +23,7 @@ #include #include #include - +#include namespace f1x { namespace aasdk @@ -51,6 +51,8 @@ private: FrameType recentFrameType_; ReceivePromise::Pointer promise_; Message::Pointer message_; + + std::map channel_assembly_buffers; }; } diff --git a/src/Messenger/MessageInStream.cpp b/src/Messenger/MessageInStream.cpp index 72a666f..81084da 100644 --- a/src/Messenger/MessageInStream.cpp +++ b/src/Messenger/MessageInStream.cpp @@ -18,7 +18,7 @@ #include #include - +#include namespace f1x { namespace aasdk @@ -63,19 +63,28 @@ void MessageInStream::startReceive(ReceivePromise::Pointer promise) void MessageInStream::receiveFrameHeaderHandler(const common::DataConstBuffer& buffer) { FrameHeader frameHeader(buffer); - - if(message_ == nullptr) + 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_; + 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{ + 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. + } + else if(message_ == nullptr){ message_ = std::make_shared(frameHeader.getChannelId(), frameHeader.getEncryptionType(), frameHeader.getMessageType()); } - else if(message_->getChannelId() != frameHeader.getChannelId()) - { - message_.reset(); - promise_->reject(error::Error(error::ErrorCode::MESSENGER_INTERTWINED_CHANNELS)); - promise_.reset(); - return; - } - recentFrameType_ = frameHeader.getType(); const size_t frameSize = FrameSize::getSizeOf(frameHeader.getType() == FrameType::FIRST ? FrameSizeType::EXTENDED : FrameSizeType::SHORT); From d387974e9db902cc2c5da92f54913bdc381d92a3 Mon Sep 17 00:00:00 2001 From: Robert Stanley Judka Date: Sun, 12 Apr 2020 17:49:52 -1000 Subject: [PATCH 2/2] 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);