postgres.git / summary / log / commit / refs

commit    8d00858bafb50a8fb06c7e9482af2bfef2eebc75
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Fri Aug 03 16:12:10 2018 +0000
First released in: 12.0, 10.5, 11.0

    Change libpq's internal uses of PQhost() to inspect host field directly.
    
    Commit 1944cdc98 changed PQhost() to return the hostaddr value when that
    is specified and host isn't.  This is a good idea in general, but
    fe-auth.c and related files contain PQhost() calls for which it isn't.
    Specifically, when we compare SSL certificates or other server identity
    information to the host field, we do not want to use hostaddr instead;
    that's not what's documented, that's not what happened pre-v10, and
    it doesn't seem like a good idea.
    
    Instead, we can just look at connhost[].host directly.  This does what
    we want in v10 and up; in particular, if neither host nor hostaddr
    were given, the host field will be replaced with the default host name.
    That seems useful, and it's likely the reason that these places were
    coded to call PQhost() originally (since pre-v10, the stored field was
    not replaced with the default).
    
    Back-patch to v10, as 1944cdc98 (just) was.
    
    Discussion: https://postgr.es/m/23287.1533227021@sss.pgh.pa.us


src/interfaces/libpq/fe-auth.c | 4 ++-- src/interfaces/libpq/fe-secure-openssl.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/interfaces/libpq/fe-auth.c b/src/interfaces/libpq/fe-auth.c index c4ef4f0bbb0..1767f0fb9b3 100644 --- a/src/interfaces/libpq/fe-auth.c +++ b/src/interfaces/libpq/fe-auth.c @@ -199,7 +199,7 @@ pg_GSS_startup(PGconn *conn, int payloadlen) min_stat; int maxlen; gss_buffer_desc temp_gbuf; - char *host = PQhost(conn); + char *host = conn->connhost[conn->whichhost].host; if (!(host && host[0] != '\0')) { @@ -414,7 +414,7 @@ pg_SSPI_startup(PGconn *conn, int use_negotiate, int payloadlen) { SECURITY_STATUS r; TimeStamp expire; - char *host = PQhost(conn); + char *host = conn->connhost[conn->whichhost].host; if (conn->sspictx) { diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index 2f29820e820..f6636d1607a 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -483,10 +483,17 @@ verify_peer_name_matches_certificate_name(PGconn *conn, ASN1_STRING *name_entry, char *name; const unsigned char *namedata; int result; - char *host = PQhost(conn); + char *host = conn->connhost[conn->whichhost].host; *store_name = NULL; + if (!(host && host[0] != '\0')) + { + printfPQExpBuffer(&conn->errorMessage, + libpq_gettext("host name must be specified\n")); + return -1; + } + /* Should not happen... */ if (name_entry == NULL) { @@ -564,7 +571,7 @@ verify_peer_name_matches_certificate(PGconn *conn) STACK_OF(GENERAL_NAME) *peer_san; int i; int rc; - char *host = PQhost(conn); + char *host = conn->connhost[conn->whichhost].host; /* * If told not to verify the peer name, don't do it. Return true [parent: 62038810b73d]