From 23b2805caf73f44167472b668702fb8746681ba3 Mon Sep 17 00:00:00 2001 From: Kirill Reshke Date: Mon, 26 Feb 2024 09:59:13 +0300 Subject: [PATCH v1] cloud mdb_admin patch part to illustrate. --- src/backend/storage/ipc/signalfuncs.c | 30 +++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/backend/storage/ipc/signalfuncs.c b/src/backend/storage/ipc/signalfuncs.c index 81d1a59659..1885e31e7d 100644 --- a/src/backend/storage/ipc/signalfuncs.c +++ b/src/backend/storage/ipc/signalfuncs.c @@ -74,14 +74,40 @@ pg_signal_backend(int pid, int sig) return SIGNAL_BACKEND_ERROR; } + local_beentry = pgstat_get_local_beentry_by_backend_id(proc->backendId); + if (local_beentry != NULL) + beentry = &local_beentry->backendStatus; /* * Only allow superusers to signal superuser-owned backends. Any process * not advertising a role might have the importance of a superuser-owned * backend, so treat it that way. */ if ((!OidIsValid(proc->roleId) || superuser_arg(proc->roleId)) && - !superuser()) - return SIGNAL_BACKEND_NOSUPERUSER; + !superuser()) { + Oid role; + char * appname; + + if (local_beentry == NULL) { + return SIGNAL_BACKEND_NOSUPERUSER; + } + + role = get_role_oid("mdb_admin", true /*if nodoby created mdb_admin role in this database*/); + appname = local_beentry->backendStatus.st_appname; + + // only allow mdb_admin to kill su queries + if (!is_member_of_role(GetUserId(), role)) { + return SIGNAL_BACKEND_NOSUPERUSER; + } + + /* mdb admin allowed to kill proc with application name 'MDB' or autovacuum */ + if (local_beentry->backendStatus.st_backendType == B_AUTOVAC_WORKER) { + // ok + } else if (appname != NULL && strcmp(appname, "MDB") == 0) { + // ok + } else { + return SIGNAL_BACKEND_NOSUPERUSER; + } + } /* Users can signal backends they have role membership in. */ if (!has_privs_of_role(GetUserId(), proc->roleId) && -- 2.43.1