This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / fs / binfmt_elf.c
index fb98fce..e7e288d 100644 (file)
@@ -190,7 +190,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec,
        NEW_AUX_ENT(AT_EGID, (elf_addr_t) tsk->egid);
        NEW_AUX_ENT(AT_SECURE, (elf_addr_t) security_bprm_secureexec(bprm));
        if (k_platform) {
-               NEW_AUX_ENT(AT_PLATFORM, (elf_addr_t)(unsigned long)u_platform);
+               NEW_AUX_ENT(AT_PLATFORM, (elf_addr_t)(long)u_platform);
        }
        if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
                NEW_AUX_ENT(AT_EXECFD, (elf_addr_t) bprm->interp_data);
@@ -226,8 +226,8 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec,
        if (interp_aout) {
                argv = sp + 2;
                envp = argv + argc + 1;
-               __put_user((elf_addr_t)(unsigned long)argv, sp++);
-               __put_user((elf_addr_t)(unsigned long)envp, sp++);
+               __put_user((elf_addr_t)(long)argv, sp++);
+               __put_user((elf_addr_t)(long)envp, sp++);
        } else {
                argv = sp;
                envp = argv + argc + 1;
@@ -529,7 +529,7 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
        struct exec interp_ex;
        char passed_fileno[6];
        struct files_struct *files;
-       int have_pt_gnu_stack, executable_stack, relocexec, old_relocexec = current->flags & PF_RELOCEXEC;
+       int executable_stack, relocexec, old_relocexec = current->flags & PF_RELOCEXEC;
        unsigned long def_flags = 0;
        
        /* Get the exec-header */
@@ -666,7 +666,8 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
                                executable_stack = EXSTACK_DISABLE_X;
                        break;
                }
-       have_pt_gnu_stack = (i < elf_ex.e_phnum);
+       if (i == elf_ex.e_phnum)
+               def_flags |= VM_EXEC | VM_MAYEXEC;
 
        relocexec = 0;
 
@@ -761,20 +762,22 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
        current->mm->end_data = 0;
        current->mm->end_code = 0;
        current->mm->mmap = NULL;
+#ifdef __HAVE_ARCH_MMAP_TOP
+       current->mm->mmap_top = mmap_top();
+#endif
        current->flags &= ~PF_FORKNOEXEC;
        current->mm->def_flags = def_flags;
 
        /* Do this immediately, since STACK_TOP as used in setup_arg_pages
           may depend on the personality.  */
        SET_PERSONALITY(elf_ex, ibcs2_interpreter);
-       if (elf_read_implies_exec(elf_ex, have_pt_gnu_stack))
-               current->personality |= READ_IMPLIES_EXEC;
 
        /* Do this so that we can load the interpreter, if need be.  We will
           change some of these later */
        // current->mm->rss = 0;
        vx_rsspages_sub(current->mm, current->mm->rss);
-       current->mm->free_area_cache = current->mm->mmap_base;
+       current->mm->free_area_cache = TASK_UNMAPPED_BASE;
+       current->mm->non_executable_cache = current->mm->mmap_top;
        retval = setup_arg_pages(bprm, executable_stack);
        if (retval < 0) {
                send_sig(SIGKILL, current, 0);