aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-10-01 20:39:54 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-10-01 20:39:54 +0000
commitb62aa83f0e1f73da704a00ecfb0e2523dc1f27de (patch)
tree3994fd00a5b99ea8b360cc22ca071232e4d720e4 /src
parentc8196c87a76b86c514e1f245624a21ab068c9012 (diff)
downloadpostgresql-b62aa83f0e1f73da704a00ecfb0e2523dc1f27de.tar.gz
postgresql-b62aa83f0e1f73da704a00ecfb0e2523dc1f27de.zip
fmgr_security_definer had better do a PG_TRY to ensure the outer userid
is restored on error exit.
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/fmgr/fmgr.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c
index b963fd86e9e..b3f6ec0f5ef 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;
}