mirror of
https://github.com/SerenityOS/serenity
synced 2024-09-06 17:06:31 +00:00
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:
parent
51ebf20200
commit
a81475d9fb
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue