From 6cb229d5ad77112156946c42cc91b8cba204072e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 1 Apr 2014 21:30:11 -0400 Subject: [PATCH] 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. --- src/backend/postmaster/pgstat.c | 9 +++++---- src/backend/utils/adt/pgstatfuncs.c | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 0fd44957d96..1b8b6c73573 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -2518,7 +2518,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_state = STATE_UNDEFINED; beentry->st_appname[0] = '\0'; @@ -2531,9 +2535,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 5a03b15c465..66e896dc340 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -724,7 +724,8 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) clean_ipv6_addr(beentry->st_clientaddr.addr.ss_family, remote_host); values[11] = DirectFunctionCall1(inet_in, CStringGetDatum(remote_host)); - if (beentry->st_clienthostname) + if (beentry->st_clienthostname && + beentry->st_clienthostname[0]) values[12] = CStringGetTextDatum(beentry->st_clienthostname); else nulls[12] = true; -- 2.39.5