]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] sparc64 compat annotations
authorAlexander Viro <viro@parcelfarce.linux.theplanet.co.uk>
Wed, 2 Feb 2005 05:21:39 +0000 (21:21 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 2 Feb 2005 05:21:39 +0000 (21:21 -0800)
same story as for amd64 - ptr_to_compat() + normal __user annotations

Signed-off-by: Al Viro <viro@parcelfarce.linux.theplanet.co.uk>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/sparc64/kernel/process.c
arch/sparc64/kernel/signal32.c
arch/sparc64/kernel/sparc64_ksyms.c
arch/sparc64/kernel/sys_sparc32.c
arch/sparc64/kernel/sys_sunos32.c
include/asm-sparc64/compat.h

index 54d7bacf248f8cd85ec0fe87584a88279d5fe0a8..cb343d66d0c3d4e830665aca381ab5248ad13c8a 100644 (file)
@@ -167,7 +167,7 @@ static void show_regwindow32(struct pt_regs *regs)
        mm_segment_t old_fs;
        
        __asm__ __volatile__ ("flushw");
-       rw = (struct reg_window32 __user *)((long)(unsigned)regs->u_regs[14]);
+       rw = compat_ptr((unsigned)regs->u_regs[14]);
        old_fs = get_fs();
        set_fs (USER_DS);
        if (copy_from_user (&r_w, rw, sizeof(r_w))) {
index 4ea1cb93d7ae3e375e29f7c6c26f326221c79758..4b060cacf9959739963fc1053a6d726727a937ee 100644 (file)
@@ -194,7 +194,7 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
                case __SI_FAULT >> 16:
                case __SI_POLL >> 16:
                        err |= __put_user(from->si_trapno, &to->si_trapno);
-                       err |= __put_user((long)from->si_addr, &to->si_addr);
+                       err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
                        break;
                case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
                case __SI_MESGQ >> 16:
@@ -275,7 +275,7 @@ asmlinkage void do_rt_sigsuspend32(u32 uset, size_t sigsetsize, struct pt_regs *
                regs->u_regs[UREG_I0] = EINVAL;
                return;
        }
-       if (copy_from_user(&set32, (void __user *)(long)uset, sizeof(set32))) {
+       if (copy_from_user(&set32, compat_ptr(uset), sizeof(set32))) {
                regs->tstate |= TSTATE_ICARRY;
                regs->u_regs[UREG_I0] = EFAULT;
                return;
@@ -720,9 +720,9 @@ setup_frame32(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *o
                        sig_address = NULL;
                }
        }
-       err |= __put_user((long)sig_address, &sframep->sig_address);
+       err |= __put_user(ptr_to_compat(sig_address), &sframep->sig_address);
        err |= __put_user(sig_code, &sframep->sig_code);
-       err |= __put_user((u64)sc, &sframep->sig_scptr);
+       err |= __put_user(ptr_to_compat(sc), &sframep->sig_scptr);
        if (err)
                goto sigsegv;
 
@@ -968,7 +968,7 @@ setup_svr4_frame32(struct sigaction *sa, unsigned long pc, unsigned long npc,
        /* Save the currently window file: */
 
        /* 1. Link sfp->uc->gwins to our windows */
-       err |= __put_user((u32)(long)gw, &mc->gwin);
+       err |= __put_user(ptr_to_compat(gw), &mc->gwin);
            
        /* 2. Number of windows to restore at setcontext (): */
        err |= __put_user(get_thread_wsaved(), &gw->count);
@@ -1448,10 +1448,12 @@ asmlinkage long do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp)
        u32 u_ss_sp = 0;
        int ret;
        mm_segment_t old_fs;
+       stack_t32 __user *uss32 = compat_ptr(ussa);
+       stack_t32 __user *uoss32 = compat_ptr(uossa);
        
-       if (ussa && (get_user(u_ss_sp, &((stack_t32 __user *)(long)ussa)->ss_sp) ||
-                   __get_user(uss.ss_flags, &((stack_t32 __user *)(long)ussa)->ss_flags) ||
-                   __get_user(uss.ss_size, &((stack_t32 __user *)(long)ussa)->ss_size)))
+       if (ussa && (get_user(u_ss_sp, &uss32->ss_sp) ||
+                   __get_user(uss.ss_flags, &uss32->ss_flags) ||
+                   __get_user(uss.ss_size, &uss32->ss_size)))
                return -EFAULT;
        uss.ss_sp = compat_ptr(u_ss_sp);
        old_fs = get_fs();
@@ -1459,9 +1461,9 @@ asmlinkage long do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp)
        ret = do_sigaltstack(ussa ? (stack_t __user *) &uss : NULL,
                             uossa ? (stack_t __user *) &uoss : NULL, sp);
        set_fs(old_fs);
-       if (!ret && uossa && (put_user((long)uoss.ss_sp, &((stack_t32 __user *)(long)uossa)->ss_sp) ||
-                   __put_user(uoss.ss_flags, &((stack_t32 __user *)(long)uossa)->ss_flags) ||
-                   __put_user(uoss.ss_size, &((stack_t32 __user *)(long)uossa)->ss_size)))
+       if (!ret && uossa && (put_user(ptr_to_compat(uoss.ss_sp), &uoss32->ss_sp) ||
+                   __put_user(uoss.ss_flags, &uoss32->ss_flags) ||
+                   __put_user(uoss.ss_size, &uoss32->ss_size)))
                return -EFAULT;
        return ret;
 }
index 6b7ef23b99e5d5225c6da7b95ce3a9a5291acca6..4562fedcb6f64bb2b0fe4364b950b607221d06e3 100644 (file)
@@ -86,7 +86,7 @@ extern int svr4_getcontext(svr4_ucontext_t *uc, struct pt_regs *regs);
 extern int svr4_setcontext(svr4_ucontext_t *uc, struct pt_regs *regs);
 extern int compat_sys_ioctl(unsigned int fd, unsigned int cmd, u32 arg);
 extern int (*handle_mathemu)(struct pt_regs *, struct fpustate *);
-extern long sparc32_open(const char * filename, int flags, int mode);
+extern long sparc32_open(const char __user * filename, int flags, int mode);
 extern int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long offset, unsigned long size, pgprot_t prot, int space);
 extern void (*prom_palette)(int);
 
index fe2510dc57ba1e1b9beda27a0dacfc2a89d5f550..47716ef702ccfcf1bbb77c529b19001f905c3824 100644 (file)
@@ -1090,8 +1090,8 @@ asmlinkage long compat_sys_sigaction(int sig, struct old_sigaction32 __user *act
         ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
 
        if (!ret && oact) {
-               ret = put_user((long)old_ka.sa.sa_handler, &oact->sa_handler);
-               ret |= __put_user((long)old_ka.sa.sa_restorer, &oact->sa_restorer);
+               ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler);
+               ret |= __put_user(ptr_to_compat(old_ka.sa.sa_restorer), &oact->sa_restorer);
                ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
                ret |= __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
         }
@@ -1147,10 +1147,10 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
                case 2: set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32); set32.sig[2] = old_ka.sa.sa_mask.sig[1];
                case 1: set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32); set32.sig[0] = old_ka.sa.sa_mask.sig[0];
                }
-               ret = put_user((long)old_ka.sa.sa_handler, &oact->sa_handler);
+               ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler);
                ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t));
                ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-               ret |= __put_user((long)old_ka.sa.sa_restorer, &oact->sa_restorer);
+               ret |= __put_user(ptr_to_compat(old_ka.sa.sa_restorer), &oact->sa_restorer);
                if (ret)
                        ret = -EFAULT;
         }
index 2571a279326f45cd29a2bfe43f80a06eef3f779c..d0592ed54ea5699c77251e09d23fc595bc865d93 100644 (file)
@@ -1177,11 +1177,11 @@ asmlinkage int sunos_shmsys(int op, u32 arg1, u32 arg2, u32 arg3)
        return rval;
 }
 
-extern asmlinkage long sparc32_open(const char * filename, int flags, int mode);
+extern asmlinkage long sparc32_open(const char __user * filename, int flags, int mode);
 
 asmlinkage int sunos_open(u32 fname, int flags, int mode)
 {
-       const char *filename = (const char *)(long)fname;
+       const char __user *filename = compat_ptr(fname);
 
        return sparc32_open(filename, flags, mode);
 }
@@ -1294,7 +1294,7 @@ asmlinkage int sunos_sigaction (int sig,
 
        if (!ret && oact) {
                old_ka.sa.sa_flags ^= SUNOS_SV_INTERRUPT;
-               if (put_user((long)old_ka.sa.sa_handler, &oact->sa_handler) ||
+               if (put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler) ||
                    __put_user(old_ka.sa.sa_flags, &oact->sa_flags))
                        return -EFAULT;
                __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
index 874b136ded9081747f292c510f586de129028547..e26d7d85c55a97ffe66609bee525dd37f15856e6 100644 (file)
@@ -121,6 +121,11 @@ static inline void __user *compat_ptr(compat_uptr_t uptr)
        return (void __user *)(unsigned long)uptr;
 }
 
+static inline compat_uptr_t ptr_to_compat(void __user *uptr)
+{
+       return (u32)(unsigned long)uptr;
+}
+
 static __inline__ void __user *compat_alloc_user_space(long len)
 {
        struct pt_regs *regs = current_thread_info()->kregs;