Skip to content

Commit 56b3b8f

Browse files
fix(kad): Skip invalid multiaddr (#3284)
With this commit `libp2p-kad` no longer discards the whole peer payload in case an addr is invalid, but instead logs the failure, skips the invalid multiaddr and parses the remaining payload. See #3244 for details. Co-authored-by: Thomas Eizinger <[email protected]>
1 parent e4d67c5 commit 56b3b8f

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

protocols/kad/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010

1111
[PR 3239]: https://github.com/libp2p/rust-libp2p/pull/3239
1212

13+
# 0.42.1
14+
15+
- Skip unparsable multiaddr in `Peer::addrs`. See [PR 3280].
16+
17+
[PR 3280]: https://github.com/libp2p/rust-libp2p/pull/3280
18+
1319
# 0.42.0
1420

1521
- Update to `libp2p-core` `v0.38.0`.

protocols/kad/src/protocol.rs

+29-3
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,13 @@ impl TryFrom<proto::message::Peer> for KadPeer {
105105

106106
let mut addrs = Vec::with_capacity(peer.addrs.len());
107107
for addr in peer.addrs.into_iter() {
108-
let as_ma = Multiaddr::try_from(addr).map_err(invalid_data)?;
109-
addrs.push(as_ma);
108+
match Multiaddr::try_from(addr) {
109+
Ok(a) => addrs.push(a),
110+
Err(e) => {
111+
log::debug!("Unable to parse multiaddr: {e}");
112+
}
113+
};
110114
}
111-
debug_assert_eq!(addrs.len(), addrs.capacity());
112115

113116
let connection_ty = proto::message::ConnectionType::from_i32(peer.connection)
114117
.ok_or_else(|| invalid_data("unknown connection type"))?
@@ -601,6 +604,29 @@ where
601604

602605
#[cfg(test)]
603606
mod tests {
607+
use super::*;
608+
609+
#[test]
610+
fn skip_invalid_multiaddr() {
611+
let valid_multiaddr: Multiaddr = "/ip6/2001:db8::/tcp/1234".parse().unwrap();
612+
let valid_multiaddr_bytes = valid_multiaddr.to_vec();
613+
614+
let invalid_multiaddr = {
615+
let a = vec![255; 8];
616+
assert!(Multiaddr::try_from(a.clone()).is_err());
617+
a
618+
};
619+
620+
let payload = proto::message::Peer {
621+
id: PeerId::random().to_bytes(),
622+
addrs: vec![valid_multiaddr_bytes, invalid_multiaddr],
623+
connection: proto::message::ConnectionType::CanConnect.into(),
624+
};
625+
626+
let peer = KadPeer::try_from(payload).expect("not to fail");
627+
628+
assert_eq!(peer.multiaddrs, vec![valid_multiaddr])
629+
}
604630

605631
/*// TODO: restore
606632
use self::libp2p_tcp::TcpTransport;

0 commit comments

Comments
 (0)