postgres.git / summary / log / commit / refs

commit    d5cba774626f3c09df536aeddbf2f8c08a3cecc7
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Thu Jul 17 16:46:38 2025 +0000

    Fix PQport to never return NULL unless the connection is NULL.
    
    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 | 4 +++- src/interfaces/libpq/libpq-int.h | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 51b612050c4..19ea61ec056 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -6715,7 +6715,9 @@ 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 ""; diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index d052b8255c2..6e87a311ce3 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -335,7 +335,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. */ [parent: b9a89682846f]