From 894041eb262fa3c730db11bbd6a93798a905556c Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 1 Jun 2020 14:41:25 +0900 Subject: [PATCH] Fix use-after-release mistake in currtid() and currtid2() for views This issue has been present since the introduction of this code as of a3519a2 from 2002, and has been found by buildfarm member prion that uses RELCACHE_FORCE_RELEASE via the tests introduced recently in e786be5. Discussion: https://postgr.es/m/20200601022055.GB4121@paquier.xyz Backpatch-through: 9.5 --- src/backend/utils/adt/tid.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backend/utils/adt/tid.c b/src/backend/utils/adt/tid.c index d301c4e2a7..e12ec29222 100644 --- a/src/backend/utils/adt/tid.c +++ b/src/backend/utils/adt/tid.c @@ -338,8 +338,13 @@ currtid_for_view(Relation viewrel, ItemPointer tid) rte = rt_fetch(var->varno, query->rtable); if (rte) { + Datum result; + + result = DirectFunctionCall2(currtid_byreloid, + ObjectIdGetDatum(rte->relid), + PointerGetDatum(tid)); table_close(viewrel, AccessShareLock); - return DirectFunctionCall2(currtid_byreloid, ObjectIdGetDatum(rte->relid), PointerGetDatum(tid)); + return result; } } }