diff options
Diffstat (limited to 'src/backend/commands/variable.c')
-rw-r--r-- | src/backend/commands/variable.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 1b2f8477521..3dd4724f774 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.78 2003/06/06 16:25:35 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.79 2003/06/27 19:08:37 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -721,25 +721,29 @@ assign_client_encoding(const char *value, bool doit, bool interactive) * When resetting session auth after an error, we can't expect to do catalog * lookups. Hence, the stored form of the value must provide a numeric userid * that can be re-used directly. We store the string in the form of - * NAMEDATALEN 'x's followed by the numeric userid --- this cannot conflict - * with any valid user name, because of the NAMEDATALEN limit on names. + * NAMEDATALEN 'x's, followed by T or F to indicate superuserness, followed + * by the numeric userid --- this cannot conflict with any valid user name, + * because of the NAMEDATALEN limit on names. */ const char * assign_session_authorization(const char *value, bool doit, bool interactive) { AclId usesysid = 0; + bool is_superuser = false; char *result; - if (strspn(value, "x") == NAMEDATALEN) + if (strspn(value, "x") == NAMEDATALEN && + (value[NAMEDATALEN] == 'T' || value[NAMEDATALEN] == 'F')) { /* might be a saved numeric userid */ char *endptr; - usesysid = (AclId) strtoul(value + NAMEDATALEN, &endptr, 10); + usesysid = (AclId) strtoul(value + NAMEDATALEN + 1, &endptr, 10); - if (endptr != value + NAMEDATALEN && *endptr == '\0') + if (endptr != value + NAMEDATALEN + 1 && *endptr == '\0') { - /* syntactically valid, so use the numeric user ID */ + /* syntactically valid, so use the numeric user ID and flag */ + is_superuser = (value[NAMEDATALEN] == 'T'); } else usesysid = 0; @@ -771,12 +775,13 @@ assign_session_authorization(const char *value, bool doit, bool interactive) } usesysid = ((Form_pg_shadow) GETSTRUCT(userTup))->usesysid; - + is_superuser = ((Form_pg_shadow) GETSTRUCT(userTup))->usesuper; + ReleaseSysCache(userTup); } if (doit) - SetSessionAuthorization(usesysid); + SetSessionAuthorization(usesysid, is_superuser); result = (char *) malloc(NAMEDATALEN + 32); if (!result) @@ -784,7 +789,9 @@ assign_session_authorization(const char *value, bool doit, bool interactive) memset(result, 'x', NAMEDATALEN); - snprintf(result + NAMEDATALEN, 32, "%lu", (unsigned long) usesysid); + snprintf(result + NAMEDATALEN, 32, "%c%lu", + is_superuser ? 'T' : 'F', + (unsigned long) usesysid); return result; } |