From eee5088e538be24f6c42e758ef27cecc2b2579f1 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 26 Jun 2012 16:16:52 -0400 Subject: Allow pg_terminate_backend() to be used on backends with matching role. A similar change was made previously for pg_cancel_backend, so now it all matches again. Dan Farina, reviewed by Fujii Masao, Noah Misch, and Jeff Davis, with slight kibitzing on the doc changes by me. --- src/backend/utils/adt/misc.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'src/backend/utils/adt/misc.c') diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index 96e692766bf..f3c7860f0c3 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -162,18 +162,20 @@ pg_cancel_backend(PG_FUNCTION_ARGS) } /* - * Signal to terminate a backend process. Only allowed by superuser. + * Signal to terminate a backend process. This is allowed if you are superuser + * or have the same role as the process being terminated. */ Datum pg_terminate_backend(PG_FUNCTION_ARGS) { - if (!superuser()) + int r = pg_signal_backend(PG_GETARG_INT32(0), SIGTERM); + + if (r == SIGNAL_BACKEND_NOPERMISSION) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser to terminate other server processes"), - errhint("You can cancel your own processes with pg_cancel_backend()."))); + (errmsg("must be superuser or have the same role to terminate backends running in other server processes")))); - PG_RETURN_BOOL(pg_signal_backend(PG_GETARG_INT32(0), SIGTERM) == SIGNAL_BACKEND_SUCCESS); + PG_RETURN_BOOL(r == SIGNAL_BACKEND_SUCCESS); } /* -- cgit v1.2.3