aboutsummaryrefslogtreecommitdiff
path: root/contrib/postgres_fdw/postgres_fdw.c
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2019-04-19 11:33:37 -0700
committerAndres Freund <andres@anarazel.de>2019-04-19 11:39:56 -0700
commit88e6ad3054ddd5aa0dee12e5def2c335fe92a414 (patch)
tree37320de1df0f431fd5f3553b94c1f8f146efb621 /contrib/postgres_fdw/postgres_fdw.c
parent4d5840cea96d7f893389664dd423716b38fded7a (diff)
downloadpostgresql-88e6ad3054ddd5aa0dee12e5def2c335fe92a414.tar.gz
postgresql-88e6ad3054ddd5aa0dee12e5def2c335fe92a414.zip
Fix two memory leaks around force-storing tuples in slots.
As reported by Tom, when ExecStoreMinimalTuple() had to perform a conversion to store the minimal tuple in the slot, it forgot to respect the shouldFree flag, and leaked the tuple into the current memory context if true. Fix that by freeing the tuple in that case. Looking at the relevant code made me (Andres) realize that not having the shouldFree parameter to ExecForceStoreHeapTuple() was a bad idea. Some callers had to locally implement the necessary logic, and in one case it was missing, creating a potential per-group leak in non-hashed aggregation. The choice to not free the tuple in ExecComputeStoredGenerated() is not pretty, but not introduced by this commit - I'll start a separate discussion about it. Reported-By: Tom Lane Discussion: https://postgr.es/m/366.1555382816@sss.pgh.pa.us
Diffstat (limited to 'contrib/postgres_fdw/postgres_fdw.c')
-rw-r--r--contrib/postgres_fdw/postgres_fdw.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index db62caf6d9f..25e219dd82c 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -3711,9 +3711,7 @@ store_returning_result(PgFdwModifyState *fmstate,
* The returning slot will not necessarily be suitable to store
* heaptuples directly, so allow for conversion.
*/
- ExecForceStoreHeapTuple(newtup, slot);
- ExecMaterializeSlot(slot);
- pfree(newtup);
+ ExecForceStoreHeapTuple(newtup, slot, true);
}
PG_CATCH();
{