mirror of
https://github.com/postgres/postgres.git
synced 2025-07-05 07:21:24 +03:00
Tweak libpq's PQhost, PQhostaddr, and psql's \connect
Fixes some problems introduced by 6e5f8d489a
:
* When reusing conninfo data from the previous connection in \connect,
the host address should only be reused if it was specified as
hostaddr; if it wasn't, then 'host' is resolved afresh. We were
reusing the same IP address, which ignores a possible DNS change
as well as any other addresses that the name resolves to than the
one that was used in the original connection.
* PQhost, PQhostaddr: Don't present user-specified hostaddr when we have
an inet_net_ntop-produced equivalent address. The latter has been
put in canonical format, which is cleaner (so it produces "127.0.0.1"
when given "host=2130706433", for example).
* Document the hostaddr-reusing aspect of \connect.
* Fix some code comments
Author: Fabien Coelho
Reported-by: Noah Misch
Discussion: https://postgr.es/m/20190527203713.GA58392@gust.leadboat.com
This commit is contained in:
@ -1536,9 +1536,7 @@ getHostaddr(PGconn *conn, char *host_addr, int host_addr_len)
|
||||
{
|
||||
struct sockaddr_storage *addr = &conn->raddr.addr;
|
||||
|
||||
if (conn->connhost[conn->whichhost].type == CHT_HOST_ADDRESS)
|
||||
strlcpy(host_addr, conn->connhost[conn->whichhost].hostaddr, host_addr_len);
|
||||
else if (addr->ss_family == AF_INET)
|
||||
if (addr->ss_family == AF_INET)
|
||||
{
|
||||
if (inet_net_ntop(AF_INET,
|
||||
&((struct sockaddr_in *) addr)->sin_addr.s_addr,
|
||||
@ -6463,6 +6461,10 @@ PQhost(const PGconn *conn)
|
||||
|
||||
if (conn->connhost != NULL)
|
||||
{
|
||||
/*
|
||||
* Return the verbatim host value provided by user, or hostaddr in its
|
||||
* lack.
|
||||
*/
|
||||
if (conn->connhost[conn->whichhost].host != NULL &&
|
||||
conn->connhost[conn->whichhost].host[0] != '\0')
|
||||
return conn->connhost[conn->whichhost].host;
|
||||
@ -6480,15 +6482,9 @@ PQhostaddr(const PGconn *conn)
|
||||
if (!conn)
|
||||
return NULL;
|
||||
|
||||
if (conn->connhost != NULL)
|
||||
{
|
||||
if (conn->connhost[conn->whichhost].hostaddr != NULL &&
|
||||
conn->connhost[conn->whichhost].hostaddr[0] != '\0')
|
||||
return conn->connhost[conn->whichhost].hostaddr;
|
||||
|
||||
if (conn->connip != NULL)
|
||||
return conn->connip;
|
||||
}
|
||||
/* Return the parsed IP address */
|
||||
if (conn->connhost != NULL && conn->connip != NULL)
|
||||
return conn->connip;
|
||||
|
||||
return "";
|
||||
}
|
||||
|
Reference in New Issue
Block a user