From 8423de3a64f17f6bec18bf57b472e5a3615883db Mon Sep 17 00:00:00 2001 From: Ivan Shvedunov Date: Thu, 28 Nov 2024 20:32:47 +0400 Subject: [PATCH] basichost: avoid modifying slice returned by AddrsFactory (#3068) --- config/config.go | 2 +- p2p/host/basic/basic_host.go | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/config/config.go b/config/config.go index 900c06bc30..f3ea35855a 100644 --- a/config/config.go +++ b/config/config.go @@ -582,7 +582,7 @@ func (cfg *Config) addAutoNAT(h *bhost.BasicHost) error { if cfg.AddrsFactory != nil { addrFunc = func() []ma.Multiaddr { return slices.DeleteFunc( - cfg.AddrsFactory(h.AllAddrs()), + slices.Clone(cfg.AddrsFactory(h.AllAddrs())), func(a ma.Multiaddr) bool { return !manet.IsPublicAddr(a) }) } } diff --git a/p2p/host/basic/basic_host.go b/p2p/host/basic/basic_host.go index 820411bd27..a85d1978d7 100644 --- a/p2p/host/basic/basic_host.go +++ b/p2p/host/basic/basic_host.go @@ -271,7 +271,7 @@ func NewHost(n network.Network, opts *HostOpts) (*BasicHost, error) { h.hps, err = holepunch.NewService(h, h.ids, func() []ma.Multiaddr { addrs := h.AllAddrs() if opts.AddrsFactory != nil { - addrs = opts.AddrsFactory(addrs) + addrs = slices.Clone(opts.AddrsFactory(addrs)) } // AllAddrs may ignore observed addresses in favour of NAT mappings. Use both for hole punching. addrs = append(addrs, h.ids.OwnObservedAddrs()...) @@ -841,12 +841,10 @@ func (h *BasicHost) ConnManager() connmgr.ConnManager { // When used with AutoRelay, and if the host is not publicly reachable, // this will only have host's private, relay, and no public addresses. func (h *BasicHost) Addrs() []ma.Multiaddr { - addrs := h.AddrsFactory(h.AllAddrs()) // Make a copy. Consumers can modify the slice elements - res := make([]ma.Multiaddr, len(addrs)) - copy(res, addrs) + addrs := slices.Clone(h.AddrsFactory(h.AllAddrs())) // Add certhashes for the addresses provided by the user via address factory. - return h.addCertHashes(ma.Unique(res)) + return h.addCertHashes(ma.Unique(addrs)) } // NormalizeMultiaddr returns a multiaddr suitable for equality checks.