Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933167AbdCURdA (ORCPT ); Tue, 21 Mar 2017 13:33:00 -0400 Received: from mail-eopbgr30109.outbound.protection.outlook.com ([40.107.3.109]:55662 "EHLO EUR03-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756925AbdCURbl (ORCPT ); Tue, 21 Mar 2017 13:31:41 -0400 Authentication-Results: virtuozzo.com; dkim=none (message not signed) header.d=none;virtuozzo.com; dmarc=none action=none header.from=virtuozzo.com; Subject: Re: [PATCHv2] x86/mm: set x32 syscall bit in SET_PERSONALITY() To: , References: <20170321163712.20334-1-dsafonov@virtuozzo.com> <43DEF3C4-B248-4720-8088-415C043B74BF@zytor.com> CC: <0x7f454c46@gmail.com>, Adam Borowski , , Andrei Vagin , Cyrill Gorcunov , Borislav Petkov , "Kirill A. Shutemov" , , Andy Lutomirski , Ingo Molnar , Thomas Gleixner From: Dmitry Safonov Message-ID: <588170c1-5188-d4da-b2db-8e335db98f48@virtuozzo.com> Date: Tue, 21 Mar 2017 20:27:58 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.1 MIME-Version: 1.0 In-Reply-To: <43DEF3C4-B248-4720-8088-415C043B74BF@zytor.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: AM4PR0802CA0020.eurprd08.prod.outlook.com (10.172.214.30) To VI1PR0801MB1743.eurprd08.prod.outlook.com (10.168.67.21) X-MS-Office365-Filtering-Correlation-Id: 9cdea38b-dc18-40e7-a695-08d4708020f3 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:VI1PR0801MB1743; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1743;3:LtLRI7BReYHrqKi8Gn63DH3Fu6B1dSfkO2komdnDR9F+ghs+DPX3DK7lJEra4Vwn78CrvQyZdiE5mzjW9FNpfVTQX3jcA7qUKvhEr/iaMCk2hgGCwkUFzUahn+WtKdVsL4LoFitQkrmcihV915kSUzpqDthABJvLjjwklyMezC3xGzEOaJQspMbpxMHCW0TtW6nJeKxgWbFSd/TEPFrakFS/PIAiKWO1Ah7MxRW0LDo1NIonLQi+OwDXVYe7FoEt7nZjgT9ooj0XtIjFA29t/Q==;25:K8vqhki020P2w4l7DmxmAhOpKbQCOp55DQCybxPb18tKCbk4omlKqZ404E6iCsIDIjkmr+YCZYjNx59dLqc+qE+KN4BC01vjl3OS3UiFXVd6g+mbYzBNBUAMQGXBc0xzQ7hvA6w3kWh04wttGRvGc2HeXH1fuNr8ejms3Bn32J/TtVba8r95wJoU81wu+2lsrHl81k92+oJVI2NXX4kzE1kh6D3uHJbUhVhWfyfXONruYqDWkcu7dxIktOaZjupXGe6azCohM7kWlaUcWa9/S8aoba94mgvvXPRMomqHQJ6KEBRrHm0GDYN9NoyhroSBrm3YYbBkmoylmCIO7t66DosjsaIGap+mrG0fHfAkwC+5aLlk+zPTdq58PFTSyQN1IYf4On+c3UK4muO7U+QS0BZIrQilOcGWqwxmLtYV3Gon+qMcmgFMbSpmx2PbX7E3y/OevbpJg4CDpgmzVLebsA== X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1743;31:VsG8+NlJj6OmkB/2i3koPU/O0lwqEk0CydlgR2RPf7a68S/8P8cGsQzjFdoZqsoZkJM8yTyQG5XZXT/+1Om75RJ5FbLqCjtkwhp3rUe0NwsHkiTSgejNGj06hxjhzYkwZEmQf9iCMOwroPRhlOHwuWXb+aHQoCOTeBS8MMjPpxMkKwNlGbtNONqqli8otgLi8WJEwrMKOw9fbG4AD3YOMncG5+6g1Ys5ZqVJO4lctuFXPLYf3uPg6cgwuTZ4lbp4;20:l9ixy8nBCRU+l5GCxgeUAgMGCf5c76XGqMrgjzWs358OeecjKDbzgJsEvPh6Q3wEYP9eXBaWQSf/FwqPu0HM+nnjxfFSfZMhtdOSxr/GiGIsV1Nc1LkXQfDwfMkMaZK+LQ59rl4r5SmU37IPe9xj9RtUKmsZWSsX0zXmqOTs0rX/kVKqNzUVx4jcLjN5G8OIIZkHU9JHChYZIUNH5bICDmkTVTxyoq/KsW/KS8jSI/a/Y4KVBvvid5mB0hE273kR3+jfrvt1eOWaoHIR6e3cEAJih7L/qgZzPSe6h8VTMyjD2FJOIq5AGZn1nZbpL3phWrH+zFzwIg8644EC+abCxTtDXZUf34EiZpjm0HnJsEDz4thzCmFaQQKWLapYSQJ+btEFQjy4RH6iAiDUqthPaaBoJkky8VbQet+ygUWNRYc= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041248)(20161123555025)(20161123562025)(20161123564025)(20161123560025)(20161123558025)(6072148);SRVR:VI1PR0801MB1743;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0801MB1743; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1743;4:/+oVXp3QLMi3IOdb3RdbpuM3Uht96rxjn8QS+qfwZwKWYQTh8phhyjT/ai/1lJ4IQCj30IdDRTnGhH1syKvBH2K/hCbRQcCjzI6fMoJWkoeMRbDGy++JKeMQi8PeyzYRCiutAGZpBnM8zSpD2steKijMIoQTeHPs7dfTflFT2vVCa1cojn3kmla40GuKcCr2w9zKGArwlKkWbXQ4pKHU0ZknWznfs4NM7RSZXilCS1i73pmCnesGE4Y2jgsWIA9xYKrOhg46MgdDxDVUHceFg4DG7YuPlKKA88vn9gfLYrgxEJOMAtK7NEBuAbHJi5NdjrS0mAF01NhPo1nxBy+uJor0dLh1tqpdePhJyQ60/suU7T4G7vli/qcFO9UgIF4X1qOmKg1RK0rHR3yNmsfWZzkQ0944VkVPgm2AJBtDqtDDbBZAyPRgssEST2SK5kKNhJcfZfbn6A1dPHE7K3DM+wLF0ioCGETh/PioZZDWlpvoVQhMqn5OS7MVJpNYhSYErNUE/k+LNzTCEHavm/t0H8dOG8BDFqtoNET+WMC6PNqxr//+6rR3QWQEfVg5KtcFVY3VfD3oAY5C0E+70sXYO1PkhJQ87rciht91kuwrONJI2Bt6+f1pVKPTFoFraze2eEwQTKxEMTGE0ZtkYmJ7Rw== X-Forefront-PRVS: 02530BD3AA X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6049001)(39410400002)(39830400002)(39450400003)(377454003)(24454002)(3846002)(53936002)(33646002)(31696002)(6116002)(64126003)(47776003)(6666003)(6486002)(230700001)(66066001)(83506001)(50986999)(54356999)(38730400002)(76176999)(65806001)(305945005)(90366009)(2950100002)(65956001)(50466002)(77096006)(7416002)(6246003)(4001350100001)(5660300001)(31686004)(81166006)(8676002)(189998001)(4326008)(36756003)(86362001)(54906002)(229853002)(42186005)(7736002)(2906002)(53546009)(23676002)(25786009);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0801MB1743;H:[172.16.25.13];FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtWSTFQUjA4MDFNQjE3NDM7MjM6QkY1MUd4SFJoQU5FTVVIQkpIUWFFYUlR?= =?utf-8?B?cjJoU2xWQkZzeVNFS2ZwanE4Y1YxUXkzbHRIV1NJYlVPdnJVRjNQZ3l3VTZh?= =?utf-8?B?U2FIclVQSFZnL1psM2NzTmFDaDhNZTcvWGc2d0NaL2NndlhEejFxWHhwSmJy?= =?utf-8?B?UHdsWnlEVm55dVB1OFFaUDNzTWdiSFd3VjN1VDB4Wk1rdVdLWHM1bUdybVA5?= =?utf-8?B?NXZPeVQ2eW5USWo5ekI0dHVqTER6elJyRHN2K296RFlpT0U4QnhzT2F1WEhm?= =?utf-8?B?L1FzVjV5WlJXUU5VZG1ydm9nMnFVNEhkTmtlUkUrS2M1NU9TK1EvaVhXWG9L?= =?utf-8?B?WkpEOEZHN3dCR0hqRnNQZjFLMk1pTEp1UHNheTBuNEx0VlZPZXRuSFN2NDFJ?= =?utf-8?B?VFU1aVpWY01oN2N6aktRK0g5UU9LaEZhVDhzZE8zdnZGQjdUQlFGYnJOM0gw?= =?utf-8?B?M3lTdkwxZmJjTHBibGJwVHlmMFRpbkdJc1dxYlM1YXA0TVhSU1hkOWwyTzkz?= =?utf-8?B?UnRJWWxlcGZIYkxqTkNna3BENmtWbnR1cElzalJvM0grWFMrUmlPckdvamM0?= =?utf-8?B?Y1IyejBoeUl3SzV3YzIvZHlzTDhQV25tcGFmNkJqd2F2RXpudFZ4WE5XS2JH?= =?utf-8?B?NUI2NUxacGU0WFlnbTAwd0lqdHNFb21ra2pUaEtRQ2p1RjJPUzFvU1FzWmJD?= =?utf-8?B?ZWVXdEFPRmRDODNnRjIxY3VSbFY3bXptaUdjeU9zQWJBbG95QjJjTy84S1VD?= =?utf-8?B?ang4cTY4K0xBOEE1NHBWRHozcDNYY0lOL3JBQ1ZFMWppYjhkVS9xMVBlMklW?= =?utf-8?B?NkthTXRGL3lsNFQrejAwUW5ESzl2bGFXTzBqeExtaTZhdlZYTmNsWDZ1eEFD?= =?utf-8?B?Y0huMHJubXg4aE5LMDNlNVhEVTZnMTgzKzZtVDRxbVlSVEh3bXBNT3QwU1Yv?= =?utf-8?B?QnFGS1FIUVpuOUJDeEhaUWZkWEtVMnZNYnVDeFJiUEFnSyt3TkhVZUZ3ZG4x?= =?utf-8?B?UCtzOWVNMXB5Z0lWZEJ6V1o2VDVHbzJrVXB5TlMwVzZHNWl2cFdPVk5ZRGFn?= =?utf-8?B?aFgzakxGQ1Jpdzd3ZDJyR0ZGeWRyZTR3eVlMN0tyUkJ6SEZuOURUR1NDdng1?= =?utf-8?B?SE1CUE5EY0V6VzBodG5lbkIyWEd5czV6Q0liT3dTNFJaNmpjck02YzFrcmRw?= =?utf-8?B?Yi83RkNEM0MxcDU1cGNZazBrVE9YR25kcGJ3TTZQVmZvdTYyaHBLMGFmRWFW?= =?utf-8?B?WWFhd2s0MkhQWVA3d1IwakZlb291Ry9RbXFrTEF5UUlVNWJuZkZubGh6akIx?= =?utf-8?B?d2NzQ2ZjQUJTQllEN3dqU29OanB0MmZYbjN1NU5wSzFNdnJMc1p6ZVVJVkZi?= =?utf-8?B?clM4RzhiR1VXam9sYkttQW9EYzRrYm4weklXZlE1MFNXZmZYU1ZrMmJubnBL?= =?utf-8?B?d1BSdDczUXhOYSt5M3gyc1ZJazhoZHl2VlpIeGtZekRVVlFqWFZoUGZqczlq?= =?utf-8?B?TU4vd0V0NWRrK1RtWUIwSk5nTGVDbVU4RG4wclJ5c0QyLzFJRW1LK2NhOGxs?= =?utf-8?B?bGN2YW43UEVjWnF3VkFucWxBVzlkQ09YaTJQczRNNlNUaUtKSzlIOHR2ek1Y?= =?utf-8?B?TlRmenBNTXI2SGRkMjBUMCtUZSt5VzAvNVdUMWl1STIwbkNUdEdxNUVHOWc9?= =?utf-8?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1743;6:YAcYJM/XuEEEy0KMWieKVZKiGniXstqiWIGTs9GoOEkcJyAMhxpLwEtSWJruUBQD0z4km7PsVipFNBM7iC54HHo7H9GCc9Od4HJeTr/AeBAEO5B3cjgVtyfnktxpB1W6Mec7FjufMwf7RWpbrOnfKhi3d1+A0EVVU0OdZqi0hKm/K5K1XGzpeiruXYNIP0qSlY3heK+l9ga1CRZ0kAcrDrtz5Msuqfk0lpQw57zgwhITsmFFtDSwsB6ljHLMiMVpB2I0ZInQQTOVwqZQ2SBMyNFUZYfF1dCV90Ji2YM+hvPqAVsE9K37bF4kBcUdFa14uENIRecCFQEV7Z+N/4jzbykgan9mgD01usNMdj2/85mnRCg7ndS+ivGnAHiCkBIKLgeCOn2rJUZ1rFANq8v4dg==;5:nDj/6aOpmb7UyXsNvRTye0KqEhYyQUVoilOvztoa67U05rct3VXt7cwh16KTBBeO7zN4Nrh9thLwMlwDWBFaGxXP5V/1MEK917xBNXGr4/1h4yj3RmedTlwTAoT2lvG415CBbBRrerieiAyN3oJKAwDa4TIJyUumJtEAfR7Mcto=;24:TH6oquOaiLD9aAS0WyuNoa3GePhZhxYO1LEFanRSLwYrUifzQXpOfa9TbqcrMtbLur0ScWfa/V95eOjlr4t9p6DQWP0aft3BkuykUJAxH6g= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1743;7:UzlMKmCM1trD+cUX6XdsI0+97DOA0oUGWp3QSW71eMgFlNFWAAMCKUVeuZf5VNyUlFJwYZzrr9yeYjWlsFW/1gmqjtF9h7zgkcEAKykhm245H4w3H+ZrzomFbCI+N7Ar4QxIp3elajc+8WPuXk1BYjXP/0HTl6htzYF908ogP45JHwDy11Pds87fhJG9u0oK4af1yNlAP9l1SDek+Xyfg9LD4alrYo+tjJ7eptyKNgqa9Yqd0D7QVhHesDLxehSYoYiGxrL2MoTHbSnggBxwxGSmbROUAX39DBpXVzZvqeXN+keNcS+oHsEpxFoR26nUa2xvbnP5SFaSPbl9J5yFfw==;20:Sr0VLMLvyDZh4WQ7yJkVniI8hBLrZeajZWWWlnlpfiwvqO5UtapUnQQzObgb7O8PbKWIoMlPIowk97ZVY21tNTWPHtlRs/yOVhftUnBZHUzCfGBTmvAETGnJybAeX5129EHiUVFa3hUWacDDmXaRq5eSeGF0fitby1YLq6IAo0E= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2017 17:31:36.6437 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1743 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3098 Lines: 77 On 03/21/2017 08:27 PM, hpa@zytor.com wrote: > On March 21, 2017 9:37:12 AM PDT, Dmitry Safonov wrote: >> After my changes to mmap(), its code now relies on the bitness of >> performing syscall. According to that, it chooses the base of >> allocation: >> mmap_base for 64-bit mmap() and mmap_compat_base for 32-bit syscall. >> It was done by: >> commit 1b028f784e8c ("x86/mm: Introduce mmap_compat_base() for >> 32-bit mmap()"). >> >> The code afterwards relies on in_compat_syscall() returning true for >> 32-bit syscalls. It's usually so while we're in context of application >> that does 32-bit syscalls. But during exec() it is not valid for x32 >> ELF. >> The reason is that the application hasn't yet done any syscall, so x32 >> bit has not being set. >> That results in -ENOMEM for x32 ELF files as there fired BAD_ADDR() >> in elf_map(), that is called from do_execve()->load_elf_binary(). >> For i386 ELFs it works as SET_PERSONALITY() sets TS_COMPAT flag. >> >> I suggest to set x32 bit before first return to userspace, during >> setting personality at exec(). This way we can rely on >> in_compat_syscall() during exec(). >> >> Fixes: commit 1b028f784e8c ("x86/mm: Introduce mmap_compat_base() for >> 32-bit mmap()") >> Cc: 0x7f454c46@gmail.com >> Cc: linux-mm@kvack.org >> Cc: Andrei Vagin >> Cc: Cyrill Gorcunov >> Cc: Borislav Petkov >> Cc: "Kirill A. Shutemov" >> Cc: x86@kernel.org >> Cc: H. Peter Anvin >> Cc: Andy Lutomirski >> Cc: Ingo Molnar >> Cc: Thomas Gleixner >> Reported-by: Adam Borowski >> Signed-off-by: Dmitry Safonov >> --- >> v2: >> - specifying mmap() allocation path which failed during exec() >> - fix comment style >> >> arch/x86/kernel/process_64.c | 10 ++++++++-- >> 1 file changed, 8 insertions(+), 2 deletions(-) >> >> diff --git a/arch/x86/kernel/process_64.c >> b/arch/x86/kernel/process_64.c >> index d6b784a5520d..d3d4d9abcaf8 100644 >> --- a/arch/x86/kernel/process_64.c >> +++ b/arch/x86/kernel/process_64.c >> @@ -519,8 +519,14 @@ void set_personality_ia32(bool x32) >> if (current->mm) >> current->mm->context.ia32_compat = TIF_X32; >> current->personality &= ~READ_IMPLIES_EXEC; >> - /* in_compat_syscall() uses the presence of the x32 >> - syscall bit flag to determine compat status */ >> + /* >> + * in_compat_syscall() uses the presence of the x32 >> + * syscall bit flag to determine compat status. >> + * On the bitness of syscall relies x86 mmap() code, >> + * so set x32 syscall bit right here to make >> + * in_compat_syscall() work during exec(). >> + */ >> + task_pt_regs(current)->orig_ax |= __X32_SYSCALL_BIT; >> current->thread.status &= ~TS_COMPAT; >> } else { >> set_thread_flag(TIF_IA32); > > You also need to clear the bit for an x32 -> x86-64 exec. Otherwise it seems okay to me. Oh, indeed! Thanks for catching, I'll send v3 with it. -- Dmitry