From patchwork Tue Feb 22 18:18:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Weiguo Li X-Patchwork-Id: 108048 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 614C9A034E; Tue, 22 Feb 2022 19:20:29 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0AECC4115C; Tue, 22 Feb 2022 19:19:37 +0100 (CET) Received: from out203-205-251-80.mail.qq.com (out203-205-251-80.mail.qq.com [203.205.251.80]) by mails.dpdk.org (Postfix) with ESMTP id 4BA0041145 for ; Tue, 22 Feb 2022 19:19:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1645553973; bh=f2ZOSh9v76jD3jQbTwD7a8KMowCv5PaSk37CMESd6Zc=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Q1NGkN0Fin+3HKUFMQ4kVxwE92Iik/ehxP7v46vXJFPnzPGEAeKLC8BYvfpc2PBzs YI9Kl+GmgxjKB/TJVXHtlmmCwYpyNfOjsteeUgm8voNmkPUnQ0alSgLWrs8NP9FxAP scFtjC68OXPMPj8YFUqIrRjO/mAd/8h8H8PQAftA= Received: from localhost.localdomain ([111.193.130.237]) by newxmesmtplogicsvrszc6.qq.com (NewEsmtp) with SMTP id 49223207; Wed, 23 Feb 2022 02:18:18 +0800 X-QQ-mid: xmsmtpt1645553968t3b8246ur Message-ID: X-QQ-XMAILINFO: M3ziZXKDk+iOWroA3Zcnq7vFOEjvsEbSmyT1svqABeGwVXMm+EkRWeFSKxG4Yw 6ZO2kRtR2FsRvRWIlJS6clf25tBITtoyzUituIApSmEMrfsaBMJFgpSWxHnKOvUVa59K/Wa8jFyN ZEBzjYz5T2M+w4mqRuvy5GMGIeaf/6TrZFpCXnBkzz28ikxNunsLbMIBItctFjM0Ljf/l+cLA0MT 9qm3CnDnei2t/flqah7Pwtir4eS2tpKHfaxSuKYBoszXjZiELAISbeFhrZ4BjpT1vqCmrBJYBBo6 dguzCeHr85nWDPMEVBDyyhFYDYHqhBwq3GirTt5ZK9Sbm0l6BUm4JExvR1QVzJO/Nxj5+Wh/u1Tc AkmIC14w9dd2OF7OUPJie34vQd5sZcyj2NSMoaeVnq+vCNMxbvh5TM+EFmbluzcvp7SHVGbEOYmf EMI1tgHfdZ8x5NVBCDn9YRPvsES5gWR57bmdkOEOUTAuGVGnaqodIW7ikYl9ERmUlk2/rA6Re6yR Ucvb17chQ/et/W2YNAaI11g/OyjMFp2Sfhrg3I9KBBmXJwPQNnAswcIRFgi2pb8PmHNgUYCdPs2e 4Ujf/DtiJDm4q7VsvnNfQryG8kPnG/KEo2ZsEownXgPjpojzJZYe9WME2x4Rqw32yZiasEbwy9uh Y23O2FBWWxeuZoQeE99o5vd0QSjPDmZo10eMjys6sb2MneQL4xPr8Zq2wF7TTmIkg63tYixiiZ9/ zxHJ21zGXj7BdFweM1TumLAVWb7pgLsq5RedFKU3RO/dlxqlpSePaGYqNwWJXPL7utzW3uwE0Nc3 UhTt1sKkIfEDWAdqJnA3GiOqwrvluInkGPr9+kvgfr4WsSaQsZJfr0TVGmzqih0umB8nPsJYnh4W x8HHRyNUwZfCyqoHDnJjGlnjnUOrsxTw== From: Weiguo Li To: dev@dpdk.org Cc: adypodoman@gmail.com, xiaoyun.li@intel.com, tianfei.zhang@intel.com, bruce.richardson@intel.com, ivan.malov@oktetlabs.ru, jgrajcia@cisco.com, hkalra@marvell.com, ying.a.wang@intel.com, ting.xu@intel.com, simei.su@intel.com, qiming.yang@intel.com, motih@mellanox.com, shreyansh.jain@nxp.com, skoteshwar@marvell.com, stephen@networkplumber.org, kalesh-anakkur.purayil@broadcom.com, somnath.kotur@broadcom.com, declan.doherty@intel.com, gakhil@marvell.com, nicolas.chautru@intel.com Subject: [PATCH 18/20] raw/ifpga/base: fix memory leaks in error handlings Date: Wed, 23 Feb 2022 02:18:16 +0800 X-OQ-MSGID: <770f3c34fdb4a473d509a1f45668af068227f5fa.1645551559.git.liwg06@foxmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 1) in ifpga_enumerate.c: The memory 'feature' is stored by TAILQ_INSERT_TAIL() at the end of the function. When function returned early in error handling, 'feature' is not released and leads to a memory leak. 2) in opae_eth_group.c and opae_i2c.c These function return 'dev' when success and return NULL when validation failed or some error occur. In the latter case 'dev' is not released and leads to a memory leak. Fixes: 56bb54ea1bdf ("raw/ifpga/base: add Intel FPGA OPAE share code") Fixes: 12f92a513a13 ("raw/ifpga/base: fix retimer link status") Fixes: 15d21c851028 ("raw/ifpga/base: add I2C and at24 EEPROM driver") Signed-off-by: Weiguo Li --- drivers/raw/ifpga/base/ifpga_enumerate.c | 10 ++++++++-- drivers/raw/ifpga/base/opae_eth_group.c | 1 + drivers/raw/ifpga/base/opae_i2c.c | 5 ++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/raw/ifpga/base/ifpga_enumerate.c b/drivers/raw/ifpga/base/ifpga_enumerate.c index 48b8af4587..ae7bc9326d 100644 --- a/drivers/raw/ifpga/base/ifpga_enumerate.c +++ b/drivers/raw/ifpga/base/ifpga_enumerate.c @@ -100,12 +100,16 @@ build_info_add_sub_feature(struct build_feature_devs_info *binfo, (unsigned long long)feature->phys_addr, size); if (vec_cnt) { - if (vec_start + vec_cnt <= vec_start) + if (vec_start + vec_cnt <= vec_start) { + opae_free(feature); return -EINVAL; + } ctx = zmalloc(sizeof(*ctx) * vec_cnt); - if (!ctx) + if (!ctx) { + opae_free(feature); return -ENOMEM; + } for (i = 0; i < vec_cnt; i++) { ctx[i].eventfd = -1; @@ -130,6 +134,8 @@ build_info_add_sub_feature(struct build_feature_devs_info *binfo, TAILQ_INSERT_TAIL(&hw->port[port_id].feature_list, feature, next); } else { + opae_free(feature->ctx); + opae_free(feature); return -EFAULT; } return ret; diff --git a/drivers/raw/ifpga/base/opae_eth_group.c b/drivers/raw/ifpga/base/opae_eth_group.c index be28954e05..cd9b2443c7 100644 --- a/drivers/raw/ifpga/base/opae_eth_group.c +++ b/drivers/raw/ifpga/base/opae_eth_group.c @@ -297,6 +297,7 @@ struct eth_group_device *eth_group_probe(void *base) if (eth_group_hw_init(dev)) { dev_err(dev, "eth group hw init fail\n"); + opae_free(dev); return NULL; } diff --git a/drivers/raw/ifpga/base/opae_i2c.c b/drivers/raw/ifpga/base/opae_i2c.c index 598eab5742..0a9abff14d 100644 --- a/drivers/raw/ifpga/base/opae_i2c.c +++ b/drivers/raw/ifpga/base/opae_i2c.c @@ -479,6 +479,7 @@ struct altera_i2c_dev *altera_i2c_probe(void *base) if (dev->i2c_param.devid != 0xEE011) { dev_err(dev, "find a invalid i2c master\n"); + opae_free(dev); return NULL; } @@ -494,8 +495,10 @@ struct altera_i2c_dev *altera_i2c_probe(void *base) dev->i2c_clk = dev->i2c_param.ref_clk * 1000000; dev->xfer = altera_i2c_xfer; - if (pthread_mutex_init(&dev->lock, NULL)) + if (pthread_mutex_init(&dev->lock, NULL)) { + opae_free(dev); return NULL; + } dev->mutex = &dev->lock; altera_i2c_hardware_init(dev);