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 6af1210..e023d4a 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -2106,7 +2106,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); ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ User-mode-linux-user mailing list User-mode-linux-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/user-mode-linux-user