diff --git a/transports/tcp/CHANGELOG.md b/transports/tcp/CHANGELOG.md index 750cebdb..95078a63 100644 --- a/transports/tcp/CHANGELOG.md +++ b/transports/tcp/CHANGELOG.md @@ -1,6 +1,9 @@ # 0.39.0 [unreleased] - Update to `libp2p-core` `v0.39.0`. +- Fix a bug where we removed any other listener in `Transport::remove_listener` except for the one with the provided `ListenerId`. See [PR 3387]. + +[PR 3387]: https://github.com/libp2p/rust-libp2p/pull/3387 # 0.38.0 diff --git a/transports/tcp/src/lib.rs b/transports/tcp/src/lib.rs index 34276753..30a70e69 100644 --- a/transports/tcp/src/lib.rs +++ b/transports/tcp/src/lib.rs @@ -452,7 +452,7 @@ where } fn remove_listener(&mut self, id: ListenerId) -> bool { - if let Some(index) = self.listeners.iter().position(|l| l.listener_id != id) { + if let Some(index) = self.listeners.iter().position(|l| l.listener_id == id) { self.listeners.remove(index); self.pending_events .push_back(TransportEvent::ListenerClosed { @@ -1335,4 +1335,31 @@ mod tests { .address_translation(&quic_addr, &tcp_observed_addr) .is_none()); } + + #[test] + fn test_remove_listener() { + env_logger::try_init().ok(); + + async fn cycle_listeners() -> bool { + let mut tcp = Transport::::default().boxed(); + let listener_id = tcp + .listen_on("/ip4/127.0.0.1/tcp/0".parse().unwrap()) + .unwrap(); + tcp.remove_listener(listener_id) + } + + #[cfg(feature = "async-io")] + { + assert!(async_std::task::block_on(cycle_listeners::())); + } + + #[cfg(feature = "tokio")] + { + let rt = ::tokio::runtime::Builder::new_current_thread() + .enable_io() + .build() + .unwrap(); + assert!(rt.block_on(cycle_listeners::())); + } + } }