Browse Source

Fix unexpected deallocation of element in RtcpChainableHandler's chain

Filip Klembara 4 years ago
parent
commit
b347afae14
2 changed files with 5 additions and 1 deletions
  1. 4 0
      src/messagehandlerelement.cpp
  2. 1 1
      src/rtcpchainablehandler.cpp

+ 4 - 0
src/messagehandlerelement.cpp

@@ -57,6 +57,10 @@ void MessageHandlerElement::removeFromChain() {
 
 
 void MessageHandlerElement::recursiveRemoveChain() {
 void MessageHandlerElement::recursiveRemoveChain() {
 	if (downstream.has_value()) {
 	if (downstream.has_value()) {
+		// `recursiveRemoveChain` removes last strong reference to downstream element
+		// we need to keep strong reference to prevent deallocation of downstream element
+		// during `recursiveRemoveChain`
+		auto strongDownstreamPtr = downstream;
 		downstream.value()->recursiveRemoveChain();
 		downstream.value()->recursiveRemoveChain();
 	}
 	}
 	removeFromChain();
 	removeFromChain();

+ 1 - 1
src/rtcpchainablehandler.cpp

@@ -21,7 +21,7 @@
 
 
 namespace rtc {
 namespace rtc {
 
 
-RtcpChainableHandler::RtcpChainableHandler(std::shared_ptr<MessageHandlerRootElement> root): root(root), leaf(root) { }
+RtcpChainableHandler::RtcpChainableHandler(std::shared_ptr<MessageHandlerRootElement> root): RtcpHandler(), root(root), leaf(root) { }
 
 
 RtcpChainableHandler::~RtcpChainableHandler() {
 RtcpChainableHandler::~RtcpChainableHandler() {
 	leaf->recursiveRemoveChain();
 	leaf->recursiveRemoveChain();