Skip to content

Commit 06f79b6

Browse files
authored
fix: limit observed addresses in address manager (#2869)
This is done in the identify protocol but the address manager should guard itself against misuse.
1 parent 2c182d2 commit 06f79b6

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

packages/libp2p/src/address-manager.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import type { ComponentLogger, Libp2pEvents, Logger, TypedEventTarget, PeerId, P
66
import type { AddressManager as AddressManagerInterface, TransportManager } from '@libp2p/interface-internal'
77
import type { Multiaddr } from '@multiformats/multiaddr'
88

9+
export const defaultValues = {
10+
maxObservedAddresses: 10
11+
}
12+
913
export interface AddressManagerInit {
1014
/**
1115
* Pass an function in this field to override the list of addresses
@@ -32,6 +36,11 @@ export interface AddressManagerInit {
3236
* A list of string multiaddrs to add to the list of announced addresses
3337
*/
3438
appendAnnounce?: string[]
39+
40+
/**
41+
* Limits the number of observed addresses we will store
42+
*/
43+
maxObservedAddresses?: number
3544
}
3645

3746
export interface AddressManagerComponents {
@@ -103,6 +112,7 @@ export class AddressManager implements AddressManagerInterface {
103112
private readonly announceFilter: AddressFilter
104113
private readonly ipDomainMappings: Map<string, DNSMapping>
105114
private readonly publicAddressMappings: Map<string, PublicAddressMapping[]>
115+
private readonly maxObservedAddresses: number
106116

107117
/**
108118
* Responsible for managing the peer addresses.
@@ -122,6 +132,7 @@ export class AddressManager implements AddressManagerInterface {
122132
this.ipDomainMappings = new Map()
123133
this.publicAddressMappings = new Map()
124134
this.announceFilter = init.announceFilter ?? defaultAddressFilter
135+
this.maxObservedAddresses = init.maxObservedAddresses ?? defaultValues.maxObservedAddresses
125136

126137
// this method gets called repeatedly on startup when transports start listening so
127138
// debounce it so we don't cause multiple self:peer:update events to be emitted
@@ -192,6 +203,10 @@ export class AddressManager implements AddressManagerInterface {
192203
* Add peer observed addresses
193204
*/
194205
addObservedAddr (addr: Multiaddr): void {
206+
if (this.observed.size === this.maxObservedAddresses) {
207+
return
208+
}
209+
195210
addr = stripPeerId(addr, this.components.peerId)
196211
const addrString = addr.toString()
197212

packages/libp2p/test/addresses/address-manager.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,26 @@ describe('Address Manager', () => {
130130
expect(am.getObservedAddrs()).to.have.lengthOf(1)
131131
})
132132

133+
it('should limit observed addresses', () => {
134+
const am = new AddressManager({
135+
peerId,
136+
transportManager: stubInterface<TransportManager>(),
137+
peerStore,
138+
events,
139+
logger: defaultLogger()
140+
}, {
141+
announceFilter: stubInterface<AddressFilter>()
142+
})
143+
144+
expect(am.getObservedAddrs()).to.be.empty()
145+
146+
for (let i = 0; i < 100; i++) {
147+
am.addObservedAddr(multiaddr(`/ip4/123.123.123.123/tcp/392${i}`))
148+
}
149+
150+
expect(am.getObservedAddrs()).to.have.lengthOf(10)
151+
})
152+
133153
it('should allow duplicate listen addresses', () => {
134154
const ma = multiaddr('/ip4/0.0.0.0/tcp/0')
135155
const am = new AddressManager({

0 commit comments

Comments
 (0)