Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix check for PGHOST[ADDR] in pg_upgrade with Windows and temporary paths
authorMichael Paquier <michael@paquier.xyz>
Tue, 1 Mar 2022 22:37:07 +0000 (07:37 +0900)
committerMichael Paquier <michael@paquier.xyz>
Tue, 1 Mar 2022 22:37:07 +0000 (07:37 +0900)
The checks currently done at the startup of pg_upgrade on PGHOST and
PGHOSTADDR to avoid any attempts to access to an external cluster fail
setting those parameters to Windows paths or even temporary paths
prefixed by an '@', as it only considers as a valid path strings
beginning with a slash.

As mentioned by Andres, is_unixsock_path() is designed to detect such
cases, so, like any other code paths dealing with the same problem (psql
and libpq), use it rather than assuming that all valid paths are
prefixed with just a slash.

This issue has been found while testing the TAP tests of pg_upgrade
through the CI on Windows.  This is a bug, but nobody has complained
about it since pg_upgrade exists so no backpatch is done, at least for
now.

Analyzed-by: Andres Freund, Michael Paquier
Discussion: https://postgr.es/m/YeYj4DU5qY/rtKXT@paquier.xyz

src/bin/pg_upgrade/server.c

index 7878d233de2fc5d0c59295d40f792f1782a33bcc..265137e86bf97fa179de68847f5e14c5a33dfb22 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "common/connect.h"
 #include "fe_utils/string_utils.h"
+#include "libpq/pqcomm.h"
 #include "pg_upgrade.h"
 
 static PGconn *get_db_conn(ClusterInfo *cluster, const char *db_name);
@@ -368,7 +369,7 @@ check_pghost_envvar(void)
            if (value && strlen(value) > 0 &&
            /* check for 'local' host values */
                (strcmp(value, "localhost") != 0 && strcmp(value, "127.0.0.1") != 0 &&
-                strcmp(value, "::1") != 0 && value[0] != '/'))
+                strcmp(value, "::1") != 0 && !is_unixsock_path(value)))
                pg_fatal("libpq environment variable %s has a non-local server value: %s\n",
                         option->envvar, value);
        }