]> granicus.if.org Git - postgresql/commitdiff
Don't connect() to a wildcard address in test_postmaster_connection().
authorNoah Misch <noah@leadboat.com>
Sun, 8 Nov 2015 22:28:53 +0000 (17:28 -0500)
committerNoah Misch <noah@leadboat.com>
Sun, 8 Nov 2015 22:31:24 +0000 (17:31 -0500)
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

index 87c9bac50bfcadb7fd14851eba1f4fd1ad76f5bd..6a44f2972ef4b3ce5b7243d59de43f154c3d7799 100644 (file)
@@ -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