[PATCH] Save NVGPRS in 32-bit signal frame
authorDavid Woodhouse <dwmw2@infradead.org>
Thu, 24 Nov 2005 12:51:40 +0000 (12:51 +0000)
committerPaul Mackerras <paulus@samba.org>
Mon, 9 Jan 2006 03:50:45 +0000 (14:50 +1100)
Somehow this one slipped through the cracks; when we ended up in
do_signal() on a 32-bit kernel but without having the caller-saved
registers into the regs, we didn't set the TIF_SAVE_NVGPRS flag to
ensure they got saved later.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kernel/signal_32.c

index c9d02751127f5df709584e3b1ea21773b31ce8d9..d3f0b6d452fb71d906a56fd87980f65c229c5bda 100644 (file)
@@ -219,6 +219,15 @@ static inline int get_old_sigaction(struct k_sigaction *new_ka,
 static inline int save_general_regs(struct pt_regs *regs,
                struct mcontext __user *frame)
 {
+       if (!FULL_REGS(regs)) {
+               /* Zero out the unsaved GPRs to avoid information
+                  leak, and set TIF_SAVE_NVGPRS to ensure that the
+                  registers do actually get saved later. */
+               memset(&regs->gpr[14], 0, 18 * sizeof(unsigned long));
+               current_thread_info()->nvgprs_frame = &frame->mc_gregs;
+               set_thread_flag(TIF_SAVE_NVGPRS);
+       }
+
        return __copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE);
 }