The commit is pushed to "branch-rh7-3.10.0-514.16.1.vz7.32.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after rh7-3.10.0-514.16.1.vz7.32.6 ------> commit fcae4a8d7fe6ed8ceef240232c92bd0fcaeab5d1 Author: Dmitry Safonov <dsafo...@virtuozzo.com> Date: Mon Jun 5 16:49:04 2017 +0400
vdso32: Fix monotonic time virtualization for ia32 Monotonic time virtualization by a typo initializes 64-bit vdso for 32-bit processes. vdso32.addr was never inited - do this also. In case of 32-bit CT (which we yet do not support) that leads to kernel oops and then panic (dereferencing not initialized uts_ns->vdso): [ 29.855267] BUG: unable to handle kernel paging request at ffffffffff700560 [ 29.855796] IP: [<ffffffff81077403>] __arch_setup_additional_pages.isra.2+0x293/0x370 [ 29.856743] Oops: 0002 [#1] SMP [ 29.865576] CPU: 3 PID: 12377 Comm: bash ve: 7fdc70c8-7457-46e1-a615-6642eb956b81 Not tainted 3.10.0-514.16.1.vz7.32.6 #1 32.6 [ 29.866338] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-20170228_101828-anatol 04/01/2014 [ 29.875894] Call Trace: [ 29.876095] [<ffffffff8107762a>] syscall32_setup_pages+0x6a/0xb0 [ 29.876579] [<ffffffff81277f84>] load_elf_binary+0xa44/0xe60 [ 29.877035] [<ffffffff81277540>] ? load_elf_library+0x250/0x250 [ 29.877522] [<ffffffff8121d165>] search_binary_handler+0xd5/0x300 [ 29.878032] [<ffffffff8121e7c5>] do_execve_common.isra.30+0x665/0x730 [ 29.878548] [<ffffffff8121eb29>] SyS_execve+0x29/0x30 [ 29.878976] [<ffffffff816929e9>] stub_execve+0x69/0xa0 In case of 64-bit CT with ia32 task that leads to overwriting 64-bit vdso with timespec. Fixes: e955ddcd0d2c ("ve/vdso: virtualized monotonic gettime through vdso") https://jira.sw.ru/browse/PSBM-66888 Signed-off-by: Dmitry Safonov <dsafo...@virtuozzo.com> Acked-by: Andrey Ryabinin <aryabi...@virtuozzo.com> --- arch/x86/vdso/vdso32-setup.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/x86/vdso/vdso32-setup.c b/arch/x86/vdso/vdso32-setup.c index 32c9a29..70e1cc4 100644 --- a/arch/x86/vdso/vdso32-setup.c +++ b/arch/x86/vdso/vdso32-setup.c @@ -399,8 +399,9 @@ static struct page **uts_prep_vdso_pages_locked(int map) copy_page(page_address(new_pages[0]), page_address(vdso32_pages[0])); addr = page_address(new_pages[0]); + uts_ns->vdso32.addr = addr; *((int *)(addr + uts_ns->vdso32.version_off)) = new_version; - *((struct timespec*)(VDSO32_SYMBOL(uts_ns->vdso.addr, ve_start_timespec))) = ve->start_timespec; + *((struct timespec*)(VDSO32_SYMBOL(uts_ns->vdso32.addr, ve_start_timespec))) = ve->start_timespec; smp_wmb(); pages = uts_ns->vdso32.pages = new_pages; _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel