*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.72 2002/12/05 04:04:42 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.73 2003/02/01 18:31:28 tgl Exp $
*
*-------------------------------------------------------------------------
*/
/*
* SET SESSION AUTHORIZATION
*
- * Note: when resetting session auth after an error, we can't expect to do
- * catalog lookups. Hence, the stored form of the value is always a numeric
- * userid that can be re-used directly.
+ * 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.
*/
const char *
assign_session_authorization(const char *value, bool doit, bool interactive)
{
- AclId usesysid;
- char *endptr;
+ AclId usesysid = 0;
char *result;
- usesysid = (Oid) strtoul(value, &endptr, 10);
-
- if (endptr != value && *endptr == '\0' && OidIsValid(usesysid))
+ if (strspn(value, "x") == NAMEDATALEN)
{
- /* use the numeric user ID */
+ /* might be a saved numeric userid */
+ char *endptr;
+
+ usesysid = (AclId) strtoul(value + NAMEDATALEN, &endptr, 10);
+
+ if (endptr != value + NAMEDATALEN && *endptr == '\0')
+ {
+ /* syntactically valid, so use the numeric user ID */
+ }
+ else
+ usesysid = 0;
}
- else
+
+ if (usesysid == 0)
{
+ /* not a saved ID, so look it up */
HeapTuple userTup;
userTup = SearchSysCache(SHADOWNAME,
if (doit)
SetSessionAuthorization(usesysid);
- result = (char *) malloc(32);
+ result = (char *) malloc(NAMEDATALEN + 32);
if (!result)
return NULL;
- snprintf(result, 32, "%lu", (unsigned long) usesysid);
+ memset(result, 'x', NAMEDATALEN);
+
+ snprintf(result + NAMEDATALEN, 32, "%lu", (unsigned long) usesysid);
return result;
}
const char *
show_session_authorization(void)
{
+ /*
+ * We can't use the stored string; see comments for
+ * assign_session_authorization
+ */
return GetUserNameFromId(GetSessionUserId());
}