Browse Source

Fixed possible race condition on Transport::incoming()

Paul-Louis Ageneau 5 years ago
parent
commit
2729b247fa
3 changed files with 10 additions and 5 deletions
  1. 2 0
      src/dtlstransport.cpp
  2. 1 0
      src/sctptransport.cpp
  3. 7 5
      src/transport.hpp

+ 2 - 0
src/dtlstransport.cpp

@@ -100,6 +100,7 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, shared_ptr<Certific
 	gnutls_transport_set_pull_timeout_function(mSession, TimeoutCallback);
 
 	mRecvThread = std::thread(&DtlsTransport::runRecvLoop, this);
+	registerIncoming();
 }
 
 DtlsTransport::~DtlsTransport() {
@@ -410,6 +411,7 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, shared_ptr<Certific
 	SSL_set_tmp_ecdh(mSsl, ecdh.get());
 
 	mRecvThread = std::thread(&DtlsTransport::runRecvLoop, this);
+	registerIncoming();
 }
 
 DtlsTransport::~DtlsTransport() {

+ 1 - 0
src/sctptransport.cpp

@@ -163,6 +163,7 @@ SctpTransport::SctpTransport(std::shared_ptr<Transport> lower, uint16_t port,
 		throw std::runtime_error("Could not set SCTP send buffer size, errno=" +
 		                         std::to_string(errno));
 
+	registerIncoming();
 	connect();
 }
 

+ 7 - 5
src/transport.hpp

@@ -32,10 +32,7 @@ using namespace std::placeholders;
 
 class Transport {
 public:
-	Transport(std::shared_ptr<Transport> lower = nullptr) : mLower(std::move(lower)) {
-		if (mLower)
-			mLower->onRecv(std::bind(&Transport::incoming, this, _1));
-	}
+	Transport(std::shared_ptr<Transport> lower = nullptr) : mLower(std::move(lower)) {}
 	virtual ~Transport() { stop(); }
 
 	virtual bool stop() {
@@ -44,10 +41,15 @@ public:
 		return !mShutdown.exchange(true);
 	}
 
-	virtual bool send(message_ptr message) = 0;
+	void registerIncoming() {
+		if (mLower)
+			mLower->onRecv(std::bind(&Transport::incoming, this, _1));
+	}
 
 	void onRecv(message_callback callback) { mRecvCallback = std::move(callback); }
 
+	virtual bool send(message_ptr message) = 0;
+
 protected:
 	void recv(message_ptr message) { mRecvCallback(message); }