summaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xact.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam/xact.c')
-rw-r--r--src/backend/access/transam/xact.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index c8a68b5fb3a..36bfc3f5426 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.156.2.4 2007/04/26 23:25:40 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.156.2.5 2008/01/03 21:25:33 tgl Exp $
*
* NOTES
* Transaction aborts can now occur two ways:
@@ -204,6 +204,8 @@ static TransactionStateData CurrentTransactionStateData = {
static TransactionState CurrentTransactionState = &CurrentTransactionStateData;
+static AclId prevUser; /* CurrentUserId at transaction start */
+
/*
* User-tweakable parameters
*/
@@ -849,6 +851,7 @@ static void
StartTransaction(void)
{
TransactionState s = CurrentTransactionState;
+ bool prevSecDefCxt;
/*
* check the current transaction state
@@ -882,6 +885,10 @@ StartTransaction(void)
s->commandId = FirstCommandId;
s->startTime = GetCurrentAbsoluteTimeUsec(&(s->startTimeUsec));
+ GetUserIdAndContext(&prevUser, &prevSecDefCxt);
+ /* SecurityDefinerContext should never be set outside a transaction */
+ Assert(!prevSecDefCxt);
+
/*
* initialize the various transaction subsystems
*/
@@ -1074,9 +1081,16 @@ AbortTransaction(void)
AtAbort_Memory();
/*
- * Reset user id which might have been changed transiently
+ * Reset user ID which might have been changed transiently. We need this
+ * to clean up in case control escaped out of a SECURITY DEFINER function
+ * or other local change of CurrentUserId; therefore, the prior value
+ * of SecurityDefinerContext also needs to be restored.
+ *
+ * (Note: it is not necessary to restore session authorization
+ * setting here because that can only be changed via GUC, and GUC will
+ * take care of rolling it back if need be.)
*/
- SetUserId(GetSessionUserId());
+ SetUserIdAndContext(prevUser, false);
/*
* do abort processing