Received: by 2002:a05:7412:8d1c:b0:fa:4c10:6cad with SMTP id bj28csp230021rdb; Tue, 16 Jan 2024 23:19:15 -0800 (PST) X-Google-Smtp-Source: AGHT+IHNgaVtsL7VtABFEChA3frfPw6JzONMLbbvqouPEtViggqsYC0Gl8v+oNe2midch51ldRDT X-Received: by 2002:a7b:c34d:0:b0:40e:4f1f:5069 with SMTP id l13-20020a7bc34d000000b0040e4f1f5069mr4674986wmj.85.1705475955438; Tue, 16 Jan 2024 23:19:15 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705475955; cv=pass; d=google.com; s=arc-20160816; b=euYvRdoGyywKb4NNxzs2pAhUHmeTJ6dWxUmeu0zAvhjThv7zG1BUsD7glpAWLL3fo6 cwFanrGGCTc1caeeB9/0OQ5rnU6RgnDdcFNDX9uniqHPmAfC8UfGEWc7UvLFYjkc9TsZ X6oSwtLtgWVX5KKmjfmjTl7eRv3Wj3Y51kODoxelIlRZsdmjcrdmV8UPHbD2eoM+7upB D/n9c7A71wmAHNrX+7TVcNhxJJFPCK4fWZNPl6pCrrO76RgOK+BV83iwwCfBL1t/huJW 1e15T+kDN/OTabaqTttH60Ak7/StupbzhpXpPRBLd4sYdu7PAne9LhQgtfzk7jxSXyqa WS0Q== 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=Cs0wM5acdZ3MnmmqGA+OsEaivbPGXZPyL0OAcd6s3qo=; fh=/Gu90RCdx+gNxSpHGyvqQQX/gt6LIkzdEDoQg/3nweQ=; b=TngwheqRMdqhje2g6NmI/8JL+vrcZC9RbqJc4qs/rlu0o9aE+kSGGuHgkctmdA6Z1i sxPLsyPw34/8FU40jEWYSiSOuPxSXWEHdB3W8c+oG2LgGDDz/ksM0VgBVnr8/TbC9NjF u0CJotCfYz+T3lGpuFaLqd91dcLPnVJUc05Mn4kgaZN+vRYrI7nVy2/ouTplOPIlyJKd tDHnPYiJTmnY2omNIOn4Aa6/xW0uKPob7AjIYLsirVGDQCdUjZoOvzZje9/XWPuNapDq vppTxlho4iXE+6fRzhp8t23FTBoedzUWdSRZLoWI4YAHU48H80uj821nUeXfqnNGjT4e kzeg== ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=zju.edu.cn); spf=pass (google.com: domain of linux-kernel+bounces-28591-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-28591-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id ka11-20020a170907990b00b00a2c0f5af3c9si5535991ejc.501.2024.01.16.23.19.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Jan 2024 23:19:15 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-28591-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; arc=pass (i=1 spf=pass spfdomain=zju.edu.cn); spf=pass (google.com: domain of linux-kernel+bounces-28591-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-28591-linux.lists.archive=gmail.com@vger.kernel.org" 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 am.mirrors.kernel.org (Postfix) with ESMTPS id 33F291F23C30 for ; Wed, 17 Jan 2024 07:19:15 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8EB32BA29; Wed, 17 Jan 2024 07:19:03 +0000 (UTC) Received: from zg8tmtu5ljg5lje1ms4xmtka.icoremail.net (zg8tmtu5ljg5lje1ms4xmtka.icoremail.net [159.89.151.119]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DAE46BE4B; Wed, 17 Jan 2024 07:18:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.89.151.119 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705475943; cv=none; b=d4rdt5YLSSvJmZ5+6wramdRkshhoTra64ge0axC98qoRL+/JKV0emrm/Yjw1kupow1a+t8rq3F6M4FbT29dGPkGTdnAsqG8s0dmnwCzccscUjSt7Az6tyhdBMMnIw0qx50lvYZl9xEd4y0OIA0LCSnKJTLOak5PoapINlnKxZIc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705475943; c=relaxed/simple; bh=hZ88PNWUGoAAdWlQDB8eDVUHlouB8wVqbz1xnNHCSVM=; h=Received:From:To:Cc:Subject:Date:Message-Id:X-Mailer:MIME-Version: Content-Transfer-Encoding:X-CM-TRANSID:X-Coremail-Antispam: X-CM-SenderInfo; b=AfAPnn+Omft4O8ThcytFcMfwAyN475iG4qH63C5XYPHX7oQXZZeP+/6nQNIT7GCoRS8CT1wTE6Bb2cXwNMKCKWRN7KTxJ/PpI7DBCVrgQz5osNtvoz6DB9AM6XDM8ODQXOe0N38MB/IMwA+4IGWItBjjmI3Xi5a3t15S9i4U/3w= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=zju.edu.cn; spf=pass smtp.mailfrom=zju.edu.cn; arc=none smtp.client-ip=159.89.151.119 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=zju.edu.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zju.edu.cn Received: from luzhipeng.223.5.5.5 (unknown [183.159.170.179]) by mail-app2 (Coremail) with SMTP id by_KCgDHCalVf6dl3xE6AA--.28076S2; Wed, 17 Jan 2024 15:18:45 +0800 (CST) From: Zhipeng Lu To: alexious@zju.edu.cn Cc: Saeed Mahameed , Leon Romanovsky , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Maor Gottlieb , netdev@vger.kernel.org, linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net v4] net/mlx5e: fix a double-free in arfs_create_groups Date: Wed, 17 Jan 2024 15:17:36 +0800 Message-Id: <20240117071736.3813981-1-alexious@zju.edu.cn> 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 X-CM-TRANSID:by_KCgDHCalVf6dl3xE6AA--.28076S2 X-Coremail-Antispam: 1UD129KBjvJXoWxZrWUGFW5urWDAw4xKrWDCFg_yoW5XF1rpF 47JryDtFs5A3WxX39Iy3yvqrn5Cw48Ka1UuFyI934SqrsFyr4kGFyFg345AFWxCFy3A3sF yasYvw1UCFnrCwUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9C14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26w1j6s0DM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26rxl 6s0DM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s 0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xII jxv20xvE14v26r106r15McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr 1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7M4IIrI8v6xkF7I0E8cxa n2IY04v7MxkF7I0En4kS14v26r1q6r43MxkIecxEwVAFwVW8CwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxK x2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI 0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUGFAJUUUUU= X-CM-SenderInfo: qrsrjiarszq6lmxovvfxof0/ When `in` allocated by kvzalloc fails, arfs_create_groups will free ft->g and return an error. However, arfs_create_table, the only caller of arfs_create_groups, will hold this error and call to mlx5e_destroy_flow_table, in which the ft->g will be freed again. Fixes: 1cabe6b0965e ("net/mlx5e: Create aRFS flow tables") Signed-off-by: Zhipeng Lu --- Changelog: v2: free ft->g just in arfs_create_groups with a unwind ladder. v3: split the allocation of ft->g and in. Rename the error label. remove some refector change in v2. v4: correct some space issue. --- .../net/ethernet/mellanox/mlx5/core/en_arfs.c | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c b/drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c index bb7f86c993e5..e66f486faafe 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c @@ -254,11 +254,13 @@ static int arfs_create_groups(struct mlx5e_flow_table *ft, ft->g = kcalloc(MLX5E_ARFS_NUM_GROUPS, sizeof(*ft->g), GFP_KERNEL); - in = kvzalloc(inlen, GFP_KERNEL); - if (!in || !ft->g) { - kfree(ft->g); - kvfree(in); + if (!ft->g) return -ENOMEM; + + in = kvzalloc(inlen, GFP_KERNEL); + if (!in) { + err = -ENOMEM; + goto err_free_g; } mc = MLX5_ADDR_OF(create_flow_group_in, in, match_criteria); @@ -278,7 +280,7 @@ static int arfs_create_groups(struct mlx5e_flow_table *ft, break; default: err = -EINVAL; - goto out; + goto err_free_in; } switch (type) { @@ -300,7 +302,7 @@ static int arfs_create_groups(struct mlx5e_flow_table *ft, break; default: err = -EINVAL; - goto out; + goto err_free_in; } MLX5_SET_CFG(in, match_criteria_enable, MLX5_MATCH_OUTER_HEADERS); @@ -309,7 +311,7 @@ static int arfs_create_groups(struct mlx5e_flow_table *ft, MLX5_SET_CFG(in, end_flow_index, ix - 1); ft->g[ft->num_groups] = mlx5_create_flow_group(ft->t, in); if (IS_ERR(ft->g[ft->num_groups])) - goto err; + goto err_clean_group; ft->num_groups++; memset(in, 0, inlen); @@ -318,18 +320,20 @@ static int arfs_create_groups(struct mlx5e_flow_table *ft, MLX5_SET_CFG(in, end_flow_index, ix - 1); ft->g[ft->num_groups] = mlx5_create_flow_group(ft->t, in); if (IS_ERR(ft->g[ft->num_groups])) - goto err; + goto err_clean_group; ft->num_groups++; kvfree(in); return 0; -err: +err_clean_group: err = PTR_ERR(ft->g[ft->num_groups]); ft->g[ft->num_groups] = NULL; -out: +err_free_in: kvfree(in); - +err_free_g: + kfree(ft->g); + ft->g = NULL; return err; } -- 2.34.1