diff options
author | Andy Lutomirski <luto@amacapital.net> | 2014-05-14 19:23:13 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2014-05-21 19:14:04 -0400 |
commit | 368b69a5b010cb00fc9ea04d588cff69af1a1359 (patch) | |
tree | b66ede1750aac2feee6d6ea6163154afff13230b | |
parent | 4b660a7f5c8099d88d1a43d8ae138965112592c7 (diff) |
x86, vdso: Fix an OOPS accessing the HPET mapping w/o an HPET
The oops can be triggered in qemu using -no-hpet (but not nohpet) by
running a 32-bit program and reading a couple of pages before the vdso.
This should send SIGBUS instead of OOPSing.
The bug was introduced by:
commit 7a59ed415f5b57469e22e41fc4188d5399e0b194
Author: Stefani Seibold <stefani@seibold.net>
Date: Mon Mar 17 23:22:09 2014 +0100
x86, vdso: Add 32 bit VDSO time support for 32 bit kernel
which is new in 3.15.
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Link: http://lkml.kernel.org/r/e99025d887d6670b6c4d81e6ccfeeb83770b21e9.1400109621.git.luto@amacapital.net
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r-- | arch/x86/vdso/vdso32-setup.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/x86/vdso/vdso32-setup.c b/arch/x86/vdso/vdso32-setup.c index e1f220e3ca68..310c5f0dbef1 100644 --- a/arch/x86/vdso/vdso32-setup.c +++ b/arch/x86/vdso/vdso32-setup.c | |||
@@ -155,6 +155,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
155 | unsigned long addr; | 155 | unsigned long addr; |
156 | int ret = 0; | 156 | int ret = 0; |
157 | struct vm_area_struct *vma; | 157 | struct vm_area_struct *vma; |
158 | static struct page *no_pages[] = {NULL}; | ||
158 | 159 | ||
159 | #ifdef CONFIG_X86_X32_ABI | 160 | #ifdef CONFIG_X86_X32_ABI |
160 | if (test_thread_flag(TIF_X32)) | 161 | if (test_thread_flag(TIF_X32)) |
@@ -193,7 +194,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
193 | addr - VDSO_OFFSET(VDSO_PREV_PAGES), | 194 | addr - VDSO_OFFSET(VDSO_PREV_PAGES), |
194 | VDSO_OFFSET(VDSO_PREV_PAGES), | 195 | VDSO_OFFSET(VDSO_PREV_PAGES), |
195 | VM_READ, | 196 | VM_READ, |
196 | NULL); | 197 | no_pages); |
197 | 198 | ||
198 | if (IS_ERR(vma)) { | 199 | if (IS_ERR(vma)) { |
199 | ret = PTR_ERR(vma); | 200 | ret = PTR_ERR(vma); |