Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / sparc64 / kernel / sys_sunos32.c
index ace96ee..058a6a7 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/types.h>
+#include <linux/capability.h>
 #include <linux/compat.h>
 #include <linux/mman.h>
 #include <linux/mm.h>
@@ -34,6 +35,7 @@
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/syscalls.h>
+#include <linux/vs_cvirt.h>
 
 #include <asm/uaccess.h>
 #include <asm/page.h>
@@ -142,7 +144,7 @@ asmlinkage int sunos_brk(u32 baddr)
        }
        /* Check against rlimit and stack.. */
        retval = -ENOMEM;
-       rlim = current->rlim[RLIMIT_DATA].rlim_cur;
+       rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
        if (rlim >= RLIM_INFINITY)
                rlim = ~0;
        if (brk - current->mm->end_code > rlim)
@@ -291,7 +293,8 @@ static int sunos_filldir(void * __buf, const char * name, int namlen,
        put_user(ino, &dirent->d_ino);
        put_user(namlen, &dirent->d_namlen);
        put_user(reclen, &dirent->d_reclen);
-       copy_to_user(dirent->d_name, name, namlen);
+       if (copy_to_user(dirent->d_name, name, namlen))
+               return -EFAULT;
        put_user(0, dirent->d_name + namlen);
        dirent = (void __user *) dirent + reclen;
        buf->curr = dirent;
@@ -371,7 +374,8 @@ static int sunos_filldirentry(void * __buf, const char * name, int namlen,
        put_user(ino, &dirent->d_ino);
        put_user(namlen, &dirent->d_namlen);
        put_user(reclen, &dirent->d_reclen);
-       copy_to_user(dirent->d_name, name, namlen);
+       if (copy_to_user(dirent->d_name, name, namlen))
+               return -EFAULT;
        put_user(0, dirent->d_name + namlen);
        dirent = (void __user *) dirent + reclen;
        buf->curr = dirent;
@@ -434,18 +438,20 @@ struct sunos_utsname {
 asmlinkage int sunos_uname(struct sunos_utsname __user *name)
 {
        int ret;
+       struct new_utsname *ptr;
 
        down_read(&uts_sem);
-       ret = copy_to_user(&name->sname[0], &system_utsname.sysname[0],
+       ptr = vx_new_utsname();
+       ret = copy_to_user(&name->sname[0], ptr->sysname,
                           sizeof(name->sname) - 1);
-       ret |= copy_to_user(&name->nname[0], &system_utsname.nodename[0],
+       ret |= copy_to_user(&name->nname[0], ptr->nodename,
                            sizeof(name->nname) - 1);
        ret |= put_user('\0', &name->nname[8]);
-       ret |= copy_to_user(&name->rel[0], &system_utsname.release[0],
+       ret |= copy_to_user(&name->rel[0], ptr->release,
                            sizeof(name->rel) - 1);
-       ret |= copy_to_user(&name->ver[0], &system_utsname.version[0],
+       ret |= copy_to_user(&name->ver[0], ptr->version,
                            sizeof(name->ver) - 1);
-       ret |= copy_to_user(&name->mach[0], &system_utsname.machine[0],
+       ret |= copy_to_user(&name->mach[0], ptr->machine,
                            sizeof(name->mach) - 1);
        up_read(&uts_sem);
        return (ret ? -EFAULT : 0);
@@ -852,7 +858,7 @@ asmlinkage s32 sunos_sysconf (int name)
                ret = ARG_MAX;
                break;
        case _SC_CHILD_MAX:
-               ret = CHILD_MAX;
+               ret = -1; /* no limit */
                break;
        case _SC_CLK_TCK:
                ret = HZ;
@@ -1175,11 +1181,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);
 }
@@ -1292,7 +1298,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);