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:04:10 +0000 (16:04 +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 dc062e67eedd6106da434bb889aa207267c69f25..1e330f243abd38088f2a55ace4acde92072af88e 100644 (file)
@@ -2476,25 +2476,29 @@ dumpDatabase(Archive *fout, DumpOptions *dopt)
                                        dbCatId, 0, dbDumpId);
        }
 
-       PQclear(res);
-
        /* Dump shared security label. */
        if (!dopt->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);