From 0e78a610f24463f64d8a03b39f06e995581c923a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 12 Jul 2015 16:25:51 -0400 Subject: [PATCH] Fix assorted memory leaks. Per Coverity (not that any of these are so non-obvious that they should not have been caught before commit). The extent of leakage is probably minor to unnoticeable, but a leak is a leak. Back-patch as necessary. Michael Paquier --- src/bin/pg_basebackup/streamutil.c | 1 + src/bin/pg_dump/pg_dump.c | 2 ++ src/bin/pg_rewind/libpq_fetch.c | 8 ++++++-- src/bin/scripts/vacuumdb.c | 7 ++++--- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c index a5cad350f8..91f919c34c 100644 --- a/src/bin/pg_basebackup/streamutil.c +++ b/src/bin/pg_basebackup/streamutil.c @@ -414,6 +414,7 @@ DropReplicationSlot(PGconn *conn, const char *slot_name) return false; } + destroyPQExpBuffer(query); PQclear(res); return true; } diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 32ac26f1db..6664cee3b4 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -6660,6 +6660,7 @@ getTransforms(Archive *fout, int *numTransforms) appendPQExpBuffer(&namebuf, "%s %s", typeInfo->dobj.name, lanname); transforminfo[i].dobj.name = namebuf.data; + free(lanname); } PQclear(res); @@ -15731,6 +15732,7 @@ getExtensionMembership(Archive *fout, DumpOptions *dopt, ExtensionInfo extinfo[] addObjectDependency(&contable->dataObj->dobj, reftable->dataObj->dobj.dumpId); } + PQclear(res); destroyPQExpBuffer(query); } diff --git a/src/bin/pg_rewind/libpq_fetch.c b/src/bin/pg_rewind/libpq_fetch.c index 05aa133cf3..1979fbcb8a 100644 --- a/src/bin/pg_rewind/libpq_fetch.c +++ b/src/bin/pg_rewind/libpq_fetch.c @@ -69,7 +69,7 @@ libpqConnect(const char *connstr) pg_free(str); /* - * Also check that full_page_writes is enabled. We can get torn pages if + * Also check that full_page_writes is enabled. We can get torn pages if * a page is modified while we read it with pg_read_binary_file(), and we * rely on full page images to fix them. */ @@ -81,6 +81,7 @@ libpqConnect(const char *connstr) /* * Runs a query that returns a single value. + * The result should be pg_free'd after use. */ static char * run_simple_query(const char *sql) @@ -123,6 +124,8 @@ libpqGetCurrentXlogInsertLocation(void) result = ((uint64) hi) << 32 | lo; + pg_free(val); + return result; } @@ -201,6 +204,7 @@ libpqProcessFileList(void) process_source_file(path, type, filesize, link_target); } + PQclear(res); } /*---- @@ -296,7 +300,7 @@ receiveFileChunks(const char *sql) if (PQgetisnull(res, 0, 2)) { pg_log(PG_DEBUG, - "received NULL chunk for file \"%s\", file has been deleted\n", + "received NULL chunk for file \"%s\", file has been deleted\n", filename); pg_free(filename); PQclear(res); diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index ca6d003683..7e72db1edf 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -393,9 +393,9 @@ vacuum_one_database(const char *dbname, vacuumingOptions *vacopts, for (i = 0; i < ntups; i++) { appendPQExpBufferStr(&buf, - fmtQualifiedId(PQserverVersion(conn), - PQgetvalue(res, i, 1), - PQgetvalue(res, i, 0))); + fmtQualifiedId(PQserverVersion(conn), + PQgetvalue(res, i, 1), + PQgetvalue(res, i, 0))); simple_string_list_append(&dbtables, buf.data); resetPQExpBuffer(&buf); @@ -412,6 +412,7 @@ vacuum_one_database(const char *dbname, vacuumingOptions *vacopts, concurrentCons = ntups; if (concurrentCons <= 1) parallel = false; + PQclear(res); } /* -- 2.40.0