diff --git a/src/net/tools/naive/naive_connection.cc b/src/net/tools/naive/naive_connection.cc index f814f778e1..339990beb0 100644 --- a/src/net/tools/naive/naive_connection.cc +++ b/src/net/tools/naive/naive_connection.cc @@ -211,10 +211,16 @@ int NaiveConnection::DoConnectServer() { if (rv == 0) { IPEndPoint ipe; if (ipe.FromSockAddr(dst.addr, dst.addr_len)) { - origin = HostPortPair::FromIPEndPoint(ipe); - auto name = resolver_->FindNameByAddress(ipe.address()); + const auto& addr = ipe.address(); + auto name = resolver_->FindNameByAddress(addr); if (!name.empty()) { - origin.set_host(name); + origin = HostPortPair(name, ipe.port()); + } else if (!resolver_->IsInResolvedRange(addr)) { + origin = HostPortPair::FromIPEndPoint(ipe); + } else { + LOG(ERROR) << "Connection " << id_ << " to unresolved name for " + << addr.ToString(); + return ERR_ADDRESS_INVALID; } } } diff --git a/src/net/tools/naive/redirect_resolver.cc b/src/net/tools/naive/redirect_resolver.cc index 2ab85db625..939e163870 100644 --- a/src/net/tools/naive/redirect_resolver.cc +++ b/src/net/tools/naive/redirect_resolver.cc @@ -20,6 +20,12 @@ namespace { constexpr int kUdpReadBufferSize = 1024; +constexpr int kResolutionTtl = 60; +constexpr int kResolutionRecycleTime = 60 * 5; + +std::string PackedIPv4ToString(uint32_t addr) { + return net::IPAddress(addr >> 24, addr >> 16, addr >> 8, addr).ToString(); +} } // namespace namespace net { @@ -133,6 +139,9 @@ int RedirectResolver::HandleReadResult(int result) { // Too few available addresses. Overwrites old one. auto res_it = by_addr->second; + LOG(INFO) << "Overwrite " << res_it->name << " " + << PackedIPv4ToString(res_it->addr) << " with " << name << " " + << PackedIPv4ToString(addr); resolution_by_name_.erase(res_it->by_name); resolutions_.erase(res_it); resolutions_.emplace_back(); @@ -146,6 +155,7 @@ int RedirectResolver::HandleReadResult(int result) { res_it->by_name = by_name; res_it->by_addr = by_addr; } else { + LOG(INFO) << "Add " << name << " " << PackedIPv4ToString(addr); resolutions_.emplace_back(); auto res_it = std::prev(resolutions_.end()); @@ -161,8 +171,10 @@ int RedirectResolver::HandleReadResult(int result) { auto now = base::TimeTicks::Now(); for (auto it = resolutions_.begin(); it != resolutions_.end() && - (now - it->time).InSeconds() > 60 * 5;) { + (now - it->time).InSeconds() > kResolutionRecycleTime;) { auto next = std::next(it); + LOG(INFO) << "Drop " << it->name << " " + << PackedIPv4ToString(it->addr); resolution_by_name_.erase(it->by_name); resolution_by_addr_.erase(it->by_addr); resolutions_.erase(it); @@ -175,7 +187,7 @@ int RedirectResolver::HandleReadResult(int result) { record.name = name; record.type = dns_protocol::kTypeA; record.klass = dns_protocol::kClassIN; - record.ttl = 60; + record.ttl = kResolutionTtl; uint32_t addr = by_name->second->addr; record.SetOwnedRdata(IPAddressToPackedString( IPAddress(addr >> 24, addr >> 16, addr >> 8, addr))); @@ -208,6 +220,12 @@ int RedirectResolver::HandleReadResult(int result) { base::BindOnce(&RedirectResolver::OnSend, base::Unretained(this))); } +bool RedirectResolver::IsInResolvedRange(const IPAddress& address) const { + if (!address.IsIPv4()) + return false; + return IPAddressMatchesPrefix(address, range_, prefix_); +} + std::string RedirectResolver::FindNameByAddress( const IPAddress& address) const { if (!address.IsIPv4()) diff --git a/src/net/tools/naive/redirect_resolver.h b/src/net/tools/naive/redirect_resolver.h index 9c91c67cf6..c8551ac5bd 100644 --- a/src/net/tools/naive/redirect_resolver.h +++ b/src/net/tools/naive/redirect_resolver.h @@ -41,6 +41,7 @@ class RedirectResolver { size_t prefix); ~RedirectResolver(); + bool IsInResolvedRange(const IPAddress& address) const; std::string FindNameByAddress(const IPAddress& address) const; private: