From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1763998AbdEWQ35 (ORCPT ); Tue, 23 May 2017 12:29:57 -0400 Received: from mail-eopbgr20126.outbound.protection.outlook.com ([40.107.2.126]:40508 "EHLO EUR02-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1763923AbdEWQ3w (ORCPT ); Tue, 23 May 2017 12:29:52 -0400 Authentication-Results: suse.com; dkim=none (message not signed) header.d=none;suse.com; dmarc=none action=none header.from=virtuozzo.com; Subject: [PATCH] pid_ns: Allow to get pid_for_children ns before child_reaper is created From: Kirill Tkhai To: , , , , , , , , , , , , Date: Tue, 23 May 2017 19:29:44 +0300 Message-ID: <149555694775.4786.18241837604458780213.stgit@localhost.localdomain> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1PR0501CA0017.eurprd05.prod.outlook.com (2603:10a6:800:92::27) To HE1PR0801MB1338.eurprd08.prod.outlook.com (2603:10a6:3:39::28) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: HE1PR0801MB1338: X-MS-Office365-Filtering-Correlation-Id: e576002a-0369-43d0-ba70-08d4a1f8ee91 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201703131423075)(201703031133081);SRVR:HE1PR0801MB1338; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1338;3:3vndatUocooGIbk0RJh9MsCbVgoHMLX1/wrTQFazMHzslzQLkiaOiPB3ncRUA7wGk/ovsE60QCISuRsx11yygr/4tnzp8OK8gtSc2RPeIHAK9l0OIlCTWytI63dYP6WF14V8QFK/X16zn3+I8Azd/kbQLiZZsj6tiN+6GMXrRUoBkSUe/ViPOhvdQiK4siJmQojxdM3xxISaBEkU1kFr/sGTSYFrQw0zHWnSlIBLXjdrdAEVHnH1+VTJIVJ3Rg9tLbtCHOHVNaPEAXd61z84mWS+rjfvXbGnvWCdAN7N+qQDKUUkHXHUCO0dvhfE4J7rEXD/v3e7Yz+k6iG4F6DWxA==;25:Xr2ftoKE/YHgTzr82CUOebIi7tYfwCQGMm1d4lqJN+WixG5IdBRTJamCx2dS9A5rHsL0acXW0adqp6vVGw0Ddl7lS0zuMqKwYjAFwR2g2C4XYAKLnkiyLp53+KjjA7Xt6xAWDAm916DiVhfj5gjmsA83ErW8BsHwssPtO+M1i1Om9WqQHnfLM/GIc6XwrWwBj9fsAY3yyUjrdrI8nmPLeO635ysKApU2pmBzh1fHvIviRXINGU+767ySufz7IToO6k2HlEif4CLW0cVT1Hg6lOadMS/HA4ALk/Vx/VxuyMWoS9ORE59ibKapGsdpoAh7x6PjGMi8yB9r7d63WGWhPbGOMlaffQRPgBcc7rpXTbaX0++aRFubeTMySQWTH5/mpW18Kf6VCH5IH1toS9E25fVj8nUfA/P0zXKerIiqB8McyXe8LOLiOl2la/G0JUJ1wKNYfUtpmG9uvvQgS4Yac0SAqEfNgEZtJXBOgWfc2nM= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1338;31:BBb6DK71W91QicDZKw6cxmR761uppAv75b9WN8j8a+66mgZoYRVjtaCPR6+wRphLjRAubPvSaP23p2fy0c86d/ZxYzG92mHLUC48BLd38o+iWZemqCjkmOWQLB8fFuBU6nZvxeBj30QNZD3YGsacWtsgpyM2o/dUT8Fa3eZy+wXr95/UN1i2twPH//YGFmSxY92na4Iqc0/pbgyBCdt9RVmllCJs4DyArh9vIX26k1w=;20:4fm+zAgP5DB897sVzKgZ9L4D1G01RAECnwy6Hp7zLemMsKKwTtRVDht/sZ3AuKa9ZUrLWH8AWbeIBYM2pFbLVB6W43TlMFWj6EO+/uSJaefbGxg7Y0FMiZ3tdD6WFEyYksGCXmQDXsL45C4zNJbYcYn1B25IT5PLMmIkuOW51IHqCCuTAfdmts2ADFGCKsxFRdzPIHov29GeQY3S+/XxbblKiYDpBxOspp5hOX1hbUdLE6hHI1qVEkstdnT40ZLkScdrdmcJINxsu1/57YrLxieBvpVtG5m1Nhtnv+2rez4RgNnUwOBSIxglcTmpyrRN3CufwkfXJk6F4qnS4zvtNNYdjiThsdme0ilt2bc0RcfPhQSd+Q6S/AJPJPKCWJVGxYbQlo+UeKCGEGx3ZNHhyJfiAAX5sKojVso6BmHSLu4= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(104084551191319); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(10201501046)(3002001)(6041248)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123564025)(20161123558100)(20161123562025)(6072148);SRVR:HE1PR0801MB1338;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1338; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1338;4:Ltjcwx0mcrzGfpctMel/XMv5GblvTamLhYCJ2GsxPR8/Cp9M2ywMXwV8wSEHlZTdGPs5ZsFZF0aQvRDf5nG+PK24KccmKgaSmrwJ+Zeu5QKLJmgEtoL9FqjKq/RPX0m92nAUHvkA/LZq7aAI0cC+VUZkv9QGkQE3TK0o0xZxdXBtiRckZ0/s9+t6DFtv0zs/+66sxwPxYub1ryMgwNNQnFEwS22Xc5ze/gCCXvbokdiYbhNYneiQlon7J1bjZnffbFLv74LxBpk5mb2zncj30y8PDT3kM4Oz62OWSd7U/BPheddaVapZYi1qaFih/UL4OmYPmPAXV/dHdk6ncKipAgl8IRLrYQUhBWZn1K2Sdd/zEIZe06eocDO+wOJkY/VpsH0d6ui9WNJrBVnq/7fxbUkJYFLeQLU1wrLNgJp/Q9nkXzZnA9hupDnHdQNxyQQcGLgiDuwElWeqpdRSO7AG/3ZG453C3UfpX6zly9KD4TzHshiBL3M5w8xs32CBk6/MEx/3pGxPpfLJGdzJPoaQXnZiwkE7pJ+Qn2sZawhy8qhy7uNHXkaNhQ8DIWRI8h2htukdd6GWPq9/7capOyGokNX5NSLvzFc5yGkmN/RckQzLNkKuDToi2XOyxZVcDrD8ELexZz7Cyq/Sc48F6hxwRu9aPc8hS+nyLV5UKWhtDI1e7XVJfZRJ3N+JCPv7+bMfCuvqap/j6foBJ4HhFjh+OXpKTgq2Nz+lS48M7pGs/bZSGX6IDzlCtMGtWzUSFcXeZwas5tdd2q0X3qz2HZN8bOJ0Qd/Fh2Tgj6OMim8kRLoBwb3zh37CFXpBHo4IFBvqQ/FabHBx2/t6sZGMQUqDJA== X-Forefront-PRVS: 0316567485 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6069001)(6009001)(39840400002)(39450400003)(39410400002)(39400400002)(53936002)(23676002)(38730400002)(50466002)(9686003)(55016002)(25786009)(47776003)(3846002)(33646002)(6116002)(66066001)(86362001)(42186005)(61506002)(2201001)(230700001)(478600001)(2906002)(103116003)(6506006)(4001350100001)(50986999)(6666003)(54356999)(83506001)(189998001)(81166006)(8676002)(305945005)(5660300001)(7416002)(7736002)(921003)(1121003);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1338;H:localhost.localdomain;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtIRTFQUjA4MDFNQjEzMzg7MjM6Y2x5eTBHb21UeW9hdUhWYXhieDhaQUlZ?= =?utf-8?B?c2x4bThRSXJYQXZXakNyN3V6ak5KN1JwV0xvN0lUSWVGTFdWTkhIWHFQYXFu?= =?utf-8?B?MmR4L0xHUCtrdk9oTFFIV0pXaitmOXcydjU0TE9OdmoyOW82YUNFR0RZWk9w?= =?utf-8?B?enprTXhLYVpQMmJCUm5nUWlENko2WUM4dGpFNEFUNVhzTFdaUjBTclBNQXI1?= =?utf-8?B?NXg2SjlZelVWNWtsL0J0VHRhL1R3Wmd4bU5KV0hpcHgyZTBXR0lTV1RMN3dW?= =?utf-8?B?N1hnbWxSL2VVdmQ1M1ozcnVKNmxua0h2QVRxOC95b0RmMVk1eTRlZlExNnFW?= =?utf-8?B?eE1FQWd6UWoyOG04by9TalY2bjV3bVBCUTFaY1NXUTBuRENLQWdzUFF3Vjhz?= =?utf-8?B?Y0ttVmJqTCtxQmFTMFUrQ1FjVlVDTXBVMWh0alh0VER3Z2xUY2xpdWlkNFZX?= =?utf-8?B?MVJiNzI0dWhMNkk3aXRSWTh6L0kwdXpQMmE5NmloRDVrblJJZFNOVzJXc2tL?= =?utf-8?B?dCtVanNrVjVLWG0vdGRqeG9LTXpKejdXcmNtZ2FzR3I5dnhaSTZkdjBrbnZO?= =?utf-8?B?ME1iNWZDVTIwSXVISXdVdnNOOTFGTDhQOGIxYmw4TFZCNWhMY0tZYmh1SXQz?= =?utf-8?B?YXlvRnRlaTZoWUtadjV6Yk1xRDN1TTNIWjl0WGRYQlZIZll1VHVUOUNHQm1j?= =?utf-8?B?YXFWMFY3aHErN1djU2dndVpoOEJ0bnlFU3VjNm54UzFFb2M4ajFXSFVrNTdE?= =?utf-8?B?dTB2OWpTbStoZzVQQzYyQmtoeUN5M3pOWVRlclRpZnZkV1hwRjRvYjViaTRL?= =?utf-8?B?cDRhRlhBSGhPemI2K2g1NlF1d3FaeWdVOElMbnVBeEcxVE1LLzdxYjFzdUxi?= =?utf-8?B?cTFIMHFMYzZGVVBZQlUwR0p1V2w4UjhxUU5mMnpZOFJ5bU81NGIvWFYyMVJz?= =?utf-8?B?bnl2d24wZWloSnFOeUFveUsxdkhCY0RIMDJxNnhOb3IwWWFmaXdDUnM0Skkr?= =?utf-8?B?cFZlZndHeHdhTmd5bDA3cnNQdFlrQytNR2RkM21YOG5PZ2k0andIVm1hTHlj?= =?utf-8?B?dUNtTmNaaG9acU0yOFB0YUFnb1V0WVdEOUpnY1JpNUcrWVZUZWhFYW5VRGEy?= =?utf-8?B?VDM1N2pyOFNiR3Fjc1RHaWk0NXZLL2RNNVVvUEpnQUdkZ3VrOFEwbWtvMnFZ?= =?utf-8?B?eVpoWGhFV2plUGRxUjlEdEhGdjBzbmJKMXYwMkFJeTY1QTFMS3dHNWtKRzN5?= =?utf-8?B?NTYwN2hPUXZFcExYeFE3VEJWaThUR1U1bmtYLzFvVC9VZVZSWndSaWt3Mi9q?= =?utf-8?B?WVdaQU9YcHMxL29sbUkxNlpuTmZVSUlNcVFSVml5cTMzMnZmcXMxVElobUsz?= =?utf-8?B?aVNZMUcydGJFOEVvcVc2cE5QV29ZSWI3OGx0QkQ0ZHdGT0VSL3R1KzBPbng3?= =?utf-8?Q?aJtcGL2U=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1338;6:wCN7RDI7qLblbewy07KL8epI2F/uz4PxKTy4eboMkIeRoQ8Yz4cKxQZUXMZ8yMsWOTP2SfCuAUuc19O7UPicvfjaJD3ijcCyLaDlCXC3eOwXy9TpQp6nXytDcxB+ylfLpr1k2lO9E2KiMe1GE2WS1ZyvDjJSl7TB2+E7eJMCLzSF0RdLLzVZJDkGXoShSqMTKrpvgvLRzOjkOF3BIxHO5zMWH2rpzPFZU1M/YGNnG9m84XNvAXlPceb83apCS5jVj+GL1pku5VDlx0zzfFXEq+tEVfhreRqDlQq6LX5OuHWFf/GnpYKjUvPQgxEC1G9t5wlhML9yIzp7RskY3K99MK9oJGREH0/jwA9Mst7LAHboYdqTqLViCU2ehfv48beCkSRx9J5Qc5/pq+TTc6nVY3OMggARQFBfWl5ESmDYAUDeNH6Wh+GWkk6toNdM3d3U3M89zuWZr8ntHXX51Rj5mdvuivtEznXPaIByMXIkwslxe3ITpv7V5DqVJrYZtHcUcU4z3eYIn0kQx2eQTTUd+g==;5:v43PFcEgOl9sSCYjfCRFZQgAMyykoyLSqDOaV/vNjNMHLaiIAezqHkgIPusvOArDYFvPBhnr4rfk2GvrQCRYHzKTs5yR3hEHb3XsZP/rgqwNBLeumXVnot9WbNhLE+CNzZkY4l+dRiziWRLBdUW/BejArFXoTvCOof+YG5yn7rs=;24:c4JZURkfUeNZC9t1ONAXJb8YEdL5GXZLwnfrbu0GsTcB8X0tZDfsPaDRcRPFpRqn9jNrr8qKxLy5QEQboX+oK6Ck3ACZn6mLAfSHmxC+teQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1338;7:fdx08DVn5li7ujtvSwQyWtLfw11S/5lE6BDPDbHsXgIel6soPKlZvU7gyq/z5EwozPOireHEijZmxDpiS7TOL/ekHbVWEk5gGnf+q0lYWixEiA4n7eLVPdNbzp7lxqHUtMPu7ANlwARHGe3MR0/Le9/ddxu3G8oaOO2v7iDhbRmgxXwkKqfYA8nEg7toyND5HyC8ht/d7jyL/pMGFN0RGevEOYGO7K9dh3Yhi+zzpq92l1jLlTLwQd6kdgqLwXece/1f6k7zwDQT85QNimdY14Q98BN/m7YnFThA8oxH+4PE3/CT3QKrK6bfxCZsFKFSuL3ILCsQK6t++ZeerP4pfg==;20:emLgVaNpuG8jtc0RLATdbiFAiv2naC7gymZo23N7/oLbo8fF3PYo9T8cm0eraLIIt1IyzAd1F6gh346mSJ4AuoGsr6QNorbvd9ZiENvsi1+doRDTtPO/voUX8fw9/rntu+zw5t4Npei6qhwHzV1HT1iDOqbpPZCez0pCMeh8rPU= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2017 16:29:47.6829 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1338 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch prohibits pid allocation till child_reaper of pid namespace is set, and it makes possible and safe to get just unshared pid_ns from "/proc/[pid]/ns/pid_for_children" file. This may be useful to determine user_ns of such a created pid_ns, which is not possible now. It was prohibited till now, because the architecture of pid namespaces assumes child reaper is the firstly created process of the namespace, and it initializes pid_namespace::proc_mnt. Child reaper creation mustn't race with creation of another processes from this namespace, otherwise a process with pid > 1 may die before pid_namespace::proc_mnt is populated and it will get a null pointer dereference in proc_flush_task(). Also, child reaper mustn't die before processes from the namespace. The patch prevents such races. It allows to alloc_pid() only if ns->child_reaper is already set, and it guarantees, that pid_namespace::proc_mnt is already populated. Also, we do the assignment under the tasklist_lock in the copy_process() stage, when it can't fail. This guarantees the child_reaper will be hashed before the concurrent process, so the concurrent process can't die before it. When child reaper dies before the concurrent hashes to task list, fork() of the concurrent will aborts as it's prohibited after commit 3fd372262166: "pid_ns: Fix race between setns'ed fork() and zap_pid_ns_processes()". So, we can't safely allow to get "/proc/[pid]/ns/pid_for_children" since it's created. Signed-off-by: Kirill Tkhai CC: Andrew Morton CC: "Eric W. Biederman" CC: Oleg Nesterov CC: Andy Lutomirski CC: Serge Hallyn CC: Michal Hocko CC: Andrei Vagin CC: Cyrill Gorcunov CC: Mike Rapoport CC: Ingo Molnar CC: Peter Zijlstra --- kernel/pid.c | 3 ++- kernel/pid_namespace.c | 9 --------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/kernel/pid.c b/kernel/pid.c index fd1cde1e4576..eeeb01fdd87c 100644 --- a/kernel/pid.c +++ b/kernel/pid.c @@ -334,7 +334,8 @@ struct pid *alloc_pid(struct pid_namespace *ns) upid = pid->numbers + ns->level; spin_lock_irq(&pidmap_lock); - if (!(ns->nr_hashed & PIDNS_HASH_ADDING)) + if (!(ns->nr_hashed & PIDNS_HASH_ADDING) || + (!ns->child_reaper && !is_child_reaper(pid))) goto out_unlock; for ( ; upid >= pid->numbers; --upid) { hlist_add_head_rcu(&upid->pid_chain, diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index 74a5a7255b4d..51dd1d490542 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c @@ -385,15 +385,6 @@ static struct ns_common *pidns_for_children_get(struct task_struct *task) } task_unlock(task); - if (ns) { - read_lock(&tasklist_lock); - if (!ns->child_reaper) { - put_pid_ns(ns); - ns = NULL; - } - read_unlock(&tasklist_lock); - } - return ns ? &ns->ns : NULL; }