summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTaj Morton <tajmorton@gmail.com>2022-11-28 22:52:32 -0800
committerLinus Groh <mail@linusgroh.de>2022-12-03 22:12:13 +0000
commit146d45a652fb6740431d79c3bb843a28eac95535 (patch)
tree7ab854280dec90751021e22a366170fd1bfeae10
parent14baf35441681263363d1b713d955f7f8cc6d05f (diff)
downloadserenity-146d45a652fb6740431d79c3bb843a28eac95535.zip
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.
-rw-r--r--Userland/Libraries/LibC/netdb.cpp11
1 files 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<char*>(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<char*>(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;