From 918d74a07e5fbaa1858e89b345b4daa10c667292 Mon Sep 17 00:00:00 2001 From: Kevin Grittner Date: Fri, 27 Dec 2013 15:41:32 -0600 Subject: [PATCH] Fix misplaced right paren bugs in pgstatfuncs.c. The bug would only show up if the C sockaddr structure contained zero in the first byte for a valid address; otherwise it would fail to fail, which is probably why it went unnoticed for so long. Patch submitted by Joel Jacobson after seeing an article by Andrey Karpov in which he reports finding this through static code analysis using PVS-Studio. While I was at it I moved a definition of a local variable referenced in the buggy code to a more local context. Backpatch to all supported branches. --- src/backend/utils/adt/pgstatfuncs.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 52f75d2735..9667f53911 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -486,7 +486,6 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) bool nulls[11]; HeapTuple tuple; PgBackendStatus *beentry; - SockAddr zero_clientaddr; MemSet(values, 0, sizeof(values)); MemSet(nulls, 0, sizeof(nulls)); @@ -527,6 +526,8 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) /* Values only available to same user or superuser */ if (superuser() || beentry->st_userid == GetUserId()) { + SockAddr zero_clientaddr; + if (*(beentry->st_activity) == '\0') { values[4] = CStringGetTextDatum(""); @@ -556,7 +557,7 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) /* A zeroed client addr means we don't know */ memset(&zero_clientaddr, 0, sizeof(zero_clientaddr)); if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr, - sizeof(zero_clientaddr) == 0)) + sizeof(zero_clientaddr)) == 0) { nulls[9] = true; nulls[10] = true; @@ -809,7 +810,7 @@ pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS) /* A zeroed client addr means we don't know */ memset(&zero_clientaddr, 0, sizeof(zero_clientaddr)); if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr, - sizeof(zero_clientaddr) == 0)) + sizeof(zero_clientaddr)) == 0) PG_RETURN_NULL(); switch (beentry->st_clientaddr.addr.ss_family) @@ -856,7 +857,7 @@ pg_stat_get_backend_client_port(PG_FUNCTION_ARGS) /* A zeroed client addr means we don't know */ memset(&zero_clientaddr, 0, sizeof(zero_clientaddr)); if (memcmp(&(beentry->st_clientaddr), &zero_clientaddr, - sizeof(zero_clientaddr) == 0)) + sizeof(zero_clientaddr)) == 0) PG_RETURN_NULL(); switch (beentry->st_clientaddr.addr.ss_family) -- 2.50.0