|
|
| |
down_write(&mm->mmap_sem); | down_write(&mm->mmap_sem); |
{ | { |
|
struct vm_area_struct *vma; |
mpnt->vm_mm = mm; | mpnt->vm_mm = mm; |
#ifdef CONFIG_STACK_GROWSUP | #ifdef CONFIG_STACK_GROWSUP |
mpnt->vm_start = stack_base; | mpnt->vm_start = stack_base; |
|
|
mpnt->vm_flags = VM_STACK_FLAGS; | mpnt->vm_flags = VM_STACK_FLAGS; |
mpnt->vm_flags |= mm->def_flags; | mpnt->vm_flags |= mm->def_flags; |
mpnt->vm_page_prot = protection_map[mpnt->vm_flags & 0x7]; | mpnt->vm_page_prot = protection_map[mpnt->vm_flags & 0x7]; |
|
vma = find_vma(mm, mpnt->vm_start); |
|
if (vma) { |
|
up_write(&mm->mmap_sem); |
|
kmem_cache_free(vm_area_cachep, mpnt); |
|
return -ENOMEM; |
|
} |
insert_vm_struct(mm, mpnt); | insert_vm_struct(mm, mpnt); |
mm->stack_vm = mm->total_vm = vma_pages(mpnt); | mm->stack_vm = mm->total_vm = vma_pages(mpnt); |
} | } |
|
|
.min_coredump = PAGE_SIZE | .min_coredump = PAGE_SIZE |
}; | }; |
| |
static void set_brk(unsigned long start, unsigned long end) |
#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE) |
|
|
|
static int set_brk(unsigned long start, unsigned long end) |
{ | { |
start = PAGE_ALIGN(start); | start = PAGE_ALIGN(start); |
end = PAGE_ALIGN(end); | end = PAGE_ALIGN(end); |
if (end <= start) |
if (end > start) { |
return; |
unsigned long addr = do_brk(start, end - start); |
do_brk(start, end - start); |
if (BAD_ADDR(addr)) |
|
return addr; |
|
} |
|
return 0; |
} | } |
| |
/* | /* |
|
|
beyond_if: | beyond_if: |
set_binfmt(&aout_format); | set_binfmt(&aout_format); |
| |
set_brk(current->mm->start_brk, current->mm->brk); |
retval = set_brk(current->mm->start_brk, current->mm->brk); |
|
if (retval < 0) { |
|
send_sig(SIGKILL, current, 0); |
|
return retval; |
|
} |
| |
retval = setup_arg_pages(bprm, EXSTACK_DEFAULT); | retval = setup_arg_pages(bprm, EXSTACK_DEFAULT); |
if (retval < 0) { | if (retval < 0) { |