Merge to Fedora kernel-2.6.7-1.494 and VServer 1.9.1.12. Fix some previous merge...
[linux-2.6.git] / arch / sparc64 / kernel / binfmt_aout32.c
index 4ba5d48..d2d37d9 100644 (file)
@@ -112,9 +112,9 @@ static int aout32_core_dump(long signr, struct pt_regs *regs, struct file *file)
 
 /* make sure we actually have a data and stack area to dump */
        set_fs(USER_DS);
-       if (verify_area(VERIFY_READ, (void *) START_DATA(dump), dump.u_dsize))
+       if (verify_area(VERIFY_READ, (void __user *) START_DATA(dump), dump.u_dsize))
                dump.u_dsize = 0;
-       if (verify_area(VERIFY_READ, (void *) START_STACK(dump), dump.u_ssize))
+       if (verify_area(VERIFY_READ, (void __user *) START_STACK(dump), dump.u_ssize))
                dump.u_ssize = 0;
 
        set_fs(KERNEL_DS);
@@ -147,31 +147,31 @@ end_coredump:
  * memory and creates the pointer tables from them, and puts their
  * addresses on the "stack", returning the new stack pointer value.
  */
-#define A(__x) ((unsigned long)(__x))
 
-static u32 *create_aout32_tables(char * p, struct linux_binprm * bprm)
+static u32 __user *create_aout32_tables(char __user *p, struct linux_binprm *bprm)
 {
-       u32 *argv, *envp;
-       u32 *sp;
+       u32 __user *argv;
+       u32 __user *envp;
+       u32 __user *sp;
        int argc = bprm->argc;
        int envc = bprm->envc;
 
-       sp = (u32 *) ((-(unsigned long)sizeof(char *)) & (unsigned long) p);
+       sp = (u32 __user *)((-(unsigned long)sizeof(char *))&(unsigned long)p);
 
        /* This imposes the proper stack alignment for a new process. */
-       sp = (u32 *) (((unsigned long) sp) & ~7);
+       sp = (u32 __user *) (((unsigned long) sp) & ~7);
        if ((envc+argc+3)&1)
                --sp;
 
        sp -= envc+1;
-       envp = (u32 *) sp;
+       envp = sp;
        sp -= argc+1;
-       argv = (u32 *) sp;
+       argv = sp;
        put_user(argc,--sp);
        current->mm->arg_start = (unsigned long) p;
        while (argc-->0) {
                char c;
-               put_user(((u32)A(p)),argv++);
+               put_user(((u32)(unsigned long)(p)),argv++);
                do {
                        get_user(c,p++);
                } while (c);
@@ -180,7 +180,7 @@ static u32 *create_aout32_tables(char * p, struct linux_binprm * bprm)
        current->mm->arg_end = current->mm->env_start = (unsigned long) p;
        while (envc-->0) {
                char c;
-               put_user(((u32)A(p)),envp++);
+               put_user(((u32)(unsigned long)(p)),envp++);
                do {
                        get_user(c,p++);
                } while (c);
@@ -239,7 +239,8 @@ static int load_aout32_binary(struct linux_binprm * bprm, struct pt_regs * regs)
        current->mm->brk = ex.a_bss +
                (current->mm->start_brk = N_BSSADDR(ex));
 
-       current->mm->rss = 0;
+       // current->mm->rss = 0;
+       vx_rsspages_sub(current->mm, current->mm->rss);
        current->mm->mmap = NULL;
        compute_creds(bprm);
        current->flags &= ~PF_FORKNOEXEC;
@@ -320,7 +321,7 @@ beyond_if:
        }
 
        current->mm->start_stack =
-               (unsigned long) create_aout32_tables((char *)bprm->p, bprm);
+               (unsigned long) create_aout32_tables((char __user *)bprm->p, bprm);
        if (!(orig_thr_flags & _TIF_32BIT)) {
                unsigned long pgd_cache;