From bdb3dedf2c91796b540955f6815390c6ba1d576a Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Wed, 22 Jul 2020 16:33:39 +0300
Subject: [PATCH] Fix for corrupt pointer in packet receiver

---
 components/net/cpp/src/dispatcher.cpp   | 2 +-
 components/streams/src/stream.cpp       | 9 +++++++--
 components/structures/src/new_frame.cpp | 7 +++++++
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/components/net/cpp/src/dispatcher.cpp b/components/net/cpp/src/dispatcher.cpp
index b1a5b265e..997ca1238 100644
--- a/components/net/cpp/src/dispatcher.cpp
+++ b/components/net/cpp/src/dispatcher.cpp
@@ -101,7 +101,7 @@ void ftl::net::Dispatcher::dispatch_call(Peer &s, const msgpack::object &msg) {
 
 optional<Dispatcher::adaptor_type> ftl::net::Dispatcher::_locateHandler(const std::string &name) const {
 	auto it_func = funcs_.find(name);
-	if (it_func == end(funcs_)) {
+	if (it_func == funcs_.end()) {
 		if (parent_ != nullptr) {
 			return parent_->_locateHandler(name);
 		} else {
diff --git a/components/streams/src/stream.cpp b/components/streams/src/stream.cpp
index 782ec1fb3..b97667d2b 100644
--- a/components/streams/src/stream.cpp
+++ b/components/streams/src/stream.cpp
@@ -86,12 +86,17 @@ void Muxer::add(Stream *s, size_t fsid) {
 	auto &se = streams_.emplace_back();
 	int i = streams_.size()-1;
 	se.stream = s;
-	ftl::stream::Muxer::StreamEntry *ptr = &se;
 
-	handles_.push_back(std::move(s->onPacket([this,s,i,fsid,ptr](const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt) {
+	handles_.push_back(std::move(s->onPacket([this,s,i,fsid](const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt) {
 		//TODO: Allow input streams to have other streamIDs
 		// Same fsid means same streamIDs map together in the end
 
+		ftl::stream::Muxer::StreamEntry *ptr = nullptr;
+		{
+			SHARED_LOCK(mutex_,lk);
+			ptr = &streams_[i];
+		}
+
 		ftl::codecs::StreamPacket spkt2 = spkt;
 		ptr->original_fsid = spkt.streamID;
 		spkt2.streamID = fsid;
diff --git a/components/structures/src/new_frame.cpp b/components/structures/src/new_frame.cpp
index a290b25e5..ba79f32bf 100644
--- a/components/structures/src/new_frame.cpp
+++ b/components/structures/src/new_frame.cpp
@@ -427,6 +427,13 @@ std::unordered_set<ftl::codecs::Channel> Frame::allChannels() const {
 			res.emplace(k);
 		}
 	}
+
+	uint64_t m = 1;
+	// TODO: NAIVE, use ffs or ctz.
+	for (int i=0; i<32; ++i) {
+		if (m & available_) res.emplace(static_cast<Channel>(i));
+		m <<= 1;
+	}
 	return res;
 }
 
-- 
GitLab