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);