Skip to content

Commit e0be47f

Browse files
authored
Fix: Only using a single resolved IP when connecting with hostname (#488)
`SocketConnector::resolved_address_offset_` is never incremented because the first parameter was wrong. Also, this adds a default filter to for resolver hints to prevent duplicates in the resolved IPs.
1 parent 0cefc0c commit e0be47f

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

src/resolver.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@ class Resolver : public RefCounted<Resolver> {
7373

7474
inc_ref(); // For the event loop
7575

76+
// If no hints are provided then use a default filter.
77+
struct addrinfo default_hints;
78+
if (hints == NULL) {
79+
hints = &default_hints;
80+
memset(hints, 0, sizeof(struct addrinfo));
81+
hints->ai_family = AF_UNSPEC;
82+
hints->ai_socktype = SOCK_STREAM;
83+
}
84+
7685
if (timeout > 0) {
7786
timer_.start(loop, timeout, bind_callback(&Resolver::on_timeout, this));
7887
}

src/socket_connector.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,9 +286,10 @@ void SocketConnector::on_resolve(Resolver* resolver) {
286286
const AddressVec& addresses(resolver->addresses());
287287
LOG_DEBUG("Resolved the addresses %s for hostname %s", to_string(addresses).c_str(),
288288
hostname_.c_str());
289-
resolved_address_ = Address(
290-
addresses[resolved_address_offset_.fetch_add(MEMORY_ORDER_RELAXED) % addresses.size()],
291-
address_.server_name()); // Keep the server name for debugging
289+
290+
size_t offset = resolved_address_offset_.fetch_add(1, MEMORY_ORDER_RELAXED);
291+
resolved_address_ = Address(addresses[offset % addresses.size()],
292+
address_.server_name()); // Keep the server name for debugging
292293
internal_connect(resolver->loop());
293294
} else if (is_canceled() || resolver->is_canceled()) {
294295
finish();

0 commit comments

Comments
 (0)