summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Grittner2013-12-27 21:40:51 +0000
committerKevin Grittner2013-12-27 21:40:51 +0000
commit28b60aa231c1f5ba89495da4f84564ebd9faeeb4 (patch)
tree930eac63c51da17de83a489280978b369a019409
parent663f8419b6e75b6ebc4c22d10fbe55f133f768e0 (diff)
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.
-rw-r--r--src/backend/utils/adt/pgstatfuncs.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 8c1a76728de..5a03b15c465 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -601,7 +601,6 @@ pg_stat_get_activity(PG_FUNCTION_ARGS)
bool nulls[14];
HeapTuple tuple;
PgBackendStatus *beentry;
- SockAddr zero_clientaddr;
MemSet(values, 0, sizeof(values));
MemSet(nulls, 0, sizeof(nulls));
@@ -642,6 +641,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;
+
switch (beentry->st_state)
{
case STATE_IDLE:
@@ -693,7 +694,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[11] = true;
nulls[12] = true;
@@ -957,7 +958,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)
@@ -1004,7 +1005,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)