From bfc2d89d35f04871b649d8c773054fa22c7a2b51 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 20 Oct 2006 01:10:40 +0000 Subject: [PATCH] Back-patch second version of AIX getaddrinfo fix. --- src/backend/libpq/ip.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/backend/libpq/ip.c b/src/backend/libpq/ip.c index 5f453be298..421e93e782 100644 --- a/src/backend/libpq/ip.c +++ b/src/backend/libpq/ip.c @@ -69,6 +69,8 @@ int getaddrinfo_all(const char *hostname, const char *servname, const struct addrinfo *hintp, struct addrinfo **result) { + int rc; + /* not all versions of getaddrinfo() zero *result on failure */ *result = NULL; @@ -77,18 +79,37 @@ getaddrinfo_all(const char *hostname, const char *servname, return getaddrinfo_unix(servname, hintp, result); #endif + /* NULL has special meaning to getaddrinfo */ + rc = getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname, + servname, hintp, result); + #ifdef _AIX /* - * It seems AIX's getaddrinfo doesn't reliably zero sin_port when servname - * is NULL, so force the issue. + * It seems some versions of AIX's getaddrinfo don't reliably zero + * sin_port when servname is NULL, so clean up after it. */ - if (servname == NULL) - servname = "0"; + if (servname == NULL && rc == 0) + { + struct addrinfo *addr; + + for (addr = *result; addr; addr = addr->ai_next) + { + switch (addr->ai_family) + { + case AF_INET: + ((struct sockaddr_in *) addr->ai_addr)->sin_port = htons(0); + break; +#ifdef HAVE_IPV6 + case AF_INET6: + ((struct sockaddr_in6 *) addr->ai_addr)->sin6_port = htons(0); + break; +#endif + } + } + } #endif - /* NULL has special meaning to getaddrinfo */ - return getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname, - servname, hintp, result); + return rc; } -- 2.39.5