1
0
mirror of https://github.com/SerenityOS/serenity synced 2024-07-05 21:55:08 +00:00

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.
This commit is contained in:
Taj Morton 2022-11-28 22:52:32 -08:00 committed by Linus Groh
parent 14baf35441
commit 146d45a652

View File

@ -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;