]> granicus.if.org Git - postgresql/commitdiff
Fix use of already freed memory when dumping a database's security label.
authorAndres Freund <andres@anarazel.de>
Sun, 18 Jan 2015 14:57:55 +0000 (15:57 +0100)
committerAndres Freund <andres@anarazel.de>
Sun, 18 Jan 2015 15:16:22 +0000 (16:16 +0100)
pg_dump.c:dumDatabase() called ArchiveEntry() with the results of a a
query that was PQclear()ed a couple lines earlier.

Backpatch to 9.2 where security labels for shared objects where
introduced.

src/bin/pg_dump/pg_dump.c

index 98403e756234eded944ceac541ab09dc9d9216e9..dcf0349e839fe253281829efffcd0c9ef743518f 100644 (file)
@@ -2465,25 +2465,29 @@ dumpDatabase(Archive *fout)
                                        dbCatId, 0, dbDumpId);
        }
 
-       PQclear(res);
-
        /* Dump shared security label. */
        if (!no_security_labels && fout->remoteVersion >= 90200)
        {
-               PQExpBuffer seclabelQry = createPQExpBuffer();
+               PGresult   *shres;
+               PQExpBuffer seclabelQry;
+
+               seclabelQry = createPQExpBuffer();
 
                buildShSecLabelQuery(conn, "pg_database", dbCatId.oid, seclabelQry);
-               res = ExecuteSqlQuery(fout, seclabelQry->data, PGRES_TUPLES_OK);
+               shres = ExecuteSqlQuery(fout, seclabelQry->data, PGRES_TUPLES_OK);
                resetPQExpBuffer(seclabelQry);
-               emitShSecLabels(conn, res, seclabelQry, "DATABASE", datname);
+               emitShSecLabels(conn, shres, seclabelQry, "DATABASE", datname);
                if (strlen(seclabelQry->data))
                        ArchiveEntry(fout, dbCatId, createDumpId(), datname, NULL, NULL,
                                                 dba, false, "SECURITY LABEL", SECTION_NONE,
                                                 seclabelQry->data, "", NULL,
                                                 &dbDumpId, 1, NULL, NULL);
                destroyPQExpBuffer(seclabelQry);
+               PQclear(shres);
        }
 
+       PQclear(res);
+
        destroyPQExpBuffer(dbQry);
        destroyPQExpBuffer(delQry);
        destroyPQExpBuffer(creaQry);