Commit 76d523bc authored by Stéphane Eranian's avatar Stéphane Eranian Committed by David Mosberger

[PATCH] ia64: perfmon2 update

This patch fixes the following:

        - correct a bug in pfm_close() which was causing some per-process 
          sessions to not unreserve on exit.

        - changed the permission checking to load a context to allow more
          flexibility, modeled after ptrace_attach().
parent 9acd4172
...@@ -1975,8 +1975,6 @@ pfm_close(struct inode *inode, struct file *filp) ...@@ -1975,8 +1975,6 @@ pfm_close(struct inode *inode, struct file *filp)
PROTECT_CTX(ctx, flags); PROTECT_CTX(ctx, flags);
/* reload state, may have changed during opening of critical section */
state = ctx->ctx_state;
remove_wait_queue(&ctx->ctx_zombieq, &wait); remove_wait_queue(&ctx->ctx_zombieq, &wait);
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
...@@ -2005,6 +2003,10 @@ pfm_close(struct inode *inode, struct file *filp) ...@@ -2005,6 +2003,10 @@ pfm_close(struct inode *inode, struct file *filp)
} }
doit: /* cannot assume task is defined from now on */ doit: /* cannot assume task is defined from now on */
/* reload state, may have changed during opening of critical section */
state = ctx->ctx_state;
/* /*
* the context is still attached to a task (possibly current) * the context is still attached to a task (possibly current)
* we cannot destroy it right now * we cannot destroy it right now
...@@ -2037,7 +2039,7 @@ pfm_close(struct inode *inode, struct file *filp) ...@@ -2037,7 +2039,7 @@ pfm_close(struct inode *inode, struct file *filp)
DPRINT(("[%d] ctx_state=%d free_possible=%d vaddr=%p addr=%p size=%lu\n", DPRINT(("[%d] ctx_state=%d free_possible=%d vaddr=%p addr=%p size=%lu\n",
current->pid, current->pid,
ctx->ctx_state, state,
free_possible, free_possible,
smpl_buf_vaddr, smpl_buf_vaddr,
smpl_buf_addr, smpl_buf_addr,
...@@ -2362,10 +2364,23 @@ pfm_smpl_buffer_alloc(struct task_struct *task, pfm_context_t *ctx, unsigned lon ...@@ -2362,10 +2364,23 @@ pfm_smpl_buffer_alloc(struct task_struct *task, pfm_context_t *ctx, unsigned lon
static int static int
pfm_bad_permissions(struct task_struct *task) pfm_bad_permissions(struct task_struct *task)
{ {
/* stolen from bad_signal() */ /* inspired by ptrace_attach() */
return (current->session != task->session) DPRINT(("[%d] cur: uid=%d gid=%d task: euid=%d suid=%d uid=%d egid=%d sgid=%d\n",
&& (current->euid ^ task->suid) && (current->euid ^ task->uid) current->pid,
&& (current->uid ^ task->suid) && (current->uid ^ task->uid); current->uid,
current->gid,
task->euid,
task->suid,
task->uid,
task->egid,
task->sgid));
return ((current->uid != task->euid)
|| (current->uid != task->suid)
|| (current->uid != task->uid)
|| (current->gid != task->egid)
|| (current->gid != task->sgid)
|| (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE);
} }
static int static int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment