]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix PQport to never return NULL unless the connection is NULL.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 17 Jul 2025 16:46:38 +0000 (12:46 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 17 Jul 2025 16:46:57 +0000 (12:46 -0400)
This is the documented behavior, and it worked that way before
v10.  However, addition of the connhost[] array created cases
where conn->connhost[conn->whichhost].port is NULL.  The rest
of libpq is careful to substitute DEF_PGPORT[_STR] for a null
or empty port string, but we failed to do so here, leading to
possibly returning NULL.  As of v18 that causes psql's \conninfo
command to segfault.  Older psql versions avoid that, but it's
pretty likely that other clients have trouble with this,
so we'd better back-patch the fix.

In stable branches, just revert to our historical behavior of
returning an empty string when there was no user-given port
specification.  However, it seems substantially more useful and
indeed more correct to hand back DEF_PGPORT_STR in such cases,
so let's make v18 and master do that.

Author: Daniele Varrazzo <daniele.varrazzo@gmail.com>
Reviewed-by: Laurenz Albe <laurenz.albe@cybertec.at>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CA+mi_8YTS8WPZPO0PAb2aaGLwHuQ0DEQRF0ZMnvWss4y9FwDYQ@mail.gmail.com
Backpatch-through: 13

src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/libpq-int.h

index 09eb79812ac6d71556f23cc37f3121d51cf219fa..d9e3da0495851fbf60ffcca14b3b854f6e1331ed 100644 (file)
@@ -7528,10 +7528,12 @@ PQport(const PGconn *conn)
        if (!conn)
                return NULL;
 
-       if (conn->connhost != NULL)
+       if (conn->connhost != NULL &&
+               conn->connhost[conn->whichhost].port != NULL &&
+               conn->connhost[conn->whichhost].port[0] != '\0')
                return conn->connhost[conn->whichhost].port;
 
-       return "";
+       return DEF_PGPORT_STR;
 }
 
 /*
index a6cfd7f5c9d83b89a0405f43d867e3f04f229f31..f975f03ca1e06109b18d4e5ebd7f3f0688b28302 100644 (file)
@@ -357,7 +357,8 @@ typedef struct pg_conn_host
        pg_conn_host_type type;         /* type of host address */
        char       *host;                       /* host name or socket path */
        char       *hostaddr;           /* host numeric IP address */
-       char       *port;                       /* port number (always provided) */
+       char       *port;                       /* port number (if NULL or empty, use
+                                                                * DEF_PGPORT[_STR]) */
        char       *password;           /* password for this host, read from the
                                                                 * password file; NULL if not sought or not
                                                                 * found in password file. */