diff options
author | pageexec@freemail.hu <pageexec@freemail.hu> | 2006-06-28 20:44:16 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-28 12:05:50 -0700 |
commit | 79bc79b07c9c6f8ae9290704e9e503a9327fcbb2 (patch) | |
tree | 1e9b72b18d1605e8ea3fe72f9b992867a4697224 | |
parent | a39727f212426b9d5f9267b3318a2afaf9922d3b (diff) | |
download | op-kernel-dev-79bc79b07c9c6f8ae9290704e9e503a9327fcbb2.zip op-kernel-dev-79bc79b07c9c6f8ae9290704e9e503a9327fcbb2.tar.gz |
[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>
-rw-r--r-- | arch/i386/kernel/sysenter.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/arch/i386/kernel/sysenter.c b/arch/i386/kernel/sysenter.c index c60419de..713ba39 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) |