From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751490AbdA0VUW (ORCPT ); Fri, 27 Jan 2017 16:20:22 -0500 Received: from mail-db5eur01on0124.outbound.protection.outlook.com ([104.47.2.124]:35552 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751442AbdA0VSr (ORCPT ); Fri, 27 Jan 2017 16:18:47 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, Dmitry Safonov , "Thomas Gleixner" , Ingo Molnar , "H. Peter Anvin" , Andy Lutomirski , Borislav Petkov , , Subject: [PATCHv3 3/5] x86/mm: fix 32-bit mmap() for 64-bit ELF Date: Sat, 28 Jan 2017 00:00:27 +0300 Message-ID: <20170127210029.31566-4-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170127210029.31566-1-dsafonov@virtuozzo.com> References: <20170127210029.31566-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1PR07CA0097.eurprd07.prod.outlook.com (10.165.229.151) To DB6PR0801MB1735.eurprd08.prod.outlook.com (10.169.226.150) X-MS-Office365-Filtering-Correlation-Id: e8fe6cfa-42b8-499e-a50e-08d446f79168 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:DB6PR0801MB1735; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;3:6STrnm6RdyW9rUtmbICqPvJlOyo+im/RyaDTmHYjftCyiR/EZpsICYyShX7H6z5U3STcqIT9DSsXwgvxKfNLNliiZtYsEVHJvHJ6yuMzDdn7yJu/WjmNfWl7US9BgJAqJxXcgWijNPsWMeeEyDfwzLHIX8ykSq6MYWjM9oQmD1M9w8nqXDSJUySEo5KP8o6M+4gUIFBbLYF8ETAUfKC3ds3lIA+VVj9JKre3/s2X7eTc3dpSTI8hwY5MJ/1pr2KTh4pDKKS4OWHXQb78AoVBFA== X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;25:bgNCHwFM8n1dRUJ2LdV8NItiTI98Lgvv6T1g3F8ra3zSinjRe8Tw9MBerWzuIm8sgEwZTpQOc5QxNau047nX1EcEScukLkzn8nzBLvPWRZcKDj8aMnLQJFEVkmj8v6L/PQjfqxL1qyQoR5zL8XLRK1+0UlbcLzTOvD/+McRqLUPbDhshVxJh7Zo4Qo2AbgNa/sJxe0NlR0nEo8lAk7tqtxUTy+sH3oIOm5iW262uTGMkM3rBAANIMUNaYg82LCmEC46MW/f6pv8k/YRwVNeBc1tFYP09FVllLtJzAzz6aFk11VvQZZH+WcO/s0QCkZuCWXdr4IaiDEpNrWmjN2oMHOekRMJu6s7BXFVWDjdCVKLSHv2wvtUli3olB1yVml2QRTT/x+528sxicwUW2eq4RA/Ph2YJhiTF7Hzv0PZjz7lxmT5Y6oXzqFAJEFnnpSpxUoUl2KmwXbMnX4UbhrSwupOBeZrxhhltzJtV+N9fRzemgWEV839eHLC7+ijqOuF1nRwyjkIa15ElAwThJ8IczPmXWxEQ2fttxrVZORDbsLy7h8K24knWDNGVQIakJ+TAgvgbB10pHZEZtzthZf7fB9XqlgR7u+/jXuc+et+ejwiiy9nS8/RjMtj922KN4aGzYIPuXhi31IYnH4RCH/uCzUhvcov0CqkCEUJh0ohLl6qzro54pOoNTJE2qAoe6R4y X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;31:0CkkWhQWtWWHjOm5uM5Nc9RvHnP+h4th7dfUDat6f4+ErdsPk+vLvEMqwNmLdHCu6tccLaGD79lHz08lZu79t71PflaVjKrLP4PlkEsW/Ydf+8Ysn2lpwFk9ZNe0lEAuMXlngDEWpd1aDBFa1S5XOBvXBo5mrA6MJagYNTTza+K2LiOhitjpeUDbndhbFP91/NU+wBTDxLirQi3A/Mj+34Xp4vn3uNxQCg6CBKoWhJFrGRfw2pTW/P4QPQvdIfYHRBRhdHRuBAeah+0tX2Za4g==;20:jEHlXjypsAzFj1CUumWFIYAJ0LxE2RUfbvSMPTYNBe6UHJH2xqGa0P5IdVi246uaS2PjbrSitkgKIT645qr89fUSLlDT5OV0Rx4xlyzpcr/EeXHs7Kbr3A6LatdB9nlgHZYpzWYiQnO9jTePjlpliFGH6h0Vpa4u6Uyr/FXJtECHhu+jtFPYhHWFb4sHlScko6o9SrbAq9gmu6iTpQv5LFF95anEFJWjsK6X2fNvMEyA4rUWZpPLPdGnbCvE7B8X X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(278428928389397); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6041248)(20161123562025)(20161123555025)(20161123560025)(20161123564025)(6072148);SRVR:DB6PR0801MB1735;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1735; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;4:+7Z6U4HDXbuCSE17bzdYTUtF1Zq52DEBmeg/v/X2plOjUdkPrQqP6P1M3MvcUlk65W4Wz6xW5Dw9x5AGu6O6oaP5577y6bKZe7S1gTOdaBesSHJ2+VfX5Womqe226AdhgYPCrGqVl0jk1PsF7niCjVkGyU5PBwCoMp0M4gBdhZC6JxEt1b4KhKfCQZZQe+NzveXbhE1FTTVt93eOeRM9q64h7+JdBNw1AhQiUrEizKelv1jliMdsYSNgXjoPaKj5OEZ31xYhbPyld2giacqmpJg+gg5WrtLPTanGUElmQg7zBu8mOMHBxgc6JW0U1TBWj0RwY5qvCp3AqE0KsQBCxNY+mKOXBd8vZABXp0RPoGjwsRtD8dGfAmETJ7w4JL4lIcnnUEjtsPWmhAmeisFCtdwlBgAZBCT/8bv4+fCS8Zb0EFS9ZKYf1cskvtHAceDXUvK/o+XWK9Oo32duyk6nsC/aDAQb9Akpu4KJQzzZKj6HM6dt5w65wDJi4R26YNP2RH6sZ3x4XsatjEptyvuhI/sQJDJydMO98oN5Y3imf9dEGSOz5mDlAoLXL/8WoIXEC1Q1YBb57jVNVscSKmKmrxF0QFPWoESS50zD7F6kvizsZPMZU7xvBW+rElxBS4fk X-Forefront-PRVS: 0200DDA8BE X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39410400002)(39450400003)(39830400002)(189002)(199003)(81156014)(8676002)(81166006)(50226002)(5660300001)(69596002)(3846002)(5003940100001)(68736007)(6116002)(38730400001)(25786008)(39060400001)(53936002)(6506006)(6512007)(6486002)(54906002)(2950100002)(6666003)(6916009)(110136003)(50466002)(48376002)(36756003)(189998001)(76176999)(50986999)(97736004)(42186005)(86362001)(101416001)(53416004)(92566002)(1076002)(4326007)(47776003)(2906002)(305945005)(7736002)(66066001)(105586002)(33646002)(106356001)(2351001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0801MB1735;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0801MB1735;23:LczDf+il3qagpcCWA16VJVMdg//9QjCos/YYoXW?= =?us-ascii?Q?LV+7FglRCapWi6lwdlrRUBxU9hO2BJ3dBoeZkr0GsC31XKUyolKHDHL8Qx3K?= =?us-ascii?Q?Br3HZzUqTBOATz07yLNQI+BFRnQ5OBLr9Cblnvsw7O6Aw4TCuP38jRBjB+Rb?= =?us-ascii?Q?AFEKGg7LaxnY/tYJjGwZwVUICr9uGzrbdgmP98u/LA0Vu19CgYnEqoZ52tFP?= =?us-ascii?Q?eBaRP0hvIc4CUduhDE7r8xxC9vlfngfThC+AjTxpw3gWsiiPDlgpx+yA6eCj?= =?us-ascii?Q?tH2AZ0zoRQ3ei3OEgtY1Db9UzGfpKDdPsGV1VSPPNdGxZsKUEO/4ln0d9Hmy?= =?us-ascii?Q?NS22NbVuKITRvHVgjg3vDCiBBBoyQpQMJVnwDE4RDzYXpVIgg3tIRgjT0pN+?= =?us-ascii?Q?xuGjvqaMXRRvFDNIgNqe3vlLrys8HCtfhlVWWEbKVHXh6T5kNyWawVsPTEc+?= =?us-ascii?Q?cEGxy5A2R1sK7oNTKk6pu9AibEGh5eyYZYy0CcrDeGWoD5ziKfkLbzfHB4wm?= =?us-ascii?Q?uniVWkadst6fzR79UJfKOIwLYtR+NlcIfPCwogKJpLXqu2/NPZZx92uZ/Jii?= =?us-ascii?Q?whssxQjfeT2HXLqcqmD3t3OJYmRzP5ntNGl2PyKuXpzvBuOhdoUwYJtf7cMh?= =?us-ascii?Q?IN6CFzPl6bJ53+0WQZOE8b+IWrHN1j4f5OylJcPcO5YvpHPsiRAdeB46+1os?= =?us-ascii?Q?Dn7oFTgLTMf56DVVTZiDBJUAGSi1/EXmE19V9TSvI+tsKiTAm0ldWLPm9JVB?= =?us-ascii?Q?LjMKNTm7BgdZtqQATWqUnXUXNK2Y6zyZ1dM/fhyV7lhyx/LLXtJH2D4u63kv?= =?us-ascii?Q?x1PwRA+dA9JNam0cYpvF4tXuMQj9WEBUUFl8EM2RRORdQDQQxRC8D49Nsqbx?= =?us-ascii?Q?QfoMKBq156LBlWVNwqDcXTe0FswYVwtiu04LQvp3JGCgK6Bx+95cYjrK84sd?= =?us-ascii?Q?SZpsrGO/XHAiRysdZn/JSzMK+68eckhmjpW2QxwBqa5pALnFGt2VVZuREDzE?= =?us-ascii?Q?zgg4e3oCc9lPW9NB3Z0ZrOfgLfxJ0LQI7UyVz/+GPEpmEC0G+0TBhoDqZGhJ?= =?us-ascii?Q?Uj213XHx0xhfYLNG8Hv30cNGFu2qjftRGhQ91KPzXkms294jzUvr3PFW3g4y?= =?us-ascii?Q?4aERhNLKFMHWnpjmm3psjskFhRnNgHXdJVAjPlpHaILMUXRlUOmR+23Az7fT?= =?us-ascii?Q?rh0dEYKdn3OjZi4kNNt3WjjbhXf3cTaLyu7xg24HW3foLvtGRxUHWZFrh78b?= =?us-ascii?Q?atf7UbfdvKKgsPH6xbSNN9ptQfMweP4hHq4nlq4VP?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;6:OA0O4rJtqav1WsiJK24xUZLCE9vNa7N051BRL3VV9neehK1PG7N75WPI8kMskw39jdGmN3KS8LD/lhZHw6/j7lbr/GC4wfDXeI5KfPWGZNGUNdfR77x7DIJ+z92dYSta86FL1K0Z5ueAkXVKaHNSDjtFRhTtXzXFQLyKCEi/lB8BfqJhf6dwftGJuGU1B7vpRpZQ8GtKTEEPIHT54XLkIDuL4Df07WZCQOODfrE39hNju6tLesmm6PqVqjhbEKLkAbm9tyJIzxglc44qDz+/uyKbEhnc2EttEiDhC/ZnHWOdQeZXmZeQHRORQ9QtFioIZ5SDwu/IYZpfYIbNgAvO32r3/1srPkH3MkYruPrLZD6Bf/p5ALozlaX+z0I/kBV0E0vJv+Yw3xv/GcPebiIZIHmycGv+VU+L3ZAVDFVmNKA=;5:gAB8UjNVPzyWJqmCUeReDlAzf5uXVbQiE/7l6WPYTmpv30M+hgnZd57UUEd+VLlmroy7L/jW1qHjw7t2n1Ng5dqY7dbWRdmvXA/9l5R+w4/2Y6lOzLIlo3UkottTMK4V2Pa+h4jd9kH/9QwRLbWzhw==;24:0GqvA2QOTqaVum8XMwSFaEWFPN1MxfrBP4cWUuQTV8OITcv1GTVHyEixQxQrIe8664GbDQMXB7QCk7kSJqVb30naZD0Pl8uWKgBWSKBJmrk= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;7:FbfpcDqO8zedb3NXLZ18vYhDk7GixTIG8ztUlcxYDEphmTWVxgCVlfnm5RWc+MwhksT2/8PTX3gHeUJYaLZSLp4DRNQI+8WG/qOqHnqDTlUmIy4Vh6fvYAXhY884Ctag82fbZ29OW31ZR47ZS22JXTVrFRcL1egvr3gAn42U5Y58iOc5aP7U2bL3Fy+Obcb3tjIuzAWWoDJwEVCjVfpG3xj1lzKakP5nWqs/I1jTAgSrINHoqfx3rvSpmW02A6qaPHAB1P7Bg1ADVUNJkiAyuqi2K0Azm86W2kf/5rNaZ4HK3lIMj901Z32RxeOvRy6Tm+jcAADsvmZjUz+TMkY62Vo7MTNeGAPhbHlM5XzxDVkxW/2NT4Xi0zUNALP/APKRCZAv9wp5NUIFBt9/8/cvl4GJC1A6HByflUoqGh9Po5gKuF2Xp+Vj9H+GiSkeYS1TDYRSaHsIeBLXYSyeWpzS5w==;20:yAftDVcmSOCp32b2Jv4tBVB4/LamOS+bjkfgdT9DwywCnrgaXftWEuZoAHeXHPrkLKT9sDaCIrYLgvfdrBj4y1BQKlYO+qIBVEZfjGgVV9Sc0P79AHZt076zYmN6K4tcbGNf8oqx5dSfkcB1wavEAXH6ptYeoHENYMINj25D/ek= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jan 2017 21:00:46.5374 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1735 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fix 32-bit compat_sys_mmap() mapping VMA over 4Gb in 64-bit binaries and 64-bit sys_mmap() mapping VMA only under 4Gb in 32-bit binaries. Introduced new bases for compat syscalls in mm_struct: mmap_compat_base and mmap_compat_legacy_base for top-down and bottom-up allocations accordingly. Taught arch_get_unmapped_area{,_topdown}() to use the new mmap_bases in compat syscalls for high/low limits in vm_unmapped_area(). I discovered that bug on ZDTM tests for compat 32-bit C/R. Working compat sys_mmap() in 64-bit binaries is really needed for that purpose, as 32-bit applications are restored from 64-bit CRIU binary. Signed-off-by: Dmitry Safonov --- arch/Kconfig | 7 +++++++ arch/x86/Kconfig | 1 + arch/x86/kernel/sys_x86_64.c | 28 ++++++++++++++++++++++++---- arch/x86/mm/mmap.c | 27 ++++++++++++++++++++------- include/linux/mm_types.h | 5 +++++ 5 files changed, 57 insertions(+), 11 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index 99839c23d453..6bdca6d86855 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -671,6 +671,13 @@ config ARCH_MMAP_RND_COMPAT_BITS This value can be changed after boot using the /proc/sys/vm/mmap_rnd_compat_bits tunable +config HAVE_ARCH_COMPAT_MMAP_BASES + bool + help + If this is set, one program can do native and compatible syscall + mmap() on architecture. Thus kernel has different bases to + compute high and low virtual address limits for allocation. + config HAVE_COPY_THREAD_TLS bool help diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index e487493bbd47..b3acb836567a 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -102,6 +102,7 @@ config X86 select HAVE_ARCH_KMEMCHECK select HAVE_ARCH_MMAP_RND_BITS if MMU select HAVE_ARCH_MMAP_RND_COMPAT_BITS if MMU && COMPAT + select HAVE_ARCH_COMPAT_MMAP_BASES if MMU && COMPAT select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_TRANSPARENT_HUGEPAGE diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index a55ed63b9f91..90be0839441d 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -113,10 +114,19 @@ static void find_start_end(unsigned long flags, unsigned long *begin, if (current->flags & PF_RANDOMIZE) { *begin = randomize_page(*begin, 0x02000000); } - } else { - *begin = current->mm->mmap_legacy_base; - *end = TASK_SIZE; + return; } + +#ifdef CONFIG_COMPAT + if (in_compat_syscall()) { + *begin = current->mm->mmap_compat_legacy_base; + *end = IA32_PAGE_OFFSET; + return; + } +#endif + + *begin = current->mm->mmap_legacy_base; + *end = TASK_SIZE_MAX; } unsigned long @@ -157,6 +167,16 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return vm_unmapped_area(&info); } +static unsigned long find_top(void) +{ +#ifdef CONFIG_COMPAT + if (in_compat_syscall()) + return current->mm->mmap_compat_base; + else +#endif + return current->mm->mmap_base; +} + unsigned long arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, const unsigned long len, const unsigned long pgoff, @@ -190,7 +210,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, info.flags = VM_UNMAPPED_AREA_TOPDOWN; info.length = len; info.low_limit = PAGE_SIZE; - info.high_limit = mm->mmap_base; + info.high_limit = find_top(); info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; if (filp) { diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c index 98be520fd270..17b11ce07dcb 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c @@ -112,6 +112,16 @@ static unsigned long mmap_legacy_base(unsigned long rnd, * This function, called very early during the creation of a new * process VM image, sets up which VM layout function to use: */ +static void arch_pick_mmap_base(unsigned long *base, unsigned long *legacy_base, + unsigned long random_factor, unsigned long task_size) +{ + *legacy_base = mmap_legacy_base(random_factor, task_size); + if (mmap_is_legacy()) + *base = *legacy_base; + else + *base = mmap_base(random_factor, task_size); +} + void arch_pick_mmap_layout(struct mm_struct *mm) { unsigned long random_factor = 0UL; @@ -119,15 +129,18 @@ void arch_pick_mmap_layout(struct mm_struct *mm) if (current->flags & PF_RANDOMIZE) random_factor = arch_mmap_rnd(); - mm->mmap_legacy_base = mmap_legacy_base(random_factor, TASK_SIZE); - - if (mmap_is_legacy()) { - mm->mmap_base = mm->mmap_legacy_base; + if (mmap_is_legacy()) mm->get_unmapped_area = arch_get_unmapped_area; - } else { - mm->mmap_base = mmap_base(random_factor, TASK_SIZE); + else mm->get_unmapped_area = arch_get_unmapped_area_topdown; - } + + arch_pick_mmap_base(&mm->mmap_base, &mm->mmap_legacy_base, + random_factor, TASK_SIZE_MAX); + +#ifdef CONFIG_COMPAT + arch_pick_mmap_base(&mm->mmap_compat_base, &mm->mmap_compat_legacy_base, + random_factor, IA32_PAGE_OFFSET); +#endif } const char *arch_vma_name(struct vm_area_struct *vma) diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 808751d7b737..48274a84cebe 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -404,6 +404,11 @@ struct mm_struct { #endif unsigned long mmap_base; /* base of mmap area */ unsigned long mmap_legacy_base; /* base of mmap area in bottom-up allocations */ +#ifdef CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES + /* Base addresses for compatible mmap() */ + unsigned long mmap_compat_base; + unsigned long mmap_compat_legacy_base; +#endif unsigned long task_size; /* size of task vm space */ unsigned long highest_vm_end; /* highest vma end address */ pgd_t * pgd; -- 2.11.0