aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoah Misch <noah@leadboat.com>2015-11-08 17:28:53 -0500
committerNoah Misch <noah@leadboat.com>2015-11-08 17:31:24 -0500
commit87deb55a4723e3ee00e4324fca684c26cfa17cc6 (patch)
tree28f3856e4384a5ca307a21971dd7718a5b555bce
parent03ee6591dd305613a22902fb777a192fe1970adc (diff)
downloadpostgresql-87deb55a4723e3ee00e4324fca684c26cfa17cc6.tar.gz
postgresql-87deb55a4723e3ee00e4324fca684c26cfa17cc6.zip
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.
-rw-r--r--src/bin/pg_ctl/pg_ctl.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 87c9bac50bf..6a44f2972ef 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -623,9 +623,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