From 99027350e7030aa97644860f9c176683b05941b1 Mon Sep 17 00:00:00 2001
From: Noah Misch <noah@leadboat.com>
Date: Sun, 8 Nov 2015 17:28:53 -0500
Subject: [PATCH] Don't connect() to a wildcard address in
 test_postmaster_connection().

At least OpenBSD, NetBSD, and Windows don't support it.  This repairs
pg_ctl for listen_addresses='0.0.0.0' and listen_addresses='::'.  Since
pg_ctl prefers to test a Unix-domain socket, Windows users are most
likely to need this change.  Back-patch to 9.1 (all supported versions).
This could change pg_ctl interaction with loopback-interface firewall
rules.  Therefore, in 9.4 and earlier (released branches), activate the
change only on known-affected platforms.

Reported (bug #13611) and designed by Kondo Yuta.
---
 src/bin/pg_ctl/pg_ctl.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 2b0bdcefad6..dd827606309 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -628,9 +628,22 @@ test_postmaster_connection(pgpid_t pm_pid, bool do_checkpoint)
 							return PQPING_NO_ATTEMPT;
 						}
 
-						/* If postmaster is listening on "*", use localhost */
+						/*
+						 * Map listen-only addresses to counterparts usable
+						 * for establishing a connection.  connect() to "::"
+						 * or "0.0.0.0" is not portable to OpenBSD 5.0 or to
+						 * Windows Server 2008, and connect() to "::" is
+						 * additionally not portable to NetBSD 6.0.  (Cygwin
+						 * does handle both addresses, though.)
+						 */
 						if (strcmp(host_str, "*") == 0)
 							strcpy(host_str, "localhost");
+#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(WIN32)
+						else if (strcmp(host_str, "0.0.0.0") == 0)
+							strcpy(host_str, "127.0.0.1");
+						else if (strcmp(host_str, "::") == 0)
+							strcpy(host_str, "::1");
+#endif
 
 						/*
 						 * We need to set connect_timeout otherwise on Windows
-- 
GitLab