From 79bc79b07c9c6f8ae9290704e9e503a9327fcbb2 Mon Sep 17 00:00:00 2001
From: "pageexec@freemail.hu" <pageexec@freemail.hu>
Date: Wed, 28 Jun 2006 20:44:16 +0200
Subject: [PATCH] small fix for not releasing the mmap semaphore in
 i386/arch_setup_additional_pages

the VDSO randomization code on i386 fails to release the mmap semaphore
if insert_vm_struct() fails.

[ Made the conditional unlikely. -- Linus ]

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
---
 arch/i386/kernel/sysenter.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

(limited to 'arch/i386')

diff --git a/arch/i386/kernel/sysenter.c b/arch/i386/kernel/sysenter.c
index c60419dee018..713ba39d32c6 100644
--- a/arch/i386/kernel/sysenter.c
+++ b/arch/i386/kernel/sysenter.c
@@ -148,8 +148,10 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack)
 	vma->vm_mm = mm;
 
 	ret = insert_vm_struct(mm, vma);
-	if (ret)
-		goto free_vma;
+	if (unlikely(ret)) {
+		kmem_cache_free(vm_area_cachep, vma);
+		goto up_fail;
+	}
 
 	current->mm->context.vdso = (void *)addr;
 	current_thread_info()->sysenter_return =
@@ -158,10 +160,6 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack)
 up_fail:
 	up_write(&mm->mmap_sem);
 	return ret;
-
-free_vma:
-	kmem_cache_free(vm_area_cachep, vma);
-	return ret;
 }
 
 const char *arch_vma_name(struct vm_area_struct *vma)
-- 
cgit v1.2.3