diff --git a/core/peer/addrinfo_serde.go b/core/peer/addrinfo_serde.go index a848ea6c66..c8909e4343 100644 --- a/core/peer/addrinfo_serde.go +++ b/core/peer/addrinfo_serde.go @@ -2,6 +2,8 @@ package peer import ( "encoding/json" + "fmt" + "os" "github.com/libp2p/go-libp2p/core/internal/catch" @@ -17,9 +19,16 @@ type addrInfoJson struct { func (pi AddrInfo) MarshalJSON() (res []byte, err error) { defer func() { catch.HandlePanic(recover(), &err, "libp2p addr info marshal") }() - addrs := make([]string, len(pi.Addrs)) - for i, addr := range pi.Addrs { - addrs[i] = addr.String() + // Skip nil addresses to avoid panic if slice contains corrupted entries + // (likely due to data race). Log warning for visibility. + // See: https://github.com/ipfs/kubo/issues/11116 + addrs := make([]string, 0, len(pi.Addrs)) + for _, addr := range pi.Addrs { + if addr == nil { + fmt.Fprintf(os.Stderr, "go-libp2p: nil multiaddr in AddrInfo.MarshalJSON for peer %s (possible data race)\n", pi.ID) + continue + } + addrs = append(addrs, addr.String()) } return json.Marshal(&addrInfoJson{ ID: pi.ID,