diff options
-rw-r--r-- | net/base/host_resolver_impl_unittest.cc | 15 | ||||
-rw-r--r-- | net/base/host_resolver_proc.cc | 7 |
2 files changed, 22 insertions, 0 deletions
diff --git a/net/base/host_resolver_impl_unittest.cc b/net/base/host_resolver_impl_unittest.cc index 6b33a56..be0e2cb 100644 --- a/net/base/host_resolver_impl_unittest.cc +++ b/net/base/host_resolver_impl_unittest.cc @@ -437,6 +437,21 @@ TEST_F(HostResolverImplTest, EmptyHost) { EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); } +TEST_F(HostResolverImplTest, LongHost) { + scoped_refptr<RuleBasedHostResolverProc> resolver_proc = + new RuleBasedHostResolverProc(NULL); + resolver_proc->AllowDirectLookup("*"); + + scoped_refptr<HostResolver> host_resolver( + CreateHostResolverImpl(resolver_proc)); + AddressList adrlist; + const int kPortnum = 5555; + std::string hostname(4097, 'a'); + HostResolver::RequestInfo info(hostname, kPortnum); + int err = host_resolver->Resolve(info, &adrlist, NULL, NULL, BoundNetLog()); + EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); +} + // Helper class used by HostResolverImplTest.DeDupeRequests. It receives request // completion notifications for all the resolves, so it can tally up and // determine when we are done. diff --git a/net/base/host_resolver_proc.cc b/net/base/host_resolver_proc.cc index 39d4fc4..9ae4020 100644 --- a/net/base/host_resolver_proc.cc +++ b/net/base/host_resolver_proc.cc @@ -83,6 +83,8 @@ int SystemHostResolverProc(const std::string& host, HostResolverFlags host_resolver_flags, AddressList* addrlist, int* os_error) { + static const size_t kMaxHostLength = 4096; + if (os_error) *os_error = 0; @@ -92,6 +94,11 @@ int SystemHostResolverProc(const std::string& host, if (host.empty()) return ERR_NAME_NOT_RESOLVED; + // Limit the size of hostnames that will be resolved to combat issues in some + // platform's resolvers. + if (host.size() > kMaxHostLength) + return ERR_NAME_NOT_RESOLVED; + struct addrinfo* ai = NULL; struct addrinfo hints = {0}; |