fmgr_security_definer had better do a PG_TRY to ensure the outer userid
authorTom Lane
Fri, 1 Oct 2004 20:39:54 +0000 (20:39 +0000)
committerTom Lane
Fri, 1 Oct 2004 20:39:54 +0000 (20:39 +0000)
is restored on error exit.

src/backend/utils/fmgr/fmgr.c

index b963fd86e9e9ffbf2c55122927295ec4907fb1ae..b3f6ec0f5ef002dd543124bfa3423b9240a7cdd3 100644 (file)
@@ -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;
 }