]> granicus.if.org Git - postgresql/commitdiff
Fix misplaced right paren bugs in pgstatfuncs.c.
authorKevin Grittner <kgrittn@postgresql.org>
Fri, 27 Dec 2013 21:41:18 +0000 (15:41 -0600)
committerKevin Grittner <kgrittn@postgresql.org>
Fri, 27 Dec 2013 21:41:18 +0000 (15:41 -0600)
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

index 4d07bdd24bde7e5dbe4bcb26871bf894920b1c33..c75b9420264f5c03f2061f16ff7a23812f46e40a 100644 (file)
@@ -587,7 +587,6 @@ pg_stat_get_activity(PG_FUNCTION_ARGS)
                bool            nulls[12];
                HeapTuple       tuple;
                PgBackendStatus *beentry;
-               SockAddr        zero_clientaddr;
 
                MemSet(values, 0, sizeof(values));
                MemSet(nulls, 0, sizeof(nulls));
@@ -628,6 +627,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("<command string not enabled>");
@@ -657,7 +658,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;
@@ -919,7 +920,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)
@@ -966,7 +967,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)