On Sun, 2024-06-30 at 15:30 -0700, Noah Misch wrote:
> You're caching the result of object_aclcheck(NamespaceRelationId,
> ...), so
> pg_auth_members changes
Thank you for the report.
Question: to check for changes to pg_auth_members, it seems like either
AUTHMEMROLEMEM or AUTHMEMMEMROLE work, and to use both would be
redundant. Am I missing something, or should I just pick one
arbitrarily (or by some convention)?
> and pg_database changes also need to invalidate this
> cache. (pg_database affects the ACL_CREATE_TEMP case in
> pg_namespace_aclmask_ext()
I am having trouble finding an actual problem with ACL_CREATE_TEMP.
search_path ACL checks are normally bypassed for the temp namespace, so
it can only happen when the actual temp namespace name (e.g.
pg_temp_NNN) is explicitly included. In that case, the mask is
ACL_USAGE, so the two branches in pg_namespace_aclmask_ext() are
equivalent, right?
This question is not terribly important for the fix, because
invalidating for each pg_database change is still necessary as you
point out in here:
> and affects ROLE_PG_DATABASE_OWNER membership.)
Another good catch, thank you.
Patch attached. Contains a bit of cleanup and is intended for 17+18.
Regards,
Jeff Davis
From 1b24d08302e268370ebb14e732f4d5f1f1407726 Mon Sep 17 00:00:00 2001
From: Jeff Davis <[email protected]>
Date: Mon, 8 Jul 2024 15:52:50 -0700
Subject: [PATCH v1] Fix missing invalidations for search_path cache.
Reported-by: Noah Misch
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 17
---
src/backend/catalog/namespace.c | 28 +++++++++++++++++++++-------
1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c
index a2510cf80c6..43b707699d7 100644
--- a/src/backend/catalog/namespace.c
+++ b/src/backend/catalog/namespace.c
@@ -230,7 +230,7 @@ static void AccessTempTableNamespace(bool force);
static void InitTempTableNamespace(void);
static void RemoveTempRelations(Oid tempNamespaceId);
static void RemoveTempRelationsCallback(int code, Datum arg);
-static void NamespaceCallback(Datum arg, int cacheid, uint32 hashvalue);
+static void InvalidationCallback(Datum arg, int cacheid, uint32 hashvalue);
static bool MatchNamedCall(HeapTuple proctup, int nargs, List *argnames,
bool include_out_arguments, int pronargs,
int **argnumbers);
@@ -4749,15 +4749,29 @@ InitializeSearchPath(void)
/*
* In normal mode, arrange for a callback on any syscache invalidation
- * of pg_namespace or pg_authid rows. (Changing a role name may affect
- * the meaning of the special string $user.)
+ * that will affect the search_path cache.
*/
+
+ /* namespace name or ACLs may have changed */
CacheRegisterSyscacheCallback(NAMESPACEOID,
- NamespaceCallback,
+ InvalidationCallback,
(Datum) 0);
+
+ /* role name may affect the meaning of "$user" */
CacheRegisterSyscacheCallback(AUTHOID,
- NamespaceCallback,
+ InvalidationCallback,
+ (Datum) 0);
+
+ /* role membership may affect ACLs */
+ CacheRegisterSyscacheCallback(AUTHMEMROLEMEM,
+ InvalidationCallback,
(Datum) 0);
+
+ /* database owner may affect ACLs */
+ CacheRegisterSyscacheCallback(DATABASEOID,
+ InvalidationCallback,
+ (Datum) 0);
+
/* Force search path to be recomputed on next use */
baseSearchPathValid = false;
searchPathCacheValid = false;
@@ -4765,11 +4779,11 @@ InitializeSearchPath(void)
}
/*
- * NamespaceCallback
+ * InvalidationCallback
* Syscache inval callback function
*/
static void
-NamespaceCallback(Datum arg, int cacheid, uint32 hashvalue)
+InvalidationCallback(Datum arg, int cacheid, uint32 hashvalue)
{
/*
* Force search path to be recomputed on next use, also invalidating the
--
2.34.1