aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/variable.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2009-09-03 22:08:14 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2009-09-03 22:08:14 +0000
commit4fd4bf4bd85ee1f6a64c0d0e087420e38a387257 (patch)
treeca06f0a4006a9c31ba27f65ee706341824d99d39 /src/backend/commands/variable.c
parent3e2440970a00a57f66aaf72e38a35bfe53a07c29 (diff)
downloadpostgresql-4fd4bf4bd85ee1f6a64c0d0e087420e38a387257.tar.gz
postgresql-4fd4bf4bd85ee1f6a64c0d0e087420e38a387257.zip
Disallow RESET ROLE and RESET SESSION AUTHORIZATION inside security-definer
functions. This extends the previous patch that forbade SETting these variables inside security-definer functions. RESET is equally a security hole, since it would allow regaining privileges of the caller; furthermore it can trigger Assert failures and perhaps other internal errors, since the code is not expecting these variables to change in such contexts. The previous patch did not cover this case because assign hooks don't really have enough information, so move the responsibility for preventing this into guc.c. Problem discovered by Heikki Linnakangas. Security: no CVE assigned yet, extends CVE-2007-6600
Diffstat (limited to 'src/backend/commands/variable.c')
-rw-r--r--src/backend/commands/variable.c35
1 files changed, 1 insertions, 34 deletions
diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c
index 1374b651229..a0df419aefe 100644
--- a/src/backend/commands/variable.c
+++ b/src/backend/commands/variable.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.130 2009/06/11 14:48:56 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.130.2.1 2009/09/03 22:08:13 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -717,21 +717,6 @@ assign_session_authorization(const char *value, bool doit, GucSource source)
/* not a saved ID, so look it up */
HeapTuple roleTup;
- if (InSecurityDefinerContext())
- {
- /*
- * Disallow SET SESSION AUTHORIZATION inside a security definer
- * context. We need to do this because when we exit the context,
- * GUC won't be notified, leaving things out of sync. Note that
- * this test is positioned so that restoring a previously saved
- * setting isn't prevented.
- */
- ereport(GUC_complaint_elevel(source),
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("cannot set session authorization within security-definer function")));
- return NULL;
- }
-
if (!IsTransactionState())
{
/*
@@ -838,24 +823,6 @@ assign_role(const char *value, bool doit, GucSource source)
}
}
- if (roleid == InvalidOid && InSecurityDefinerContext())
- {
- /*
- * Disallow SET ROLE inside a security definer context. We need to do
- * this because when we exit the context, GUC won't be notified,
- * leaving things out of sync. Note that this test is arranged so
- * that restoring a previously saved setting isn't prevented.
- *
- * XXX it would be nice to allow this case in future, with the
- * behavior being that the SET ROLE's effects end when the security
- * definer context is exited.
- */
- ereport(GUC_complaint_elevel(source),
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("cannot set role within security-definer function")));
- return NULL;
- }
-
if (roleid == InvalidOid &&
strcmp(actual_rolename, "none") != 0)
{