LibCore: Don't assume that the first address from getaddrinfo is IPv4

By passing AF_UNSPEC to getaddrinfo, we're telling the system's
implementation that we are ok getting either (or both) IPv4 and IPv6
addresses in our result. On my Ubuntu 22.04 system, the first addrinfo
returned for "www.google.com" holds an IPv6 address, which when
interpreted as an IPv4 sockaddr_in gives an address of 0.0.0.0.

This fixes TestTLSHandshake in Lagom locally.
This commit is contained in:
Andrew Kaster 2022-10-09 15:16:34 -06:00 committed by Linus Groh
parent 51ebf20200
commit a81475d9fb

View file

@ -350,12 +350,17 @@ ErrorOr<IPv4Address> Socket::resolve_host(String const& host, SocketType type)
return Error::from_string_view({ error_string, strlen(error_string) });
}
auto* socket_address = bit_cast<struct sockaddr_in*>(results->ai_addr);
NetworkOrdered<u32> network_ordered_address { socket_address->sin_addr.s_addr };
ScopeGuard free_results = [results] { freeaddrinfo(results); };
freeaddrinfo(results);
for (auto* result = results; result != nullptr; result = result->ai_next) {
if (result->ai_family == AF_INET) {
auto* socket_address = bit_cast<struct sockaddr_in*>(result->ai_addr);
NetworkOrdered<u32> network_ordered_address { socket_address->sin_addr.s_addr };
return IPv4Address { network_ordered_address };
}
}
return IPv4Address { network_ordered_address };
return Error::from_string_literal("Could not resolve to IPv4 address");
}
ErrorOr<void> Socket::connect_local(int fd, String const& path)