diff options
author | Taj Morton <tajmorton@gmail.com> | 2022-11-28 22:52:32 -0800 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-12-03 22:12:13 +0000 |
commit | 146d45a652fb6740431d79c3bb843a28eac95535 (patch) | |
tree | 7ab854280dec90751021e22a366170fd1bfeae10 | |
parent | 14baf35441681263363d1b713d955f7f8cc6d05f (diff) | |
download | serenity-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.cpp | 11 |
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; |