Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] powerpc signal __user annotations

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 29e646df 5b1a43d7

+14 -13
+7 -11
arch/powerpc/kernel/signal_32.c
··· 142 142 return 0; 143 143 } 144 144 145 - static inline compat_uptr_t to_user_ptr(void *kp) 146 - { 147 - return (compat_uptr_t)(u64)kp; 148 - } 149 - 145 + #define to_user_ptr(p) ptr_to_compat(p) 150 146 #define from_user_ptr(p) compat_ptr(p) 151 147 152 148 static inline int save_general_regs(struct pt_regs *regs, ··· 209 213 return 0; 210 214 } 211 215 212 - #define to_user_ptr(p) (p) 213 - #define from_user_ptr(p) (p) 216 + #define to_user_ptr(p) ((unsigned long)(p)) 217 + #define from_user_ptr(p) ((void __user *)(p)) 214 218 215 219 static inline int save_general_regs(struct pt_regs *regs, 216 220 struct mcontext __user *frame) ··· 522 526 523 527 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); 524 528 if (!ret && oact) { 525 - ret = put_user((long)old_ka.sa.sa_handler, &oact->sa_handler); 529 + ret = put_user(to_user_ptr(old_ka.sa.sa_handler), &oact->sa_handler); 526 530 ret |= put_sigset_t(&oact->sa_mask, &old_ka.sa.sa_mask); 527 531 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); 528 532 } ··· 671 675 int compat_sys_sigaltstack(u32 __new, u32 __old, int r5, 672 676 int r6, int r7, int r8, struct pt_regs *regs) 673 677 { 674 - stack_32_t __user * newstack = (stack_32_t __user *)(long) __new; 675 - stack_32_t __user * oldstack = (stack_32_t __user *)(long) __old; 678 + stack_32_t __user * newstack = compat_ptr(__new); 679 + stack_32_t __user * oldstack = compat_ptr(__old); 676 680 stack_t uss, uoss; 677 681 int ret; 678 682 mm_segment_t old_fs; ··· 704 708 set_fs(old_fs); 705 709 /* Copy the stack information to the user output buffer */ 706 710 if (!ret && oldstack && 707 - (put_user((long)uoss.ss_sp, &oldstack->ss_sp) || 711 + (put_user(ptr_to_compat(uoss.ss_sp), &oldstack->ss_sp) || 708 712 __put_user(uoss.ss_flags, &oldstack->ss_flags) || 709 713 __put_user(uoss.ss_size, &oldstack->ss_size))) 710 714 return -EFAULT;
+2 -2
arch/powerpc/kernel/signal_64.c
··· 60 60 struct ucontext uc; 61 61 unsigned long _unused[2]; 62 62 unsigned int tramp[TRAMP_SIZE]; 63 - struct siginfo *pinfo; 64 - void *puc; 63 + struct siginfo __user *pinfo; 64 + void __user *puc; 65 65 struct siginfo info; 66 66 /* 64 bit ABI allows for 288 bytes below sp before decrementing it. */ 67 67 char abigap[288];
+5
include/asm-powerpc/compat.h
··· 126 126 return (void __user *)(unsigned long)uptr; 127 127 } 128 128 129 + static inline compat_uptr_t ptr_to_compat(void __user *uptr) 130 + { 131 + return (u32)(unsigned long)uptr; 132 + } 133 + 129 134 static inline void __user *compat_alloc_user_space(long len) 130 135 { 131 136 struct pt_regs *regs = current->thread.regs;