From: Jeff D. <jd...@ad...> - 2008-01-28 21:38:34
|
copy_siginfo_to_user correctly strips off the high bits of si->si_code before copying it to userspace. Unfortunately, ptrace32_siginfo calls copy_siginfo_to_user to put the siginfo into a temporary userspace buffer and counts on the high bits still being present so that it may initialize the union in the final 32-bit siginfo. This patch works around this problem by having copy_siginfo_to_user copy si->si_code intact to userspace. This introduces a bug in native 64-bit PTRACE_GETSIGINFO, but I haven't noticed anything being bothered by it. diff --git a/kernel/signal.c b/kernel/signal.c index 1e067a1..28813b1 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -2088,7 +2088,7 @@ int copy_siginfo_to_user(siginfo_t __user *to, siginfo_t *from) */ err = __put_user(from->si_signo, &to->si_signo); err |= __put_user(from->si_errno, &to->si_errno); - err |= __put_user((short)from->si_code, &to->si_code); + err |= __put_user(from->si_code, &to->si_code); switch (from->si_code & __SI_MASK) { case __SI_KILL: err |= __put_user(from->si_pid, &to->si_pid); |