pg_signal_backend_asymmetry.v2.diff
application/octet-stream
Filename: pg_signal_backend_asymmetry.v2.diff
Type: application/octet-stream
Part: 0
Message:
Re: pg_signal_backend() asymmetry
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v2
| File | + | − |
|---|---|---|
| src/backend/utils/adt/misc.c | 0 | 0 |
diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c
new file mode 100644
index f3c7860..c491783
*** a/src/backend/utils/adt/misc.c
--- b/src/backend/utils/adt/misc.c
*************** current_query(PG_FUNCTION_ARGS)
*** 88,125 ****
static int
pg_signal_backend(int pid, int sig)
{
! PGPROC *proc;
! if (!superuser())
{
/*
! * Since the user is not superuser, check for matching roles. Trust
! * that BackendPidGetProc will return NULL if the pid isn't valid,
! * even though the check for whether it's a backend process is below.
! * The IsBackendPid check can't be relied on as definitive even if it
! * was first. The process might end between successive checks
! * regardless of their order. There's no way to acquire a lock on an
! * arbitrary process to prevent that. But since so far all the callers
! * of this mechanism involve some request for ending the process
! * anyway, that it might end on its own first is not a problem.
*/
! proc = BackendPidGetProc(pid);
!
! if (proc == NULL || proc->roleId != GetUserId())
! return SIGNAL_BACKEND_NOPERMISSION;
}
! if (!IsBackendPid(pid))
{
/*
! * This is just a warning so a loop-through-resultset will not abort
! * if one backend terminated on it's own during the run
*/
! ereport(WARNING,
! (errmsg("PID %d is not a PostgreSQL server process", pid)));
! return SIGNAL_BACKEND_ERROR;
}
/*
* Can the process we just validated above end, followed by the pid being
* recycled for a new process, before reaching here? Then we'd be trying
--- 88,124 ----
static int
pg_signal_backend(int pid, int sig)
{
! PGPROC *proc = BackendPidGetProc(pid);
! /* Trust that BackendPidGetProc will return NULL if the pid isn't valid.
! * Note, this check can't be relied on as definitive even if it
! * was first. The process might end between successive checks
! * regardless of their order. There's no way to acquire a lock on an
! * arbitrary process to prevent that. But since so far all the callers
! * of this mechanism involve some request for ending the process
! * anyway, that it might end on its own first is not a problem.
! */
! if (proc == NULL)
{
/*
! * This is just a warning so a loop-through-resultset will not abort
! * if one backend terminated on its own during the run.
*/
! ereport(WARNING,
! (errmsg("PID %d is not a PostgreSQL server process", pid)));
! return SIGNAL_BACKEND_ERROR;
}
! if (!superuser())
{
/*
! * Since the user is not superuser, check for matching roles.
*/
! if (proc->roleId != GetUserId())
! return SIGNAL_BACKEND_NOPERMISSION;
}
+
/*
* Can the process we just validated above end, followed by the pid being
* recycled for a new process, before reaching here? Then we'd be trying