From 37cea81837db9f0dda4fb345579c32c4c9be0787 Mon Sep 17 00:00:00 2001 From: Marcus Nilsson Date: Sat, 12 Aug 2023 22:08:10 +0200 Subject: [PATCH] LibC: Use gethostbyname_r() in getaddrinfo() getaddrinfo() used to use gethostbyname() which isn't MT-Safe. --- Userland/Libraries/LibC/netdb.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibC/netdb.cpp b/Userland/Libraries/LibC/netdb.cpp index 8e1fdf1ec8..cc5abd001b 100644 --- a/Userland/Libraries/LibC/netdb.cpp +++ b/Userland/Libraries/LibC/netdb.cpp @@ -783,9 +783,28 @@ int getaddrinfo(char const* __restrict node, char const* __restrict service, con node = "127.0.0.1"; } - auto host_ent = gethostbyname(node); - if (!host_ent) - return EAI_FAIL; + size_t buffer_size = 1024; + char* buffer = nullptr; + int gethostbyname_errno = 0; + struct hostent ret = {}; + struct hostent* host_ent = nullptr; + + while (true) { + buffer = (char*)realloc(buffer, buffer_size); + + if (buffer == nullptr) + return EAI_MEMORY; + + int rc = gethostbyname_r(node, &ret, buffer, buffer_size, &host_ent, &gethostbyname_errno); + if (rc == ERANGE) { + buffer_size *= 2; + continue; + } + + if (!host_ent) + return EAI_FAIL; + break; + } char const* proto = nullptr; if (hints && hints->ai_socktype) {