diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f38e77021..8d335b3c08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### NEXT - Worker: Fix memory leak when using `WebRtcServer` with TCP enabled ([PR #1389](https://github.com/versatica/mediasoup/pull/1389)). +- Worker: Fix crash when closing `WebRtcServer` with active `WebRtcTransports` ([PR #1390](https://github.com/versatica/mediasoup/pull/1390)). ### 3.14.4 diff --git a/worker/src/RTC/WebRtcServer.cpp b/worker/src/RTC/WebRtcServer.cpp index 274391d922..c088564546 100644 --- a/worker/src/RTC/WebRtcServer.cpp +++ b/worker/src/RTC/WebRtcServer.cpp @@ -236,6 +236,15 @@ namespace RTC this->shared->channelMessageRegistrator->UnregisterHandler(this->id); + // NOTE: We need to close WebRtcTransports first since they may need to + // send DTLS Close Alert so UDP sockets and TCP connections must remain + // open. + for (auto* webRtcTransport : this->webRtcTransports) + { + webRtcTransport->ListenServerClosed(); + } + this->webRtcTransports.clear(); + for (auto& item : this->udpSocketOrTcpServers) { delete item.udpSocket; @@ -245,12 +254,6 @@ namespace RTC item.tcpServer = nullptr; } this->udpSocketOrTcpServers.clear(); - - for (auto* webRtcTransport : this->webRtcTransports) - { - webRtcTransport->ListenServerClosed(); - } - this->webRtcTransports.clear(); } flatbuffers::Offset WebRtcServer::FillBuffer(