Received: by 2002:a89:413:0:b0:1fd:dba5:e537 with SMTP id m19csp798311lqs; Fri, 14 Jun 2024 06:10:40 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCW9ayGjqoIMa+DYYL4Aq1zNAgU9k8laxEOoRqc+hlitL692wql+X+tyKh/Nc1mQBYtAnmvIF9Cvybjap2LEt0HDg5Qce0rFI22oBDGbHw== X-Google-Smtp-Source: AGHT+IH0/ZYz/envp59w3yhlGQEVPZthQ2NKT6LIojpd67mRF/+g1sZxsu9+toOl8e9+czsuoZo4 X-Received: by 2002:a05:620a:29cb:b0:794:f330:6caa with SMTP id af79cd13be357-798d258e3e3mr276612785a.58.1718370640316; Fri, 14 Jun 2024 06:10:40 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1718370640; cv=pass; d=google.com; s=arc-20160816; b=f5NKdnzG3hBcW6M13DioXKVXwIHFi/+jU4sTsNyGqwLyP4IqWxMoASdhS5EO5EULDJ THZ2Rkrr4U6Q+BkuriViKIk7uPYR2eIDBolDj6IAZzYn8HPLwaMFebOzCkTqTl1ql2xC ZenZDrvTdidBZS+mYgEauL4j1ArXxVw8HAZP0Jq0+110KlEYgsnf0OQVkyIQt+iL6CIU r40WMCoRsrs0TB1xgLbvmkf2v7iV/E7SQjB0upXL9QplD2kp5WGEMAAMgfVRGiSL/KS/ YlK1vp9k6w9L9qM4+PhTlXzN3a2BfNLAHTlrFWm65JFy0RUea1BsXBaammG7ML0/0Y1a sT+A== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from; bh=yCXKcnpk5yaFJiRUrV/W1zkkAWPNSlThV0elwsdxpX4=; fh=LYgZFUulv2QQjub4Ab7bMp8ukg+C3Y0KTIminrgDL3A=; b=MJRAzMVLlLdUdROGh3IGjIN1CQOwXxHk2TysOH6BVqNknAat2A/ICK4WdGThm1ouRK KIgUdsazoZGjWSxq85LLmVCyWouXgs/laEL1VgFH7231ovznEC4HqUpHR+/4re78239V 4Ue/UwmkEynK3vm7ru2X6KcjY1PwInkLZTTk0FDmg4efm/ZZywGc2SDuDW4QTaz+IhQZ VuylbSn7P7czd64Me0+ttodeEJMg2UkcWVRcvGjVoDSMgcPoVkAQwjguyPj3AX1ZhUea IY13gprZ7yYajZXUXn08gSG25NpIiJzc8QUXs2iCFEzrnNrJ6HKG6m+7yhkhNKomC5rH LA2A==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=huawei.com dmarc=pass fromdomain=huawei.com); spf=pass (google.com: domain of linux-kernel+bounces-214929-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-214929-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id af79cd13be357-798abe57b4csi367396385a.578.2024.06.14.06.10.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Jun 2024 06:10:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-214929-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=huawei.com dmarc=pass fromdomain=huawei.com); spf=pass (google.com: domain of linux-kernel+bounces-214929-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-214929-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id F1CED1C211B6 for ; Fri, 14 Jun 2024 13:10:39 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6C2E319AA6A; Fri, 14 Jun 2024 13:10:32 +0000 (UTC) Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0B2CE26ACA; Fri, 14 Jun 2024 13:10:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.187 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718370631; cv=none; b=frmhxxoqsck0gHU8Oek7YTxHzpKTXEHM+QTrQL3WtPm1MS7w2wppVJfKdCN5OB6Dn5racH2FPwY6KAxFIF9TkBm/XxCq+G24nChfxs4mwVuTFfAHeyJfc+8DZSlFlLpXSsqw+ctH0hMu4YBW8C9p4b7Uj/hQ6soc2aamGa/0l10= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718370631; c=relaxed/simple; bh=t6/aZbBkHavmNxAjU9DaKNPdfyzRr5nCb9srEUp31QI=; h=From:To:CC:Subject:Date:Message-ID:MIME-Version:Content-Type; b=qRN4MqeoldQ1LtJYW/y8V8BSjAfyyJsW5QpEDUdP8k5M4JFVEnGIfpMJtJYwXgBAcJ4bXpjceHxghsFx1VA4e7rLf8BmlNSfsGKmG3h0xghTANANBtQocsIQiFgFnwdQJFra4kPCo5kl7/CW2/xzSqQYWOO93b15miSKJI2XWuo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.187 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.163.48]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4W10033k6XzwSSq; Fri, 14 Jun 2024 21:06:11 +0800 (CST) Received: from canpemm500007.china.huawei.com (unknown [7.192.104.62]) by mail.maildlp.com (Postfix) with ESMTPS id 24AF5180081; Fri, 14 Jun 2024 21:10:20 +0800 (CST) Received: from huawei.com (10.175.101.6) by canpemm500007.china.huawei.com (7.192.104.62) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Fri, 14 Jun 2024 21:10:19 +0800 From: Yue Haibing To: , , , , CC: , , Subject: [PATCH] netns: Make get_net_ns() handle zero refcount net Date: Fri, 14 Jun 2024 21:13:02 +0800 Message-ID: <20240614131302.2698509-1-yuehaibing@huawei.com> X-Mailer: git-send-email 2.34.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To canpemm500007.china.huawei.com (7.192.104.62) Syzkaller hit a warning: refcount_t: addition on 0; use-after-free. WARNING: CPU: 3 PID: 7890 at lib/refcount.c:25 refcount_warn_saturate+0xdf/0x1d0 Modules linked in: CPU: 3 PID: 7890 Comm: tun Not tainted 6.10.0-rc3-00100-gcaa4f9578aba-dirty #310 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 RIP: 0010:refcount_warn_saturate+0xdf/0x1d0 Code: 41 49 04 31 ff 89 de e8 9f 1e cd fe 84 db 75 9c e8 76 26 cd fe c6 05 b6 41 49 04 01 90 48 c7 c7 b8 8e 25 86 e8 d2 05 b5 fe 90 <0f> 0b 90 90 e9 79 ff ff ff e8 53 26 cd fe 0f b6 1 RSP: 0018:ffff8881067b7da0 EFLAGS: 00010286 RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffffff811c72ac RDX: ffff8881026a2140 RSI: ffffffff811c72b5 RDI: 0000000000000001 RBP: ffff8881067b7db0 R08: 0000000000000000 R09: 205b5d3730353139 R10: 0000000000000000 R11: 205d303938375420 R12: ffff8881086500c4 R13: ffff8881086500c4 R14: ffff8881086500b0 R15: ffff888108650040 FS: 00007f5b2961a4c0(0000) GS:ffff88823bd00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000055d7ed36fd18 CR3: 00000001482f6000 CR4: 00000000000006f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: ? show_regs+0xa3/0xc0 ? __warn+0xa5/0x1c0 ? refcount_warn_saturate+0xdf/0x1d0 ? report_bug+0x1fc/0x2d0 ? refcount_warn_saturate+0xdf/0x1d0 ? handle_bug+0xa1/0x110 ? exc_invalid_op+0x3c/0xb0 ? asm_exc_invalid_op+0x1f/0x30 ? __warn_printk+0xcc/0x140 ? __warn_printk+0xd5/0x140 ? refcount_warn_saturate+0xdf/0x1d0 get_net_ns+0xa4/0xc0 ? __pfx_get_net_ns+0x10/0x10 open_related_ns+0x5a/0x130 __tun_chr_ioctl+0x1616/0x2370 ? __sanitizer_cov_trace_switch+0x58/0xa0 ? __sanitizer_cov_trace_const_cmp2+0x1c/0x30 ? __pfx_tun_chr_ioctl+0x10/0x10 tun_chr_ioctl+0x2f/0x40 __x64_sys_ioctl+0x11b/0x160 x64_sys_call+0x1211/0x20d0 do_syscall_64+0x9e/0x1d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f5b28f165d7 Code: b3 66 90 48 8b 05 b1 48 2d 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 81 48 2d 00 8 RSP: 002b:00007ffc2b59c5e8 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f5b28f165d7 RDX: 0000000000000000 RSI: 00000000000054e3 RDI: 0000000000000003 RBP: 00007ffc2b59c650 R08: 00007f5b291ed8c0 R09: 00007f5b2961a4c0 R10: 0000000029690010 R11: 0000000000000246 R12: 0000000000400730 R13: 00007ffc2b59cf40 R14: 0000000000000000 R15: 0000000000000000 Kernel panic - not syncing: kernel: panic_on_warn set ... This is trigger as below: ns0 ns1 tun_set_iff() //dev is tun0 tun->dev = dev //ip link set tun0 netns ns1 put_net() //ref is 0 __tun_chr_ioctl() //TUNGETDEVNETNS net = dev_net(tun->dev); open_related_ns(&net->ns, get_net_ns); //ns1 get_net_ns() get_net() //addition on 0 Use maybe_get_net() in get_net_ns in case net's ref is zero to fix this Fixes: 0c3e0e3bb623 ("tun: Add ioctl() TUNGETDEVNETNS cmd to allow obtaining real net ns of tun device") Signed-off-by: Yue Haibing --- net/core/net_namespace.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 4f7a61688d18..6a823ba906c6 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -693,11 +693,16 @@ EXPORT_SYMBOL_GPL(__put_net); * get_net_ns - increment the refcount of the network namespace * @ns: common namespace (net) * - * Returns the net's common namespace. + * Returns the net's common namespace or ERR_PTR() if ref is zero. */ struct ns_common *get_net_ns(struct ns_common *ns) { - return &get_net(container_of(ns, struct net, ns))->ns; + struct net *net; + + net = maybe_get_net(container_of(ns, struct net, ns)); + if (net) + return &net->ns; + return ERR_PTR(-EINVAL); } EXPORT_SYMBOL_GPL(get_net_ns); -- 2.34.1