Skip to content

Commit 9b98a1d

Browse files
authored
Fixing overflow of timepoints addition (#305)
1 parent c06ea53 commit 9b98a1d

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

include/libp2p/peer/address_repository/inmem_address_repository.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ namespace libp2p::peer {
7272

7373
bool isNewDnsAddr(const multi::Multiaddress &ma);
7474

75+
Clock::time_point calculateExpirationTime(const Milliseconds &ttl) const;
76+
7577
std::shared_ptr<network::DnsaddrResolver> dnsaddr_resolver_;
7678
peer_db db_;
7779
std::set<multi::Multiaddress> resolved_dns_addrs_;

src/peer/address_repository/inmem_address_repository.cpp

+16-3
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,25 @@ namespace libp2p::peer {
6464
return false;
6565
}
6666

67+
Clock::time_point InmemAddressRepository::calculateExpirationTime(
68+
const Milliseconds &ttl) const {
69+
static const auto max_time = Clock::time_point::max();
70+
const auto now = Clock::now();
71+
if (now >= max_time - ttl) {
72+
return max_time;
73+
}
74+
return now + ttl;
75+
}
76+
6777
outcome::result<bool> InmemAddressRepository::addAddresses(
6878
const PeerId &p,
6979
std::span<const multi::Multiaddress> ma,
7080
AddressRepository::Milliseconds ttl) {
7181
bool added = false;
7282
auto &addresses = db_[p];
7383

74-
auto expires_at = Clock::now() + ttl;
84+
auto expires_at = calculateExpirationTime(ttl);
85+
7586
for (const auto &m : ma) {
7687
if (addresses.expires.emplace(m, expires_at).second) {
7788
addresses.order.emplace_back(m);
@@ -90,7 +101,8 @@ namespace libp2p::peer {
90101
bool added = false;
91102
auto &addresses = db_[p];
92103

93-
auto expires_at = Clock::now() + ttl;
104+
auto expires_at = calculateExpirationTime(ttl);
105+
94106
for (const auto &m : ma) {
95107
auto [addr_it, emplaced] = addresses.expires.emplace(m, expires_at);
96108
if (emplaced) {
@@ -113,7 +125,8 @@ namespace libp2p::peer {
113125
}
114126
auto &addresses = peer_it->second;
115127

116-
auto expires_at = Clock::now() + ttl;
128+
auto expires_at = calculateExpirationTime(ttl);
129+
117130
for (auto &item : addresses.expires) {
118131
item.second = expires_at;
119132
}

0 commit comments

Comments
 (0)