From 3f68cd799de6d6ac89046ca3b84e9d7e4f677ede Mon Sep 17 00:00:00 2001 From: Zankaria Date: Thu, 24 Apr 2025 00:05:11 +0200 Subject: [PATCH] LibcDnsDriver.php: use something less bad than gethostbynamel --- inc/Data/Driver/Dns/LibcDnsDriver.php | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/inc/Data/Driver/Dns/LibcDnsDriver.php b/inc/Data/Driver/Dns/LibcDnsDriver.php index 367304e0..71e838df 100644 --- a/inc/Data/Driver/Dns/LibcDnsDriver.php +++ b/inc/Data/Driver/Dns/LibcDnsDriver.php @@ -11,18 +11,28 @@ class LibcDnsDriver implements DnsDriver { \putenv("RES_OPTIONS=retrans:1 retry:1 timeout:{$timeout} attempts:1"); } - /** - * For the love of god never use this. - * https://www.php.net/manual/en/function.gethostbynamel.php#119535 - */ public function nameToIPs(string $name): ?array { - // Add a trailing dot to not return the loopback address on failure - // https://www.php.net/manual/en/function.gethostbynamel.php#119535 - $ret = \gethostbynamel("{$name}."); + $ret = \dns_get_record($name, DNS_A | DNS_AAAA); if ($ret === false) { return null; } - return $ret; + + $ips = []; + foreach ($ret as $dns_record) { + if ($dns_record['type'] == 'A') { + $ips[] = $dns_record['ip']; + } elseif ($dns_record['type'] == 'AAAA') { + $ips[] = $dns_record['ipv6']; + } + } + + if (empty($ips)) { + return []; + } else { + // Stable return order. + \sort($ips, \SORT_STRING); + return $ips; + } } /**