mirror of
https://github.com/postgres/postgres.git
synced 2025-04-29 13:56:47 +03:00
Allow GRANT on pg_log_backend_memory_contexts().
Remove superuser check, allowing any user granted permissions on pg_log_backend_memory_contexts() to log the memory contexts of any backend. Note that this could allow a privileged non-superuser to log the memory contexts of a superuser backend, but as discussed, that does not seem to be a problem. Reviewed-by: Nathan Bossart, Bharath Rupireddy, Michael Paquier, Kyotaro Horiguchi, Andres Freund Discussion: https://postgr.es/m/e5cf6684d17c8d1ef4904ae248605ccd6da03e72.camel@j-davis.com
This commit is contained in:
parent
5fedf7417b
commit
f0b051e322
@ -25332,7 +25332,6 @@ SELECT collation for ('foo' COLLATE "de_DE");
|
|||||||
(See <xref linkend="runtime-config-logging"/> for more information),
|
(See <xref linkend="runtime-config-logging"/> for more information),
|
||||||
but will not be sent to the client regardless of
|
but will not be sent to the client regardless of
|
||||||
<xref linkend="guc-client-min-messages"/>.
|
<xref linkend="guc-client-min-messages"/>.
|
||||||
Only superusers can request to log the memory contexts.
|
|
||||||
</para></entry>
|
</para></entry>
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
|
@ -699,6 +699,8 @@ REVOKE EXECUTE ON FUNCTION pg_ls_dir(text) FROM public;
|
|||||||
|
|
||||||
REVOKE EXECUTE ON FUNCTION pg_ls_dir(text,boolean,boolean) FROM public;
|
REVOKE EXECUTE ON FUNCTION pg_ls_dir(text,boolean,boolean) FROM public;
|
||||||
|
|
||||||
|
REVOKE EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer) FROM PUBLIC;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- We also set up some things as accessible to standard roles.
|
-- We also set up some things as accessible to standard roles.
|
||||||
--
|
--
|
||||||
|
@ -162,10 +162,10 @@ pg_get_backend_memory_contexts(PG_FUNCTION_ARGS)
|
|||||||
* pg_log_backend_memory_contexts
|
* pg_log_backend_memory_contexts
|
||||||
* Signal a backend process to log its memory contexts.
|
* Signal a backend process to log its memory contexts.
|
||||||
*
|
*
|
||||||
* Only superusers are allowed to signal to log the memory contexts
|
* By default, only superusers are allowed to signal to log the memory
|
||||||
* because allowing any users to issue this request at an unbounded
|
* contexts because allowing any users to issue this request at an unbounded
|
||||||
* rate would cause lots of log messages and which can lead to
|
* rate would cause lots of log messages and which can lead to denial of
|
||||||
* denial of service.
|
* service. Additional roles can be permitted with GRANT.
|
||||||
*
|
*
|
||||||
* On receipt of this signal, a backend sets the flag in the signal
|
* On receipt of this signal, a backend sets the flag in the signal
|
||||||
* handler, which causes the next CHECK_FOR_INTERRUPTS() to log the
|
* handler, which causes the next CHECK_FOR_INTERRUPTS() to log the
|
||||||
@ -177,12 +177,6 @@ pg_log_backend_memory_contexts(PG_FUNCTION_ARGS)
|
|||||||
int pid = PG_GETARG_INT32(0);
|
int pid = PG_GETARG_INT32(0);
|
||||||
PGPROC *proc;
|
PGPROC *proc;
|
||||||
|
|
||||||
/* Only allow superusers to log memory contexts. */
|
|
||||||
if (!superuser())
|
|
||||||
ereport(ERROR,
|
|
||||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
|
||||||
errmsg("must be a superuser to log memory contexts")));
|
|
||||||
|
|
||||||
proc = BackendPidGetProc(pid);
|
proc = BackendPidGetProc(pid);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -53,6 +53,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* yyyymmddN */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 202109101
|
#define CATALOG_VERSION_NO 202110260
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -138,14 +138,43 @@ HINT: No function matches the given name and argument types. You might need to
|
|||||||
--
|
--
|
||||||
-- Memory contexts are logged and they are not returned to the function.
|
-- Memory contexts are logged and they are not returned to the function.
|
||||||
-- Furthermore, their contents can vary depending on the timing. However,
|
-- Furthermore, their contents can vary depending on the timing. However,
|
||||||
-- we can at least verify that the code doesn't fail.
|
-- we can at least verify that the code doesn't fail, and that the
|
||||||
|
-- permissions are set properly.
|
||||||
--
|
--
|
||||||
SELECT * FROM pg_log_backend_memory_contexts(pg_backend_pid());
|
SELECT pg_log_backend_memory_contexts(pg_backend_pid());
|
||||||
pg_log_backend_memory_contexts
|
pg_log_backend_memory_contexts
|
||||||
--------------------------------
|
--------------------------------
|
||||||
t
|
t
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
CREATE ROLE regress_log_memory;
|
||||||
|
SELECT has_function_privilege('regress_log_memory',
|
||||||
|
'pg_log_backend_memory_contexts(integer)', 'EXECUTE'); -- no
|
||||||
|
has_function_privilege
|
||||||
|
------------------------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
GRANT EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer)
|
||||||
|
TO regress_log_memory;
|
||||||
|
SELECT has_function_privilege('regress_log_memory',
|
||||||
|
'pg_log_backend_memory_contexts(integer)', 'EXECUTE'); -- yes
|
||||||
|
has_function_privilege
|
||||||
|
------------------------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SET ROLE regress_log_memory;
|
||||||
|
SELECT pg_log_backend_memory_contexts(pg_backend_pid());
|
||||||
|
pg_log_backend_memory_contexts
|
||||||
|
--------------------------------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
RESET ROLE;
|
||||||
|
REVOKE EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer)
|
||||||
|
FROM regress_log_memory;
|
||||||
|
DROP ROLE regress_log_memory;
|
||||||
--
|
--
|
||||||
-- Test some built-in SRFs
|
-- Test some built-in SRFs
|
||||||
--
|
--
|
||||||
|
@ -35,9 +35,31 @@ SELECT num_nulls();
|
|||||||
--
|
--
|
||||||
-- Memory contexts are logged and they are not returned to the function.
|
-- Memory contexts are logged and they are not returned to the function.
|
||||||
-- Furthermore, their contents can vary depending on the timing. However,
|
-- Furthermore, their contents can vary depending on the timing. However,
|
||||||
-- we can at least verify that the code doesn't fail.
|
-- we can at least verify that the code doesn't fail, and that the
|
||||||
|
-- permissions are set properly.
|
||||||
--
|
--
|
||||||
SELECT * FROM pg_log_backend_memory_contexts(pg_backend_pid());
|
|
||||||
|
SELECT pg_log_backend_memory_contexts(pg_backend_pid());
|
||||||
|
|
||||||
|
CREATE ROLE regress_log_memory;
|
||||||
|
|
||||||
|
SELECT has_function_privilege('regress_log_memory',
|
||||||
|
'pg_log_backend_memory_contexts(integer)', 'EXECUTE'); -- no
|
||||||
|
|
||||||
|
GRANT EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer)
|
||||||
|
TO regress_log_memory;
|
||||||
|
|
||||||
|
SELECT has_function_privilege('regress_log_memory',
|
||||||
|
'pg_log_backend_memory_contexts(integer)', 'EXECUTE'); -- yes
|
||||||
|
|
||||||
|
SET ROLE regress_log_memory;
|
||||||
|
SELECT pg_log_backend_memory_contexts(pg_backend_pid());
|
||||||
|
RESET ROLE;
|
||||||
|
|
||||||
|
REVOKE EXECUTE ON FUNCTION pg_log_backend_memory_contexts(integer)
|
||||||
|
FROM regress_log_memory;
|
||||||
|
|
||||||
|
DROP ROLE regress_log_memory;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Test some built-in SRFs
|
-- Test some built-in SRFs
|
||||||
|
Loading…
x
Reference in New Issue
Block a user