From d733dfe10dc576ce8e408846103e98241d341df7 Mon Sep 17 00:00:00 2001 From: Yiannis Marangos Date: Fri, 2 Aug 2024 16:29:14 +0300 Subject: [PATCH] fix(websocket-websys): Unsubscribe from websocket events on drop Avoid use-after-free handler invocation from JS side. Fixes #5490 Pull-Request: #5521. --- Cargo.lock | 2 +- Cargo.toml | 2 +- transports/websocket-websys/CHANGELOG.md | 5 +++++ transports/websocket-websys/Cargo.toml | 2 +- transports/websocket-websys/src/lib.rs | 6 ++++++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3fda6b57aa8..b4d877e49d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3515,7 +3515,7 @@ dependencies = [ [[package]] name = "libp2p-websocket-websys" -version = "0.3.2" +version = "0.3.3" dependencies = [ "bytes", "futures", diff --git a/Cargo.toml b/Cargo.toml index 55fc43d5b5a..52226f6c6e3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -113,7 +113,7 @@ libp2p-webrtc = { version = "0.7.1-alpha", path = "transports/webrtc" } libp2p-webrtc-utils = { version = "0.2.1", path = "misc/webrtc-utils" } libp2p-webrtc-websys = { version = "0.3.0-alpha", path = "transports/webrtc-websys" } libp2p-websocket = { version = "0.43.2", path = "transports/websocket" } -libp2p-websocket-websys = { version = "0.3.2", path = "transports/websocket-websys" } +libp2p-websocket-websys = { version = "0.3.3", path = "transports/websocket-websys" } libp2p-webtransport-websys = { version = "0.3.0", path = "transports/webtransport-websys" } libp2p-yamux = { version = "0.45.2", path = "muxers/yamux" } multiaddr = "0.18.1" diff --git a/transports/websocket-websys/CHANGELOG.md b/transports/websocket-websys/CHANGELOG.md index f92b76ebeaa..c16ad6cc406 100644 --- a/transports/websocket-websys/CHANGELOG.md +++ b/transports/websocket-websys/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.3 + +- Fix use-after-free handler invocation from JS side. + See [PR 5521](https://github.com/libp2p/rust-libp2p/pull/5521). + ## 0.3.2 - Change close code in drop implementation to `1000` given that in browsers only diff --git a/transports/websocket-websys/Cargo.toml b/transports/websocket-websys/Cargo.toml index 48bf8d9818a..a2127986ddc 100644 --- a/transports/websocket-websys/Cargo.toml +++ b/transports/websocket-websys/Cargo.toml @@ -3,7 +3,7 @@ name = "libp2p-websocket-websys" edition = "2021" rust-version = "1.60.0" description = "WebSocket for libp2p under WASM environment" -version = "0.3.2" +version = "0.3.3" authors = ["Vince Vasta "] license = "MIT" repository = "https://github.com/libp2p/rust-libp2p" diff --git a/transports/websocket-websys/src/lib.rs b/transports/websocket-websys/src/lib.rs index ca56d5727a5..c96d1d6aa3a 100644 --- a/transports/websocket-websys/src/lib.rs +++ b/transports/websocket-websys/src/lib.rs @@ -434,6 +434,12 @@ impl AsyncWrite for Connection { impl Drop for Connection { fn drop(&mut self) { + // Unset event listeners, as otherwise they will be called by JS after the handlers have already been dropped. + self.inner.socket.set_onclose(None); + self.inner.socket.set_onerror(None); + self.inner.socket.set_onopen(None); + self.inner.socket.set_onmessage(None); + // In browsers, userland code is not allowed to use any other status code than 1000: https://websockets.spec.whatwg.org/#dom-websocket-close const REGULAR_CLOSE: u16 = 1000; // See https://www.rfc-editor.org/rfc/rfc6455.html#section-7.4.1.