From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751209AbdALKX7 (ORCPT ); Thu, 12 Jan 2017 05:23:59 -0500 Received: from mail-ve1eur01on0131.outbound.protection.outlook.com ([104.47.1.131]:45380 "EHLO EUR01-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750899AbdALKXz (ORCPT ); Thu, 12 Jan 2017 05:23:55 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; Subject: Re: [PATCH 1/2] x86/mm: don't mmap() over 4GB with compat syscall To: Andy Lutomirski References: <20170111181730.12458-1-dsafonov@virtuozzo.com> <20170111181730.12458-2-dsafonov@virtuozzo.com> CC: "linux-kernel@vger.kernel.org" , "Dmitry Safonov" <0x7f454c46@gmail.com>, Thomas Gleixner , "Ingo Molnar" , "H. Peter Anvin" , Andy Lutomirski , Borislav Petkov , X86 ML From: Dmitry Safonov Message-ID: Date: Thu, 12 Jan 2017 12:46:03 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1PR07CA0110.eurprd07.prod.outlook.com (10.165.229.164) To VI1PR0801MB1742.eurprd08.prod.outlook.com (10.168.67.20) X-MS-Office365-Filtering-Correlation-Id: 0e192eb0-7105-4b82-6493-08d43ad04a0a X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:VI1PR0801MB1742; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;3:gigCKnLlhHkGDTCcRZ5+Rh6Q+r+VN1D/qpmZIhjrR2Uk7EbhA6LiJeXfX8OFOFG0BYJZcW25cEUjhv781BA1Pn44S4k6vt9I5RxDGqgTN7y6t6AEJDd3jS7wQYshyCv2leJGf47aIX6OtkdPwm+Ew0EtAviK2CGEbzGR0b5tdeiCNWiY5ahUdSxSBB9/M8OJVEd7QOlMeYTNJj8X/WZY5nG3k1U3UiF1Uo2mNSpHZHKlLWSU7L76icIomzZKoJLHix0DnIJU3OCVDcuscFcfZw== X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;25:YhjCYrfzRndK7I082ywiKdQO1e43lnWGiTVu5KVL9OXMdYGc5uWnvksmwM56nc5kFERQckvGVPD8BjiGEpzZmVi60bzVdJO2nFJoDlqAXJv9M6HwKMPrFel9Z77+2FQfARmJ5GpPvAT3+6CE0qQxeOK6ZfKAQyw6BHtLXXTtCnd/42OJcMOIcgsfwRL5DKm+uC1gU9Iwj1L91ryy94XRJxhEdYMzw1l+sqihpyo0LswasGJaRXgJRMQqI34y2D/ZeBLcEQKIqlkkpHvL+rrvFOb0y5Ta3ivim5wjiwPp/skHcyxMkcjUONNWCDj//LAMzD+1falZWChg6LloO3Kf7Y68IriTj3CP4rUIIlk43KLexlfonb5P6XmNMxUDMLUAs59qoOG6oWrfvWudIkGkVJRBK8WmbzdeNqdtVjVBV42GBJXATM3SCJubhoCCChLEtszTODEhvHSp8f9e8SuDPUuvnAZdUxONoptovi/cZjW9Pde7OFwfmYddQ40o2e6gs/qMnrz+wRderneZFq8X57hFYavw0Of4sYf501kfpRVLu3eM+bLBFL0U5sQgNn6rKj9sfIMPZ3Rx0e2AMhCorNx4oqL+VXi1LLG2pB2bXgUfBnugmA2wnmtTljpjI1ggZvDvYwipuiI4te/W8DJ8XMOZg83RzxjScvPTtFLAVdATGZP5BDuwKJPrQWN0Hg2NKF8cp2cwkPiaRRKRxWQLronJoGUI3kecGHJV05seFq8FWHrd+sf9kEwpb/G5OMCXP+oBUryFt8iPN8q/ca4lKw== X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;31:c6Gza73dgVGksDIofV4oB2mUJb3Lq+z/3bN8tkpjp+2xXR3I6i5MWy/hYvJISkoH7ZHlKB0K8bg9lBjynytAelTECFp7WSfA96t7GCCRh+GgFPBQSIB0niEdxHr6iEoB5c6AioRVRPoVaUwRSA5QvJVwXOHLeHbK4CFOrD6ciKqswaKXXYcN6Qzge/kUm5mKUUvLRUchzHR/WlwS8oG0cPaPP34TyxQcfIwooBs+E/kDmGbDMNnhf9kq7CVtDnuP;20:2s8Ob9bzbw8BvG9Hf1+uRtj27aO2yV9U3eo4nhVOEPqW2Hs2Rfe0brALtuadX11clIVYaQrc9y3BAie3bR/4BFIgMODbGocvoN0l1vM880c7HZ+Sgfe+slVjxHpXw4Fa+odHW1o+RpLZs+XTSyCKFdBgLo46CQyLH4KQhk4wOHCZRLgH1cMsqegIfKfY6u4wXWUZ4ZD3eVaRCEGGlRL38uOVU0vCys13jpbFp+DJ50ZZnCAvLmn20sDQMquTthjK 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)(3002001)(10201501046)(6041248)(20161123562025)(20161123564025)(20161123558021)(20161123555025)(20161123560025)(6072148);SRVR:VI1PR0801MB1742;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0801MB1742; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;4:Jnr29FLBJgLNJ+BgTJFtOj+Yxf3QpzAq/PmLrfqhmYFgpC4d4j6iaF3VTy2biRm5Dl3WVfV+cj1kAviBbfkVugjNPqxhSdekbTs68QGPmwxfuZcj/R8744oqC9UDYCXt78dW7MD+EiC/si1WvoNshz/+YVVi95sr2TtAbqq/g/y85ISkZ2Sw93+xIUtUj3ZvHAJYegwR14qZlExZyFr1Fahnx1994lGS1HPAgULmAKjDhDLYTrdEfUtWdLkay/2eyf+O1ECwZw28yv9uRFz5sUagTz6qqtm7OuA81dVpzl0wpPm4pu85ZB/1T+HRLWXpDicOJWjl1qhVvddR3KKvzz5Yfiu0lMiz5wV+LfUrSLOpOgvOk12fDIuEir5wGm41Z9YQRUSMEkVSkHojSywjaJdh3dnxwS2ov1WU50lSS+MedJ8GwKX+1CTPkovNcHphnmhRdF9hZTfrOI0J67GgEfQK0f2vwp9HbGV1JOr6nNG+6vt64O4Y53jVI+POmF2QyAmOYEgMNolr9iybAQ5HomAMRcHim2lkCvFWKRlGH2hXXQm4GNUagXGQU8HZErYbLKzYUapzeCEOco+fYUgNvSEBUFj2zI/k+sJRouUx65PviNk6pKM+QgnXBvnk/oThtMxLk+zJMyjhaVIri/Toew== X-Forefront-PRVS: 018577E36E X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6049001)(7916002)(39410400002)(39450400003)(39830400002)(199003)(24454002)(377454003)(189002)(39060400001)(23676002)(229853002)(3846002)(2950100002)(6116002)(6916009)(54906002)(90366009)(77096006)(50466002)(31686004)(25786008)(38730400001)(8676002)(36756003)(81166006)(81156014)(42186005)(6486002)(64126003)(33646002)(6666003)(5660300001)(65826007)(31696002)(2906002)(305945005)(86362001)(106356001)(68736007)(105586002)(83506001)(7736002)(65806001)(101416001)(110136003)(189998001)(66066001)(65956001)(76176999)(4001350100001)(4326007)(54356999)(230700001)(50986999)(92566002)(97736004)(47776003);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0801MB1742;H:[172.16.25.13];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtWSTFQUjA4MDFNQjE3NDI7MjM6TjZVUEFOQ1FMQXVaREpYSVpxTVVQbmJs?= =?utf-8?B?YzVXZHNUbXp0cmN5QU5aeUNVd2RBWFBHeGhEcUtaSTNrWFI3N2k1NWFCQzhp?= =?utf-8?B?Z1F0TTM4MEhTS0E2cGw3YlNKTjN0Q3V4bll0SWs3OHo0ckg3QWowc3NtVFRw?= =?utf-8?B?Z0hkYnZsS25wMzJNVU8vcmVWMGJUYmJEb2k2SFNGOEhEZXdNaUp2UEFRNThp?= =?utf-8?B?SmRUWTQrQVFsUDhUNzdaTHVLYlh1VGtYOFVoMnlOcVpqV1ZtaDc0YnllYXNP?= =?utf-8?B?MXNIM2VHQ0VxNEJxWTNIbERqQVUwbks3THk3NVF5aGU4MDhCNzdIQXdtSC9V?= =?utf-8?B?WlRIMHFFMVJUVEtKdFVDRHAxayt3cSs3bWxIZGFsdXdMaWE2RVhuTjlMcFdH?= =?utf-8?B?Q2MzcEVDRkJ5MGs3WTdjV0Myak9seUtBWTRiV3FnbXArMSttOGFWWjFuT0ls?= =?utf-8?B?RFd5U1N2Qi9ka1ZXTFRhOG83M3VyMks2RTFLek4vMkVXdkROSUNaTkN2eTQ3?= =?utf-8?B?RnEvbjB2cWhkWHhRR3p4SThaSG9hRDhvU3N6VENEV0tqMDhoV1hycjExOFcv?= =?utf-8?B?dlhUSEF0OU5yWU0wOFdWNFpFMnZZdXZNa1dUdzBNK2tBY3huQ3pJdHpXc3Za?= =?utf-8?B?SlJMZHBvNkZPRXhZODMxZnpJQ3g1Ryt0OVl4c3JRRmRJNU9BWkx0dDh0TjF6?= =?utf-8?B?QnhmanhVYjNCNDc3MGkvK0lvUVFLWUgxTjhHN05PT090c2NvRTROZHpyaTJ5?= =?utf-8?B?V3FBRFJrNlBFNjlqT0pOek5TZkhoRHZBeW1XVkhLVWg1YjFjc1JOdnQvcHlj?= =?utf-8?B?NVVneVpTdjBDTmNzbC9uL0xOUW01VGhROWNETGE1V2ZhbTY2TFloOFdQd0Fp?= =?utf-8?B?enQ2RW9EcTZFUittSCt2OCt1ZUUyeEdkandJZ1JkbVVrbzRldURpTHVxS2dQ?= =?utf-8?B?WkRrUVRLMUZDcmRnRURLSGFzbERETmkyaTJkZkllUVpqU2JFT2FIUWhHdkVE?= =?utf-8?B?TFZua2tPUlQxb0JvSTIwVlRDcnFzTkMzeFpNOWNIeVRRM2hNcVloRG5aOFJu?= =?utf-8?B?Rm1YQzkwUGxta0d5ZFFPNWZkNXFUNGZMeTNrd3BRUmVUM0pFS2hDdmZJcUpa?= =?utf-8?B?TFRRWEpDcnhENW9UYnUzMVkzV2E5VVAweGhoNzJBNTFjUVJxRkVXYVVMUmtp?= =?utf-8?B?OW40dnRUbjNBS1NjMFNBYTNDVlhldUU3SjByRml4d1BWM3FKOUdsekdvcHdU?= =?utf-8?B?T0c4VUp3NW5TdzNlNGZLaFpSSEJPbE02dzQycE1CcU1XQnJTNlpnOENzSkJE?= =?utf-8?B?N2tNdUZ3ck0yTS9IblpQSytmc0FPUlczRWVobkpnanFJRXV4TVhvaHExRDZF?= =?utf-8?B?bWllbWxNYmJ1TnlLdWZNWjF3R0JlV0RYQUVGaHBHM3g3R1haV3BDeVozV0pi?= =?utf-8?B?bkgxL0p4SmNOTUo4ZlRYVzdZeXdmUzZBT2swNU1jQS9EakpLa2dCcmY0akxH?= =?utf-8?B?YXdvRlJNK2RxazJYcnorUHcyRUdTQ21PeXBKdUtLMEk0a3NxNXZpeHpOTDVJ?= =?utf-8?B?VTlMZ2pnU3ppbEZKS0VDckUzZ3RNcW1MOFFpbHRqLzBnOVorZzhjUnhtRm5Y?= =?utf-8?B?MUptVGpyYkVKVnErWmtoSnlyZGgzQkNyaUYvdEZZM3NmVXFuSllWL05OV1hD?= =?utf-8?B?TDZEdFRkY1h5U2p2VXZjeExsRm1VdzVvLy9WZHoyWm5NUS9oT3JvZ0FPM3pP?= =?utf-8?B?WnlWNm1JNUg5MkFISGlPUDVTbGg2eUR1TTBlY0FKekRPbW85TVA1ZFdXV0p6?= =?utf-8?B?UFdMb1BwS1RCMENiU3ZyRHp0TUdhTmpCSjNLL2hWVWRDbS9YOWoyY24xQXRN?= =?utf-8?B?YVpDS2c0SHNDWlBhN3pvQ25MWWk1K1cvbW4xTzBra0ZmdVVFWVJQVmdzQ0FY?= =?utf-8?Q?uq3Tq3+7kpFmjdDmFi8VVVQtgXWYwM4k=3D?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;6:7lRhaEGvn0ibZlG91HOr6iESVu5qrLukRgjp/H2jyJiUKlCMZZgj0ozGLz9x2U3sAAGINXaZDwSsSABZthfNMJ0yj+fxV+s4PEr7jfdgcMghsyyCkilecbbO4p5yTIK5GRPVdRaaTELHeI3yMaulq7QqtPeUkTbGsZfjsf6tdhnuiKBiDo6A3uDjKH0tK9MYFN9O603NR7jkKaPM2A0QavRTSbKBEQQwLIbecKtJhzHiR5YP0wnOEcE/ASkiV3kesPcVw6XAiiXStpitIS5Cgs8BnA0ykbLV77W7wxbk4gZHl8QniDMhDTDx5B2QRGghE5vOCDN1VLiQluqQ63NawGc2rKF7cR4e4g4DUIRWGjAEbzL0RunEQqvGTz1YPzqLBLRQaR7zKMr1LmaldVdhINgA5a/2gpY4QqF0Pneavmg=;5:QqASUCrfgnu4oGdsBMnHd+2EkMjzgs4ym/JPLtd1Q/8wNSRZ/vh3HaeUMWGiSAX2IJQbDE8JfxAuH2CQwS2Mxzryua/uKT9NwGF7uaQYFWTtVs2BHBRKAnnQFIMBEYYEpoa/QeaM0ll9hCXdZICbVw==;24:OT50GxdtltdsTm02OtHnBERHGdTQ70MuNYJkNKxPQlA2FrxwEMO6xyyFTOyde+QfA8mfGv40QAsoFsbp0rUgTH/QjKSgIx3APNwnwOBGxQI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;7:fdOUz5QryifCww8Ew0t2BSiLPbI+SpD51SxmiO8JK+x/v+fVJGHC0IPVZ1ByFI4tEW5LSkq2EkseyE0M4ACDLZ3TH3lVZ173RnObq15Ot0QGl8qxGxAEII1nGwVlW05j/flkQb42bMeqHjhEtzt/LuXe9uxd4m7JIDodbu28pxeOLoKOytr25eGxWVm265zwgHm93d/mm7jsuCdOxQ88S42I9zqzmf7ISqOtI+TNbXdfwSSe+s9Ks20QgeyQQuuM81nF5fFVu+uPDjnVlF5bvLjnpJD/QW06PHOKd05fLeBvBl+xn4sxlawb0G0BWa+5PF68NJqE398N5P7Pv6Uz6xXUMXUJR4GevJIqPAAhGZp4vEUY0UjiWGXVTmWpqhbUmPXgZBDFGdpoXs1qNZtz6oRkN5XEVUbDibwa+4e55GrzBR3MGgXHtHcvexNsadhWwMav5RwEQP6XabqL9J8mZQ==;20:4NxOIf+ntpDzscod6sEg9bvdId2xwEMXXtMnaTfQ3ULyFRKpA3eo54UineqWlfZjXMTgsfzjKSnyNJ0p1ooq6kCDBmvjanvoeDokUnipk28/PEdbfGSrMPDY99EsPvyonrvKwGakjb0DqZGX9zv1di8i/Dm/2+sKH1vQHsfqOV4= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Jan 2017 09:49:22.9060 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1742 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/12/2017 01:26 AM, Andy Lutomirski wrote: > On Wed, Jan 11, 2017 at 10:17 AM, Dmitry Safonov wrote: >> During fixing CRIU bugs on ZDTM tests for 32-bit C/R, I found that >> compatible ia32/x32 syscalls mmap() and mmap2() can return address >> over 4Gb in x86_64 applications, which results in returning lower >> 4 bytes of address while dropping the higher bytes. >> It happens because mmap() upper limit doesn't differ native/compat >> syscalls for 64-bit task, it's: (TASK_UNMAPPED_BASE + random_factor) >> which is: (PAGE_ALIGN(TASK_SIZE / 3)) + random_factor >> (in case of legacy mmap it's just TASK_SIZE). >> This patch limits higher address that can be mmaped with compat >> syscalls in 64-bit applications with IA32_PAGE_OFFSET (+randomization). >> >> Signed-off-by: Dmitry Safonov >> --- >> arch/x86/kernel/sys_x86_64.c | 37 +++++++++++++++++++++++++++++-------- >> 1 file changed, 29 insertions(+), 8 deletions(-) >> >> diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c >> index a55ed63b9f91..0893725db6e6 100644 >> --- a/arch/x86/kernel/sys_x86_64.c >> +++ b/arch/x86/kernel/sys_x86_64.c >> @@ -100,7 +100,7 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, >> static void find_start_end(unsigned long flags, unsigned long *begin, >> unsigned long *end) >> { >> - if (!test_thread_flag(TIF_ADDR32) && (flags & MAP_32BIT)) { >> + if (!test_thread_flag(TIF_ADDR32)) { >> /* This is usually used needed to map code in small >> model, so it needs to be in the first 31bit. Limit >> it to that. This means we need to move the >> @@ -109,14 +109,24 @@ static void find_start_end(unsigned long flags, unsigned long *begin, >> malloc knows how to fall back to mmap. Give it 1GB >> of playground for now. -AK */ >> *begin = 0x40000000; >> - *end = 0x80000000; >> - if (current->flags & PF_RANDOMIZE) { >> - *begin = randomize_page(*begin, 0x02000000); >> + >> + if (flags & MAP_32BIT) { >> + if (current->flags & PF_RANDOMIZE) >> + *begin = randomize_page(*begin, 0x02000000); >> + *end = 0x80000000; >> + return; >> + } >> + if (current->thread.status & TS_COMPAT) { >> + if (current->flags & PF_RANDOMIZE) >> + *begin = randomize_page(*begin, >> + 1UL << mmap_rnd_compat_bits); >> + *end = IA32_PAGE_OFFSET; >> + return; >> } >> - } else { >> - *begin = current->mm->mmap_legacy_base; >> - *end = TASK_SIZE; >> } >> + >> + *begin = current->mm->mmap_legacy_base; >> + *end = TASK_SIZE; >> } >> >> unsigned long >> @@ -187,10 +197,21 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, >> return addr; >> } >> >> + if (current->thread.status & TS_COMPAT) { > > in_compat_syscall(), please. Indeed, forgot about the helper. > > Also, we need to verify that, if this is called execve(), it does the > right thing. Hmm, not sure I get it right. A test for calling compat sys_execve() from and for 64-bit ELF? >> + if (current->flags & PF_RANDOMIZE) { >> + unsigned long rnd = 1UL << mmap_rnd_compat_bits; >> + >> + info.high_limit = >> + randomize_page(IA32_PAGE_OFFSET - rnd, rnd); >> + } else { >> + info.high_limit = IA32_PAGE_OFFSET; >> + } >> + } else { >> + info.high_limit = mm->mmap_base; >> + } > > This code was incomprehensible before and it's worse now. Could you > try to clean it up a bit? For example, a patch that simply folds > find_start_end() into its sole caller as the first patch in the series > without changing any semantics would probably help. Well, yep, I also don't like how this code looks like. That will need to add a parameter to find_start_end() whether allocation is bottom-up or up-bottom. I'll try to cleanup for v2. > > --Andy > -- Dmitry