Skip to content

Commit

Permalink
fix potential race condition in DefaultResolver when discard_cache()
Browse files Browse the repository at this point in the history
  • Loading branch information
lihuiba committed Feb 7, 2025
1 parent 0392f62 commit 50eba0a
Showing 1 changed file with 5 additions and 10 deletions.
15 changes: 5 additions & 10 deletions net/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,9 @@ class DefaultResolver : public Resolver {
IPAddr addr;
IPAddrNode(IPAddr addr) : addr(addr) {}
};
using IPAddrList = intrusive_list<IPAddrNode>;

struct IPAddrList : public intrusive_list<IPAddrNode>, rwlock {
~IPAddrList() { delete_all(); }
};
IPAddr do_resolve(std::string_view host, Delegate<bool, IPAddr> filter) {
auto ctr = [&]() -> IPAddrList* {
auto addrs = new IPAddrList();
Expand Down Expand Up @@ -295,6 +296,7 @@ class DefaultResolver : public Resolver {
};
auto ips = dnscache_.borrow(host, ctr);
if (ips->empty()) LOG_ERRNO_RETURN(0, IPAddr(), "Domain resolution for '`' failed", host);
scoped_rwlock _(*ips, RLOCK);
auto ret = ips->front();
ips->node = ret->next(); // access in round robin order
return ret->addr;
Expand All @@ -303,13 +305,6 @@ class DefaultResolver : public Resolver {
public:
DefaultResolver(uint64_t cache_ttl, uint64_t resolve_timeout)
: dnscache_(cache_ttl), resolve_timeout_(resolve_timeout) {}
~DefaultResolver() {
for (auto it : dnscache_) {
((IPAddrList*)it->_obj)->delete_all();
}
dnscache_.clear();
}

IPAddr resolve(std::string_view host) override {
return do_resolve(host, nullptr);
}
Expand All @@ -321,9 +316,9 @@ class DefaultResolver : public Resolver {
void discard_cache(std::string_view host, IPAddr ip) override {
auto ipaddr = dnscache_.borrow(host);
if (ip.undefined() || ipaddr->empty()) {
ipaddr->delete_all();
ipaddr.recycle(true);
} else {
scoped_rwlock _(*ipaddr, WLOCK);
for (auto itr = ipaddr->rbegin(); itr != ipaddr->rend(); itr++) {
if ((*itr)->addr == ip) {
ipaddr->erase(*itr);
Expand Down

0 comments on commit 50eba0a

Please sign in to comment.