linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [patch] ptrace: unlocked access to last_siginfo (resending)
@ 2005-01-12  3:11 pmeda
  2005-01-14  7:46 ` Roland McGrath
  0 siblings, 1 reply; 5+ messages in thread
From: pmeda @ 2005-01-12  3:11 UTC (permalink / raw)
  To: akpm; +Cc: linux-mm, roland

Since Roland changed now to wakeup tracee with kill, I guess this needs to be fixed.
http://linus.bkbits.net:8080/linux-2.5/gnupatch@41e3fe5fIRH-W3aDnXZgfQ-qIvuXYg

ptrace_setsiginfo/ptrace_getsiginfo need to do locked access
to last_siginfo.  ptrace_notify()/ptrace_stop() sets the
current->last_siginfo and sleeps on schedule(). It can be waked
up by kill signal from signal_wake_up before debugger wakes it up.
On return from schedule(), the current->last_siginfo is reset.

Signed-off-by: Prasanna Meda <pmeda@akamai.com>


--- a/kernel/ptrace.c	Fri Nov 19 18:27:26 2004
+++ b/kernel/ptrace.c	Fri Nov 19 18:52:52 2004
@@ -303,18 +303,33 @@
 
 static int ptrace_getsiginfo(struct task_struct *child, siginfo_t __user * data)
 {
-	if (child->last_siginfo == NULL)
-		return -EINVAL;
-	return copy_siginfo_to_user(data, child->last_siginfo);
+	siginfo_t lastinfo;
+
+	spin_lock_irq(&child->sighand->siglock);
+	if (likely(child->last_siginfo != NULL)) {
+		memcpy(&lastinfo, child->last_siginfo, sizeof (siginfo_t));
+		spin_unlock_irq(&child->sighand->siglock);
+		return copy_siginfo_to_user(data, &lastinfo);
+	}
+	spin_unlock_irq(&child->sighand->siglock);
+	return -EINVAL;
 }
 
 static int ptrace_setsiginfo(struct task_struct *child, siginfo_t __user * data)
 {
-	if (child->last_siginfo == NULL)
-		return -EINVAL;
-	if (copy_from_user(child->last_siginfo, data, sizeof (siginfo_t)) != 0)
+	siginfo_t newinfo;
+
+	if (copy_from_user(&newinfo, data, sizeof (siginfo_t)) != 0)
 		return -EFAULT;
-	return 0;
+
+	spin_lock_irq(&child->sighand->siglock);
+	if (likely(child->last_siginfo != NULL)) {
+		memcpy(child->last_siginfo, &newinfo, sizeof (siginfo_t));
+		spin_unlock_irq(&child->sighand->siglock);
+		return 0;
+	}
+	spin_unlock_irq(&child->sighand->siglock);
+	return -EINVAL;
 }
 
 int ptrace_request(struct task_struct *child, long request,
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"aart@kvack.org"> aart@kvack.org </a>

^ permalink raw reply	[flat|nested] 5+ messages in thread
* RE: [patch] ptrace: unlocked access to last_siginfo (resending)
@ 2005-01-27  6:30 Meda, Prasanna
  0 siblings, 0 replies; 5+ messages in thread
From: Meda, Prasanna @ 2005-01-27  6:30 UTC (permalink / raw)
  To: Roland McGrath; +Cc: akpm, linux-mm



>   That's correct.  Technically you don't need read_lock_irq, but just
>   spin_lock_irq, not that it really makes a difference.  Myself, I would
>   change that and also use struct assignment instead of memcpy.
>   But your patch is fine as it is.

Agreed, and I am going to preapre a patch based on your suggestions and
resend.

Thanks,
Prasanna
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"aart@kvack.org"> aart@kvack.org </a>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2005-01-27  6:30 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-01-12  3:11 [patch] ptrace: unlocked access to last_siginfo (resending) pmeda
2005-01-14  7:46 ` Roland McGrath
2005-01-27  3:36   ` Prasanna Meda
2005-01-27  3:40     ` Roland McGrath
2005-01-27  6:30 Meda, Prasanna

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox