From b62aa83f0e1f73da704a00ecfb0e2523dc1f27de Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 1 Oct 2004 20:39:54 +0000
Subject: [PATCH] fmgr_security_definer had better do a PG_TRY to ensure the
 outer userid is restored on error exit.

---
 src/backend/utils/fmgr/fmgr.c | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c
index b963fd86e9..b3f6ec0f5e 100644
--- a/src/backend/utils/fmgr/fmgr.c
+++ b/src/backend/utils/fmgr/fmgr.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/fmgr/fmgr.c,v 1.84 2004/09/13 01:44:46 neilc Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/fmgr/fmgr.c,v 1.85 2004/10/01 20:39:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -794,7 +794,7 @@ fmgr_security_definer(PG_FUNCTION_ARGS)
 {
 	Datum		result;
 	FmgrInfo   *save_flinfo;
-	struct fmgr_security_definer_cache *fcache;
+	struct fmgr_security_definer_cache * volatile fcache;
 	AclId		save_userid;
 	HeapTuple	tuple;
 
@@ -821,14 +821,25 @@ fmgr_security_definer(PG_FUNCTION_ARGS)
 		fcache = fcinfo->flinfo->fn_extra;
 
 	save_flinfo = fcinfo->flinfo;
-	fcinfo->flinfo = &fcache->flinfo;
-
 	save_userid = GetUserId();
-	SetUserId(fcache->userid);
-	result = FunctionCallInvoke(fcinfo);
-	SetUserId(save_userid);
+
+	PG_TRY();
+	{
+		fcinfo->flinfo = &fcache->flinfo;
+		SetUserId(fcache->userid);
+
+		result = FunctionCallInvoke(fcinfo);
+	}
+	PG_CATCH();
+	{
+		fcinfo->flinfo = save_flinfo;
+		SetUserId(save_userid);
+		PG_RE_THROW();
+	}
+	PG_END_TRY();
 
 	fcinfo->flinfo = save_flinfo;
+	SetUserId(save_userid);
 
 	return result;
 }
-- 
2.24.1