From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751227AbdALLni (ORCPT ); Thu, 12 Jan 2017 06:43:38 -0500 Received: from mail-he1eur01on0109.outbound.protection.outlook.com ([104.47.0.109]:28932 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750960AbdALLnc (ORCPT ); Thu, 12 Jan 2017 06:43:32 -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 14:39:20 +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: HE1PR03CA0009.eurprd03.prod.outlook.com (10.163.170.147) To AM5PR0801MB1729.eurprd08.prod.outlook.com (10.169.247.7) X-MS-Office365-Filtering-Correlation-Id: 4cf83aa1-b0b3-4c10-9c3a-08d43ae01cb5 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:AM5PR0801MB1729; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;3:Y3GmDCoXsht1UHry8+be9KF6AQc6+qMeATjngWQc1KFATws0JnOO4fuESL4RUvt8jjUcctrgGgeVbSfdbBeABUCJ/n6zn1pPJtbUlfe/cQomGQF2uaQSJZMpfA6EieibliVUMLBehz/cPTueqHIMiXjrxGYuIl4rmNy1WH6BUTlUlZ1TIZz8gxrqVdrktChqhrYXO65y5wj0Wh/O4YQaRSrysWYJHmOpMPHjkXnxY/s1xdNGNBn6J2ikEO4dw8K2Q95B9SIAqwKh0cL9msvjZw== X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;25:4eDExpAKummiuYFt9Ja5HWZyqcaVk0lCrgbMCSBodqIrKpOA4Gpu/Q5cmzuK4M4ywjrJL9fYU/MGPWnf9qchDgc3mg43wp0T/RLiFoovbo79T0xnGmhi3yqRWhHtbY7Q6ANpTPo+DPULx4NBbFEUWVNG8acuuts7dTM+7Sm+uUfCaXai4RLSBtr+E8vWvKg1jJzRAyWeOzQqT5zGdcEbSNHfe69lInZeuB5OTdjk2lPcnqgYeyPgb2xGyvn+gkGmHMqElHmhmCZsKWX/6Mk361k2OJJ6PBKxO8j5rnU/OjnA08dvi+tBpMRPP4ZrLYD8tVu+umLGOVqJmCu5XLjIPCPiLTRKwPoDWn6/yy7KTo/5TbqQXMx2XCKd94+sFXNJsM1zhX51rC0+XaH6+5h936Zc8uUTEUxyNfMUIoUzdpQZxBEZ6QXfuUehtMv0HejaZP8mOQ881OzpXNekN0VVo59/AtJEmsVS9aAGJFyc4CYfKNU9ZNDZ6FOAyL5UIeBCb9YpNBF92ayxaA4oroBDymmiDOK0iamdGdopu78Q4+FrZcw9FemSKQA+2deGUHJb2ggCWtmLxYr65qHV2Ea/ZmNMMr6UZI/btOq4RqV70t5xBr4zmT/p6eZ/Iu2URiR69ihIcwAbGVnm+Q3NFvEmsQJHUw+k0OB+paFbRFlvnwPr/U2/sAmtggINdV78Rm38C1YVUZJ69bKRVad/zcyNJ5z8Jq3F1P9nAfJX4AIrqvfQ0qCkzVrZOgrQJfL8l7/3/NkY6Th05AGhe3L8RKkaXeNbdAM72Vj8VV7LqaFI4MA= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;31:fVIlWCOalemM6Ek5i9ls9nKz/0IJII74vOo9IBBaVC37fIhWieH4plVayLjAR3/fFIIPYzSw4tWOpR9argZKeK9lT+5qBGI7itMa+3K7xz1JM4b39Oih7Mr22iYAWjlhJAGKKYzvMt2+xgSdOtB+f6IRE9cA4VG7DFQjYHT0Lg9oa9bicSZPc2jb13keom82zyad0IqnsfSujeX4ax6ln2OMZ4znmZpAAbvW8H1f4m/H0qHvE4v/e3agM1qZKADw;20:Q0VHhmptS4hckZtuNHpIGYYvkZ3kJNUxsiUh/cfuHrli0QVa6G3b/6vHt4w6i8bqbyTShn9sEtzoXz7KgsDTf+reaaKZhRpW27bbKHWtij99Rd96oTEnBNFmANoWplyoP22c85RZOBkkZkmRz+519uek50hczs3OGTR7ax1pIhXpecvqQ67TIFYfUXLhLFBc/ChQXo86d+Yt7ybDwxs5t4E27nGQkNTNWC/K6GWJi3jQEtqF7BUpYNfBs2KFuheY 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)(20161123564025)(20161123555025)(20161123560025)(20161123558021)(6072148);SRVR:AM5PR0801MB1729;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0801MB1729; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;4:ogpxHBiDT2L9fy2PHPDi8EZ1vyTMZk2wm+UCS1xryXQ1go+0kiN2UbyRjShpdXbiPYwOohj98qscaCEakZ//+62C+xKtYZc7nxapZu8NTVrRXEJ6EFqhp3g/WOLg6RYHP7bfWXq/tkIyc2TxrACiJqPYFTbu8FFTcrRmug7Yx+0fTfgDws9iWIB7DL4Ff4RLGWKCwKEgh0DJfclSR+qUmoTUjU8e/6g9Eh2yB5mtHowQt/rz+nxiB/J1mK10XEC9TQdJtd8TgGShXStFuCFU/tNmbCO7q+Uz582Dup/z9nhI20Lw9hX+wA/9aOi3Ry1Rb+7k/2vIZX8bjkj2/5zuiOysThdDGqhfkuYXo2iOZv+5u2pztURNmiFsxpqdvrR54PjxHO8HH+DjljJ+vLIZICS4pj4vAyVwzA3nKhbm/J66FSYFiISyR7C80Z/jsWbm73uj0V6sxXW9Dg2xlEXZZQntZuZ5vO+QresY+CMrelPXPGEPhhYHkGHXQOp4/LAAnpD96vEn4hcA629IrRaVNhj2ACGOHuun7RkZkBGbGFLG1HTFe7r6lWbuYqYkkLsK637oGsfjaLUk5N0/gKtN42ckMnYS1wJd9xxodEf/qQ0ejcdklIkqoCDm14iQy75en5oekyzNB/MymtQ7uhNOuQ== X-Forefront-PRVS: 018577E36E X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6049001)(6009001)(7916002)(39410400002)(39450400003)(39830400002)(189002)(24454002)(199003)(377454003)(65826007)(83506001)(4326007)(6916009)(50466002)(2950100002)(189998001)(110136003)(31696002)(106356001)(3846002)(6666003)(23676002)(6116002)(5660300001)(97736004)(86362001)(4001350100001)(39060400001)(81166006)(101416001)(81156014)(38730400001)(8676002)(25786008)(54906002)(54356999)(76176999)(2906002)(90366009)(36756003)(42186005)(229853002)(305945005)(33646002)(68736007)(7736002)(31686004)(47776003)(64126003)(105586002)(50986999)(230700001)(66066001)(77096006)(65806001)(6486002)(65956001)(92566002);DIR:OUT;SFP:1102;SCL:1;SRVR:AM5PR0801MB1729;H:[172.16.25.13];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtBTTVQUjA4MDFNQjE3Mjk7MjM6d21qLzh2MVlXNzhGRXpDd1Ayc0F1Z3hU?= =?utf-8?B?M0VRU2RSUWhPVlVpVHpGZkJnQ0NXM1dPKzErQkhGRmtnSDVrcyt6RmNLMG4w?= =?utf-8?B?Qnl2a1RsUDRwZmVwRkxURWZJNGRSaUo3ZlVXb096OEhEUVRndVdrK0d5cVNz?= =?utf-8?B?blA1Y0g5NjR2T3hpRHZmTG1nUEFvcjRKSWlHT1M0ak1qSmFtejVqUnYwR21T?= =?utf-8?B?aUFPT1RWL0VYU3F4NGFSTXFxU1FBclhRZzBZWkloQnBXK1NKbFlSV01CNjJI?= =?utf-8?B?RDlYNmNnbFpDOWxiZjhiWGh1dGFCdXExNGlnWkZybjBQZjZ4OHFhMDZhZXlC?= =?utf-8?B?MnZpTWV4K2RPN1BTNFRnZHZxd3N0QVc1bktnNHYzT1g3Tk9CeHRIeXVBOExY?= =?utf-8?B?OU93TlZ0SXFkZ0p4ajE3TDhuSnRGVWtWci9RRy9LVUpFMnltWUdYdDcyby9M?= =?utf-8?B?YTZGZVRNRFhiZWtpSnNvRWlyTVR5NmpOT2l1WVNHOEZFR0JHTVhxMjZxa0c1?= =?utf-8?B?OGduR2d6VVZ3WlJXYnBOcXdOdWR3ZWJRVE9STERyQWRnL01CVlcxYWREMnZJ?= =?utf-8?B?dml2cE9sdzdIZkpxUWttcXJXMmM0dEpaRkNMeUNWQ3l5SzhlR2lXQndwcXcr?= =?utf-8?B?cjF4Q3FzZjVLU1ZORnF3OE5kYW1SZmluN2NUamdaSGRpSlJEdmR3MGRwTVhY?= =?utf-8?B?ZVY0bkYrZzV6ZHV6WnNvenVUaDBnY0QrQ2N3QWIvc2Z5d0hJdTh5SkxPY21D?= =?utf-8?B?K1VpeTVjaVRLZ2dNbHNqazZRamgvQTEwcVduY2gydjIyc3dTdzBMUWhoVWxv?= =?utf-8?B?TTJWdWJBV1BWZVZuNEN2Tks0N00vaHlwdmM0MHBNNTJwZWlVKzhxbTBCaFhw?= =?utf-8?B?UGloYlVZdUxYWHo0ekhObklkditWbXBTUEI2bnZvRnNUQnRXaGk4VUZSNlVQ?= =?utf-8?B?eGtsZFJUZ2ZuY3ppd2xwbHg4aE91WWxQdURiU2RVanBNUWZEcUhjb1Jud0s0?= =?utf-8?B?VFBPdkVHRlM5NUVLdFJVdmhEUG9mdExZcXhBb2xWUkpkMjIwckQ3YXduTEZm?= =?utf-8?B?dkovTHpOVTZxTGdlTW5Ebnp0Ti9IQ2J6QUt1VENpUnFvR2E4MmgyR2kraHc1?= =?utf-8?B?bGlBN0dzZjMyMHc3U3ZiVmg5WDR2TGRNVmh2T3JST24xV2FqdVVQa0lvdkkz?= =?utf-8?B?UTZZTHpWQ0FsZERhS2paV0ZGS1RPdFhPVUFPVXJpM2c5K095a093NEJMUTdR?= =?utf-8?B?V0lUeHo0MnFCai8rbUZYQ28wbjZ4dk5qLzFqSTNrN0F0dGg2bnpVZDZIYTB2?= =?utf-8?B?Nm9zRGlhUDdIamxWMS9ySjFrVW4wWWNlcDJoWFQrMFNEN0lBTk9VU3oyWkpQ?= =?utf-8?B?K0JGaHZFNzU5U2FoL1JZY1ZVQWYwb1dweCs0dVFOU1hOdWtUZGtoeWVXc1Uw?= =?utf-8?B?L0VkQ3MvdXdkeStMQ2dWSkViUTR3b0dtQ3d5elBtS0JaUWRYRGZvZmtXeUc3?= =?utf-8?B?RVRiRUFZZkl5dWFZV0ZZbHBZaVJoVUJqMHF4NFJwaTFQYThVWXBvZXE4blhl?= =?utf-8?B?UGQ1ZWQrTkk4Tkt2eWxTVGFtc3pldXB1bjRCaTNZVlExcm9Oajd6aDEzRzNn?= =?utf-8?B?a1VIcGRvQ1hHaXlwbEtMOU5ONnpHQkhseHhvM1NCMjdtQUdmdlg4WVpsVU9L?= =?utf-8?B?WDRhaDZ5RnpkNWRiYnRrZnlQLzFtTk8wejNyZXRNV2tabVNUVjBBWUF6WUZt?= =?utf-8?B?MFpyNU5vZXdPMGNvdUFabUFTTDJRcUx2YzBtS0xFK0VsaXpqZjk1b2JpNmZW?= =?utf-8?B?L1dFRWpCOTlqUHRscFBpS2VGQStnblBGTmVIK0puOEY1ZGRuV3ovUzdnaDY3?= =?utf-8?B?UUZCRWpPQkMyQjRVT2dhd05xbGVXRjBhQzRJaUhydnI4czlMWjY4Zys5Z1F5?= =?utf-8?Q?fUdoAbFVTqy6F7Z04T6D8L1uvi+4U9HQ=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;6:v1e5C7dG4TDhnx+4zbQ4YB4fV/hyueBfGAgaokDTd1/+plhS/SLPLnH3tH029WOvr1279hS4orCdtl4Q9cg89cb80k7vnrSGQ6WIwDCWMo3qybvzBX6CM/xEEd/ZVpwrtONtF23fKdM3Z8Yn/LfdAZU232B3gkVSvzSDCEjgk7TF1qfnDlSeDfShX/yQImkzKighZgbRxE2VXQyqfX0RXr7QY5dnWBSoitBnlro3gJaeDQVIMH/kigHn6ZccRIxEYRGHFH5ZlXgR23XPRz+j5SOBMbmvm9rDlxfsEfLDCnx84Gdg53k4BMlsILul2P3MD8mw2Bx9omoTnEcA/xJkxAH/MJhzkSehrsmXq8nLz2M1HhZ4rlwIASn3wl6E6HJQyF27HeO9xjUXzn6XS8YMfHdXgouqzDGW+S0ZGZJCuV8=;5:Owkqi1Q6Tx/H1tN/9EEtQjbhqiPBr9v6goiZ9dYZETPkdrDOoi0CALX9JyJrIDCi1G6BfO14QwRTAWS5XOiSucPrACMHx5js+J3NRMG+Oqq4tDBDSCakUO+IE7A6ndzhdAwtlz4Zik8/EZD2HlAAZ6J0JFl8enOHoCxKPX0Sa9M=;24:YKbxr9yVSaVITr9x33m7vANQ+BEfe/fbg9oAF/Er1UbjGI0CtFfL3IYc2lVRJxt723uQ4iSp8CW5CVKwcZ28vK/QoB1XjL8tKGV5IENO1GM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;7:4jN4e4ceWYtYHi0HfC8oB1uIlxsuDV7oKix++HsMc0lqqlesKKbiYGj7Gw0Qm3aCuWOGxdgLDPupVyGVWzqnc9Odb4lfh3QMiobq0r+3UZixsIuVAlVuX1g5V9lzS+mVne+BMDSSt5fblMv9A0NaBch1psWTCbKm879DMN7KymvqAQZpmuy5fYfE8dRzsHbs/+Phj0S89jh+GrKMPyNPyyexvtXsuNODeOexZdAdwCcUNUBxktwtk6NumMnrsHi0goAsQBJR8p7m3WDXeM3fLD/mVxHZDm9uGGSkQ18ycov3B0Es9Y+HiUf/8ki2oY5Oy4xf9R33OQMxmjw28AOwgDCXrDh12cinHWCMEyGVrU2e8sAa/gnh31KqOcKqTOJdfriXxm6nFuaP7VwxX6hX6cbd4qJeVSZT2GvqX+t2B08vawZO6jdn++Rff79wh46ASyL3reNOiupKJDXxIgAdnA==;20:xIPvP1w/5HO0BMHS2yPaYx80+S+6P+i/3DFohcl7gMpoBUqAevNOl/bN/tjz50g6dHgt0Igu80e93ro8Hqoz7ljJcL3ns2rVYRfuM66CaWUhEVUgQ0xWbB/wlcDFsMeGReyDAi2lvlPAX/MtARJ6yK+vSLvvaFYOOH2nHSGlPGQ= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Jan 2017 11:42:38.7695 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0801MB1729 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. > > Also, we need to verify that, if this is called execve(), it does the > right thing. It definitely does not right things at this moment. Will fix to v2. > >> + 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. > > --Andy > -- Dmitry