commit 3a974053b3022538d562ba6068e07495b092a344 Author: Edmund Horner Date: Tue Mar 27 15:23:57 2018 +1300 Allocate enough shared string memory for stats of auxiliary processes This fixes a bug whereby the st_appname, st_clienthostname, and st_activity_raw fields for auxiliary processes point beyond the end of their respective shared memory segments. This change also allocates local memory for the st_clienthostname fields, when copying the stats data in pgstat_read_current_status(). Author: Edmund Horner diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 96ba216..084573e 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -2650,7 +2650,7 @@ CreateSharedBackendStatus(void) } /* Create or attach to the shared appname buffer */ - size = mul_size(NAMEDATALEN, MaxBackends); + size = mul_size(NAMEDATALEN, NumBackendStatSlots); BackendAppnameBuffer = (char *) ShmemInitStruct("Backend Application Name Buffer", size, &found); @@ -2668,7 +2668,7 @@ CreateSharedBackendStatus(void) } /* Create or attach to the shared client hostname buffer */ - size = mul_size(NAMEDATALEN, MaxBackends); + size = mul_size(NAMEDATALEN, NumBackendStatSlots); BackendClientHostnameBuffer = (char *) ShmemInitStruct("Backend Client Host Name Buffer", size, &found); @@ -3224,6 +3224,7 @@ pgstat_read_current_status(void) LocalPgBackendStatus *localtable; LocalPgBackendStatus *localentry; char *localappname, + *localclienthostname, *localactivity; #ifdef USE_SSL PgBackendSSLStatus *localsslstatus; @@ -3242,6 +3243,9 @@ pgstat_read_current_status(void) localappname = (char *) MemoryContextAlloc(pgStatLocalContext, NAMEDATALEN * NumBackendStatSlots); + localclienthostname = (char *) + MemoryContextAlloc(pgStatLocalContext, + NAMEDATALEN * NumBackendStatSlots); localactivity = (char *) MemoryContextAlloc(pgStatLocalContext, pgstat_track_activity_query_size * NumBackendStatSlots); @@ -3282,6 +3286,8 @@ pgstat_read_current_status(void) */ strcpy(localappname, (char *) beentry->st_appname); localentry->backendStatus.st_appname = localappname; + strcpy(localclienthostname, (char *) beentry->st_clienthostname); + localentry->backendStatus.st_clienthostname = localclienthostname; strcpy(localactivity, (char *) beentry->st_activity_raw); localentry->backendStatus.st_activity_raw = localactivity; localentry->backendStatus.st_ssl = beentry->st_ssl; @@ -3313,6 +3319,7 @@ pgstat_read_current_status(void) localentry++; localappname += NAMEDATALEN; + localclienthostname += NAMEDATALEN; localactivity += pgstat_track_activity_query_size; #ifdef USE_SSL localsslstatus++;