Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eaccbfa5 authored by Luiz Fernando N. Capitulino's avatar Luiz Fernando N. Capitulino Committed by Linus Torvalds
Browse files

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: default avatarLuiz Fernando N. Capitulino <lcapitulino@mandriva.com.br>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent bca1033b
Loading
Loading
Loading
Loading
+6 −14
Original line number Diff line number Diff line
@@ -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) {
	up_write(&mm->mmap_sem);
	bprm->vma = NULL;
	kmem_cache_free(vm_area_cachep, vma);
	}

	return err;
}