mirror of https://gitee.com/openkylin/linux.git
fs/exec.c:__bprm_mm_init(): clean up error handling
Untangle the error unwinding in this function, saving a test of local variable `vma'. Signed-off-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
bca1033b09
commit
eaccbfa564
20
fs/exec.c
20
fs/exec.c
|
@ -232,13 +232,13 @@ static void flush_arg_page(struct linux_binprm *bprm, unsigned long pos,
|
|||
|
||||
static int __bprm_mm_init(struct linux_binprm *bprm)
|
||||
{
|
||||
int err = -ENOMEM;
|
||||
int err;
|
||||
struct vm_area_struct *vma = NULL;
|
||||
struct mm_struct *mm = bprm->mm;
|
||||
|
||||
bprm->vma = vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
|
||||
if (!vma)
|
||||
goto err;
|
||||
return -ENOMEM;
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
vma->vm_mm = mm;
|
||||
|
@ -251,28 +251,20 @@ static int __bprm_mm_init(struct linux_binprm *bprm)
|
|||
*/
|
||||
vma->vm_end = STACK_TOP_MAX;
|
||||
vma->vm_start = vma->vm_end - PAGE_SIZE;
|
||||
|
||||
vma->vm_flags = VM_STACK_FLAGS;
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
err = insert_vm_struct(mm, vma);
|
||||
if (err) {
|
||||
up_write(&mm->mmap_sem);
|
||||
if (err)
|
||||
goto err;
|
||||
}
|
||||
|
||||
mm->stack_vm = mm->total_vm = 1;
|
||||
up_write(&mm->mmap_sem);
|
||||
|
||||
bprm->p = vma->vm_end - sizeof(void *);
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
if (vma) {
|
||||
bprm->vma = NULL;
|
||||
kmem_cache_free(vm_area_cachep, vma);
|
||||
}
|
||||
|
||||
up_write(&mm->mmap_sem);
|
||||
bprm->vma = NULL;
|
||||
kmem_cache_free(vm_area_cachep, vma);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue