From: Tom Lane Date: Wed, 2 Apr 2014 01:30:18 +0000 (-0400) Subject: Fix bugs in manipulation of PgBackendStatus.st_clienthostname. X-Git-Tag: REL9_1_14~82 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2b5206901111db6dc8c6b9af0c4fde681c30e906;p=postgresql Fix bugs in manipulation of PgBackendStatus.st_clienthostname. Initialization of this field was not being done according to the st_changecount protocol (it has to be done within the changecount increment range, not outside). And the test to see if the value should be reported as null was wrong. Noted while perusing uses of Port.remote_hostname. This was wrong from the introduction of this code (commit 4a25bc145), so back-patch to 9.1. --- diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 77e195e554..e1e60294ea 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -2404,7 +2404,11 @@ pgstat_bestart(void) beentry->st_databaseid = MyDatabaseId; beentry->st_userid = userid; beentry->st_clientaddr = clientaddr; - beentry->st_clienthostname[0] = '\0'; + if (MyProcPort && MyProcPort->remote_hostname) + strlcpy(beentry->st_clienthostname, MyProcPort->remote_hostname, + NAMEDATALEN); + else + beentry->st_clienthostname[0] = '\0'; beentry->st_waiting = false; beentry->st_appname[0] = '\0'; beentry->st_activity[0] = '\0'; @@ -2416,9 +2420,6 @@ pgstat_bestart(void) beentry->st_changecount++; Assert((beentry->st_changecount & 1) == 0); - if (MyProcPort && MyProcPort->remote_hostname) - strlcpy(beentry->st_clienthostname, MyProcPort->remote_hostname, NAMEDATALEN); - /* Update app name to current GUC setting */ if (application_name) pgstat_report_appname(application_name); diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index c75b942026..e0ec08e4b4 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -694,7 +694,8 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host); values[9] = DirectFunctionCall1(inet_in, CStringGetDatum(remote_host)); - if (beentry->st_clienthostname) + if (beentry->st_clienthostname && + beentry->st_clienthostname[0]) values[10] = CStringGetTextDatum(beentry->st_clienthostname); else nulls[10] = true;