fix: addPeer could unintentionally override metadata of previously stored peer with defaults and empty (#3403)

* fix: addPeer could unintentionally override metadata of previously stored peer with defaults and empty

* Add explanation why we discard updates of different peerStore books.

Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>

---------

Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com>
This commit is contained in:
NagyZoltanPeter 2025-05-12 15:23:19 +02:00 committed by GitHub
parent 42ab866f2c
commit 094a68e41d

View File

@ -100,16 +100,23 @@ proc addPeer*(peerStore: PeerStore, peer: RemotePeerInfo, origin = UnknownOrigin
protos.add($new_proto) protos.add($new_proto)
peerStore[ProtoBook][peer.peerId] = protos peerStore[ProtoBook][peer.peerId] = protos
peerStore[AgentBook][peer.peerId] = peer.agent ## We don't care whether the item was already present in the table or not. Hence, we always discard the hasKeyOrPut's bool returned value
peerStore[ProtoVersionBook][peer.peerId] = peer.protoVersion discard peerStore[AgentBook].book.hasKeyOrPut(peer.peerId, peer.agent)
peerStore[KeyBook][peer.peerId] = peer.publicKey discard peerStore[ProtoVersionBook].book.hasKeyOrPut(peer.peerId, peer.protoVersion)
peerStore[ConnectionBook][peer.peerId] = peer.connectedness discard peerStore[KeyBook].book.hasKeyOrPut(peer.peerId, peer.publicKey)
peerStore[DisconnectBook][peer.peerId] = peer.disconnectTime
peerStore[SourceBook][peer.peerId] = discard peerStore[ConnectionBook].book.hasKeyOrPut(peer.peerId, peer.connectedness)
if origin != UnknownOrigin: origin else: peer.origin discard peerStore[DisconnectBook].book.hasKeyOrPut(peer.peerId, peer.disconnectTime)
peerStore[DirectionBook][peer.peerId] = peer.direction if origin != UnknownOrigin:
peerStore[LastFailedConnBook][peer.peerId] = peer.lastFailedConn peerStore[SourceBook][peer.peerId] = origin
peerStore[NumberFailedConnBook][peer.peerId] = peer.numberFailedConn else:
discard peerStore[SourceBook].book.hasKeyOrPut(peer.peerId, peer.origin)
discard peerStore[DirectionBook].book.hasKeyOrPut(peer.peerId, peer.direction)
discard
peerStore[LastFailedConnBook].book.hasKeyOrPut(peer.peerId, peer.lastFailedConn)
discard
peerStore[NumberFailedConnBook].book.hasKeyOrPut(peer.peerId, peer.numberFailedConn)
if peer.enr.isSome(): if peer.enr.isSome():
peerStore[ENRBook][peer.peerId] = peer.enr.get() peerStore[ENRBook][peer.peerId] = peer.enr.get()