[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20090528113537.GA18678@redhat.com>
Date: Thu, 28 May 2009 13:35:37 +0200
From: Oleg Nesterov <oleg@...hat.com>
To: Roland McGrath <roland@...hat.com>
Cc: Christoph Hellwig <hch@...radead.org>, Ingo Molnar <mingo@...e.hu>,
linux-kernel@...r.kernel.org
Subject: [RFC PATCH 1/12 v2] ptrace: ptrace_signal: fix the usage of
->parent
This patch complicates the code to fix the pure theoretical problems.
But since we are going to change this code, it is better to fix them
anyway.
- If we are not traced any longer after ptrace_stop(), si_pid/si_uid
are not necessary right.
- It is not safe to dereference current->parent without tasklist or
RCU lock. The tracer can detach and exit. ->siglock can't prevent
this, and (in theory) local_irq_disable() doesn't imply RCU lock.
Hopefully this "signr != info->si_signo" code will go away eventually.
Signed-off-by: Oleg Nesterov <oleg@...hat.com>
--- PTRACE/kernel/signal.c~PTRACE_SIGNAL 2009-05-28 04:12:02.000000000 +0200
+++ PTRACE/kernel/signal.c 2009-05-28 04:14:38.000000000 +0200
@@ -1770,11 +1770,22 @@ static int ptrace_signal(int signr, sigi
specific in the siginfo structure then it should
have updated *info via PTRACE_SETSIGINFO. */
if (signr != info->si_signo) {
+ struct task_struct *tracer;
+
info->si_signo = signr;
info->si_errno = 0;
info->si_code = SI_USER;
- info->si_pid = task_pid_vnr(current->parent);
- info->si_uid = task_uid(current->parent);
+
+ rcu_read_lock();
+ tracer = current->parent;
+ if (task_ptrace(current)) {
+ info->si_pid = task_pid_vnr(tracer);
+ info->si_uid = task_uid(tracer);
+ } else {
+ info->si_pid = 0;
+ info->si_uid = 0;
+ }
+ rcu_read_unlock();
}
/* If the (new) signal is now blocked, requeue it. */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists