Skip to content

Commit bfa9b25

Browse files
committed
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
1 parent e0d3f3c commit bfa9b25

File tree

2 files changed

+6
-3
lines changed

2 files changed

+6
-3
lines changed

src/interfaces/libpq/fe-connect.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7528,10 +7528,12 @@ PQport(const PGconn *conn)
75287528
if (!conn)
75297529
return NULL;
75307530

7531-
if (conn->connhost != NULL)
7531+
if (conn->connhost != NULL &&
7532+
conn->connhost[conn->whichhost].port != NULL &&
7533+
conn->connhost[conn->whichhost].port[0] != '\0')
75327534
return conn->connhost[conn->whichhost].port;
75337535

7534-
return "";
7536+
return DEF_PGPORT_STR;
75357537
}
75367538

75377539
/*

src/interfaces/libpq/libpq-int.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,8 @@ typedef struct pg_conn_host
357357
pg_conn_host_type type; /* type of host address */
358358
char *host; /* host name or socket path */
359359
char *hostaddr; /* host numeric IP address */
360-
char *port; /* port number (always provided) */
360+
char *port; /* port number (if NULL or empty, use
361+
* DEF_PGPORT[_STR]) */
361362
char *password; /* password for this host, read from the
362363
* password file; NULL if not sought or not
363364
* found in password file. */

0 commit comments

Comments
 (0)