From 146d45a652fb6740431d79c3bb843a28eac95535 Mon Sep 17 00:00:00 2001 From: Taj Morton Date: Mon, 28 Nov 2022 22:52:32 -0800 Subject: [PATCH] LibC: Return h_aliases array from gethostbyname() and gethostbyaddr() The hostent struct's h_aliases field conventionally contains a pointer to an array of alternate hostnames, where the final entry in this array is a nullptr (signifying the end of the list). At least one POSIX application (Pine email client) does not expect `h_aliases` itself to be nullptr. --- Userland/Libraries/LibC/netdb.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibC/netdb.cpp b/Userland/Libraries/LibC/netdb.cpp index cbee348cde..aeeb5e66d1 100644 --- a/Userland/Libraries/LibC/netdb.cpp +++ b/Userland/Libraries/LibC/netdb.cpp @@ -28,9 +28,11 @@ __thread int h_errno; static hostent __gethostbyname_buffer; static in_addr_t __gethostbyname_address; static in_addr_t* __gethostbyname_address_list_buffer[2]; +static char* __gethostbyname_alias_list_buffer[1]; static hostent __gethostbyaddr_buffer; static in_addr_t* __gethostbyaddr_address_list_buffer[2]; +static char* __gethostbyaddr_alias_list_buffer[1]; // IPCCompiler depends on LibC. Because of this, it cannot be compiled // before LibC is. However, the lookup magic can only be obtained from the // endpoint itself if IPCCompiler has compiled the IPC file, so this creates @@ -98,7 +100,8 @@ hostent* gethostbyname(char const* name) if (ipv4_address.has_value()) { gethostbyname_name_buffer = ipv4_address.value().to_string(); __gethostbyname_buffer.h_name = const_cast(gethostbyname_name_buffer.characters()); - __gethostbyname_buffer.h_aliases = nullptr; + __gethostbyname_alias_list_buffer[0] = nullptr; + __gethostbyname_buffer.h_aliases = __gethostbyname_alias_list_buffer; __gethostbyname_buffer.h_addrtype = AF_INET; new (&__gethostbyname_address) IPv4Address(ipv4_address.value()); __gethostbyname_address_list_buffer[0] = &__gethostbyname_address; @@ -197,7 +200,8 @@ hostent* gethostbyname(char const* name) gethostbyname_name_buffer = name; __gethostbyname_buffer.h_name = const_cast(gethostbyname_name_buffer.characters()); - __gethostbyname_buffer.h_aliases = nullptr; + __gethostbyname_alias_list_buffer[0] = nullptr; + __gethostbyname_buffer.h_aliases = __gethostbyname_alias_list_buffer; __gethostbyname_buffer.h_addrtype = AF_INET; __gethostbyname_address_list_buffer[0] = &__gethostbyname_address; __gethostbyname_address_list_buffer[1] = nullptr; @@ -296,7 +300,8 @@ hostent* gethostbyaddr(void const* addr, socklen_t addr_size, int type) gethostbyaddr_name_buffer = move(string_impl); __gethostbyaddr_buffer.h_name = buffer; - __gethostbyaddr_buffer.h_aliases = nullptr; + __gethostbyaddr_alias_list_buffer[0] = nullptr; + __gethostbyaddr_buffer.h_aliases = __gethostbyaddr_alias_list_buffer; __gethostbyaddr_buffer.h_addrtype = AF_INET; // FIXME: Should we populate the hostent's address list here with a sockaddr_in for the provided host? __gethostbyaddr_address_list_buffer[0] = nullptr;