Fix more memory leaks in failure path in buildACLCommands.
authorTom Lane <[email protected]>
Wed, 11 Feb 2015 23:35:23 +0000 (18:35 -0500)
committerTom Lane <[email protected]>
Wed, 11 Feb 2015 23:35:23 +0000 (18:35 -0500)
We already had one go at this issue in commit d73b7f973db5ec7e, but we
failed to notice that buildACLCommands also leaked several PQExpBuffers
along with a simply malloc'd string.  This time let's try to make the
fix a bit more future-proof by eliminating the separate exit path.

It's still not exactly critical because pg_dump will curl up and die on
failure; but since the amount of the potential leak is now several KB,
it seems worth back-patching as far as 9.2 where the previous fix landed.

Per Coverity, which evidently is smarter than clang's static analyzer.

src/bin/pg_dump/dumputils.c

index 55509866ff5c692288e8b31074a6912020b381ca..095c50770ba1992734bf5b7b0ceb7d3c699a3651 100644 (file)
@@ -500,6 +500,7 @@ buildACLCommands(const char *name, const char *subname,
                 const char *prefix, int remoteVersion,
                 PQExpBuffer sql)
 {
+   bool        ok = true;
    char      **aclitems;
    int         naclitems;
    int         i;
@@ -570,8 +571,8 @@ buildACLCommands(const char *name, const char *subname,
        if (!parseAclItem(aclitems[i], type, name, subname, remoteVersion,
                          grantee, grantor, privs, privswgo))
        {
-           free(aclitems);
-           return false;
+           ok = false;
+           break;
        }
 
        if (grantor->len == 0 && owner)
@@ -678,7 +679,7 @@ buildACLCommands(const char *name, const char *subname,
 
    free(aclitems);
 
-   return true;
+   return ok;
 }
 
 /*