Browse Source

Fixed non-atomic access to transports shared_ptr on early close

Paul-Louis Ageneau 3 years ago
parent
commit
fe2d5e09a7
2 changed files with 6 additions and 6 deletions
  1. 3 3
      src/impl/peerconnection.cpp
  2. 3 3
      src/impl/websocket.cpp

+ 3 - 3
src/impl/peerconnection.cpp

@@ -166,7 +166,7 @@ shared_ptr<IceTransport> PeerConnection::initIceTransport() {
 
 		std::atomic_store(&mIceTransport, transport);
 		if (state.load() == State::Closed) {
-			mIceTransport.reset();
+			std::atomic_store(&mIceTransport, decltype(mIceTransport)(nullptr));
 			throw std::runtime_error("Connection is closed");
 		}
 		transport->start();
@@ -241,7 +241,7 @@ shared_ptr<DtlsTransport> PeerConnection::initDtlsTransport() {
 
 		std::atomic_store(&mDtlsTransport, transport);
 		if (state.load() == State::Closed) {
-			mDtlsTransport.reset();
+			std::atomic_store(&mDtlsTransport, decltype(mDtlsTransport)(nullptr));
 			throw std::runtime_error("Connection is closed");
 		}
 		transport->start();
@@ -303,7 +303,7 @@ shared_ptr<SctpTransport> PeerConnection::initSctpTransport() {
 
 		std::atomic_store(&mSctpTransport, transport);
 		if (state.load() == State::Closed) {
-			mSctpTransport.reset();
+			std::atomic_store(&mSctpTransport, decltype(mSctpTransport)(nullptr));
 			throw std::runtime_error("Connection is closed");
 		}
 		transport->start();

+ 3 - 3
src/impl/websocket.cpp

@@ -212,7 +212,7 @@ shared_ptr<TcpTransport> WebSocket::setTcpTransport(shared_ptr<TcpTransport> tra
 
 		std::atomic_store(&mTcpTransport, transport);
 		if (state == WebSocket::State::Closed) {
-			mTcpTransport.reset();
+			std::atomic_store(&mTcpTransport, decltype(mTcpTransport)(nullptr));
 			throw std::runtime_error("Connection is closed");
 		}
 		transport->start();
@@ -275,7 +275,7 @@ shared_ptr<TlsTransport> WebSocket::initTlsTransport() {
 
 		std::atomic_store(&mTlsTransport, transport);
 		if (state == WebSocket::State::Closed) {
-			mTlsTransport.reset();
+			std::atomic_store(&mTlsTransport, decltype(mTlsTransport)(nullptr));
 			throw std::runtime_error("Connection is closed");
 		}
 		transport->start();
@@ -343,7 +343,7 @@ shared_ptr<WsTransport> WebSocket::initWsTransport() {
 
 		std::atomic_store(&mWsTransport, transport);
 		if (state == WebSocket::State::Closed) {
-			mWsTransport.reset();
+			std::atomic_store(&mWsTransport, decltype(mWsTransport)(nullptr));
 			throw std::runtime_error("Connection is closed");
 		}
 		transport->start();