]> granicus.if.org Git - postgresql/commitdiff
Change libpq's internal uses of PQhost() to inspect host field directly.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 3 Aug 2018 16:12:10 +0000 (12:12 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 3 Aug 2018 16:12:10 +0000 (12:12 -0400)
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
src/interfaces/libpq/fe-secure-common.c

index 3b2073a47fe844fb45687c17d68450d99f3460d4..09012c562d0c12537201cb99db03234a1b955ee8 100644 (file)
@@ -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)
        {
index 40203f3b64209bc6e61d29c4c2183cf54046a790..b3f580f5950e24fb76f0cd77e687f708374ef8da 100644 (file)
@@ -88,10 +88,17 @@ pq_verify_peer_name_matches_certificate_name(PGconn *conn,
 {
        char       *name;
        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;
+       }
+
        /*
         * There is no guarantee the string returned from the certificate is
         * NULL-terminated, so make a copy that is.
@@ -145,7 +152,7 @@ pq_verify_peer_name_matches_certificate_name(PGconn *conn,
 bool
 pq_verify_peer_name_matches_certificate(PGconn *conn)
 {
-       char       *host = PQhost(conn);
+       char       *host = conn->connhost[conn->whichhost].host;
        int                     rc;
        int                     names_examined = 0;
        char       *first_name = NULL;