aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/misc.c
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2012-06-26 16:16:52 -0400
committerRobert Haas <rhaas@postgresql.org>2012-06-26 16:16:52 -0400
commitc60ca19de9ad777c51243605571d1d7606000f08 (patch)
treed56bf6bd275ec79df90e9f216153b621ff4f8f31 /src/backend/utils/adt/misc.c
parentb79ab00144e64217d418fde884bca8ea58fbd4a4 (diff)
downloadpostgresql-c60ca19de9ad777c51243605571d1d7606000f08.tar.gz
postgresql-c60ca19de9ad777c51243605571d1d7606000f08.zip
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.
Diffstat (limited to 'src/backend/utils/adt/misc.c')
-rw-r--r--src/backend/utils/adt/misc.c12
1 files changed, 7 insertions, 5 deletions
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);
}
/*