Skip to content

Commit ab6fd3b

Browse files
committed
fix(routing): defensive nil checks for multiaddr handling
Belt-and-suspenders defense against corrupted address data: - types/ipfs.go: Multiaddr.MarshalJSON returns null for nil - contentrouter: filters nil addresses when building AddrInfo Should help with ipfs/kubo#11116
1 parent f76a2a7 commit ab6fd3b

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

routing/http/contentrouter/contentrouter.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,13 @@ func readProviderResponses(ctx context.Context, iter iter.ResultIter[types.Recor
147147
continue
148148
}
149149

150+
// Filter nil addresses as a defensive measure against corrupted data.
151+
// See: https://github.com/ipfs/kubo/issues/11116
150152
var addrs []multiaddr.Multiaddr
151153
for _, a := range result.Addrs {
152-
addrs = append(addrs, a.Multiaddr)
154+
if a.Multiaddr != nil {
155+
addrs = append(addrs, a.Multiaddr)
156+
}
153157
}
154158

155159
select {
@@ -175,9 +179,13 @@ func readProviderResponses(ctx context.Context, iter iter.ResultIter[types.Recor
175179
continue
176180
}
177181

182+
// Filter nil addresses as a defensive measure against corrupted data.
183+
// See: https://github.com/ipfs/kubo/issues/11116
178184
var addrs []multiaddr.Multiaddr
179185
for _, a := range result.Addrs {
180-
addrs = append(addrs, a.Multiaddr)
186+
if a.Multiaddr != nil {
187+
addrs = append(addrs, a.Multiaddr)
188+
}
181189
}
182190

183191
select {

routing/http/types/ipfs.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ func (c *CID) UnmarshalJSON(b []byte) error {
2727

2828
type Multiaddr struct{ multiaddr.Multiaddr }
2929

30+
// MarshalJSON returns null for nil Multiaddr as a defensive measure.
31+
// This prevents panics if corrupted data contains nil addresses.
32+
// See: https://github.com/ipfs/kubo/issues/11116
33+
func (m Multiaddr) MarshalJSON() ([]byte, error) {
34+
if m.Multiaddr == nil {
35+
return []byte("null"), nil
36+
}
37+
return json.Marshal(m.Multiaddr.String())
38+
}
39+
3040
func (m *Multiaddr) UnmarshalJSON(b []byte) error {
3141
var s string
3242
err := json.Unmarshal(b, &s)

0 commit comments

Comments
 (0)