From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id 8374A568E for ; Mon, 9 Mar 2015 09:58:39 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP; 09 Mar 2015 01:55:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,366,1422950400"; d="scan'208";a="677170779" Received: from shvmail01.sh.intel.com ([10.239.29.42]) by fmsmga001.fm.intel.com with ESMTP; 09 Mar 2015 01:58:19 -0700 Received: from shecgisg004.sh.intel.com (shecgisg004.sh.intel.com [10.239.29.89]) by shvmail01.sh.intel.com with ESMTP id t298wH6Z002237; Mon, 9 Mar 2015 16:58:17 +0800 Received: from shecgisg004.sh.intel.com (localhost [127.0.0.1]) by shecgisg004.sh.intel.com (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id t298wEvG028812; Mon, 9 Mar 2015 16:58:16 +0800 Received: (from couyang@localhost) by shecgisg004.sh.intel.com (8.13.6/8.13.6/Submit) id t298wDkU028808; Mon, 9 Mar 2015 16:58:13 +0800 From: Ouyang Changchun To: dev@dpdk.org Date: Mon, 9 Mar 2015 16:58:11 +0800 Message-Id: <1425891491-28779-1-git-send-email-changchun.ouyang@intel.com> X-Mailer: git-send-email 1.7.12.2 In-Reply-To: <1425872941-26481-1-git-send-email-changchun.ouyang@intel.com> References: <1425872941-26481-1-git-send-email-changchun.ouyang@intel.com> Subject: [dpdk-dev] [PATCH v5] af_packet: Fix some klocwork errors X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 09 Mar 2015 08:58:40 -0000 Fix possible memory leak issue: free kvlist before return; Fix possible resource lost issue: close qssockfd before return; Signed-off-by: Changchun Ouyang --- Change in v5: - Initialize qsockfd with -1; Change in v4: - Check sockfd in internals->rx_queue against 0. Change in v3: - Also close sockets for all queues. Change in v2: - Make the error exit point a common path. lib/librte_pmd_af_packet/rte_eth_af_packet.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/librte_pmd_af_packet/rte_eth_af_packet.c b/lib/librte_pmd_af_packet/rte_eth_af_packet.c index 80e9bdf..2a27ebc 100644 --- a/lib/librte_pmd_af_packet/rte_eth_af_packet.c +++ b/lib/librte_pmd_af_packet/rte_eth_af_packet.c @@ -442,7 +442,8 @@ rte_pmd_init_internals(const char *name, struct tpacket_req *req; struct pkt_rx_queue *rx_queue; struct pkt_tx_queue *tx_queue; - int rc, qsockfd, tpver, discard; + int rc, tpver, discard; + int qsockfd = -1; unsigned int i, q, rdsize; int fanout_arg __rte_unused, bypass __rte_unused; @@ -691,9 +692,14 @@ error: rte_free((*internals)->rx_queue[q].rd); if ((*internals)->tx_queue[q].rd) rte_free((*internals)->tx_queue[q].rd); + if (((*internals)->rx_queue[q].sockfd != 0) && + ((*internals)->rx_queue[q].sockfd != qsockfd)) + close((*internals)->rx_queue[q].sockfd); } rte_free(*internals); } + if (qsockfd != -1) + close(qsockfd); return -1; } @@ -823,16 +829,21 @@ rte_pmd_af_packet_devinit(const char *name, const char *params) ret = rte_kvargs_process(kvlist, ETH_AF_PACKET_IFACE_ARG, &open_packet_iface, &sockfd); if (ret < 0) - return -1; + goto error; } ret = rte_eth_from_packet(name, &sockfd, numa_node, kvlist); close(sockfd); /* no longer needed */ if (ret < 0) - return -1; + goto error; + rte_kvargs_free(kvlist); return 0; + +error: + rte_kvargs_free(kvlist); + return -1; } static struct rte_driver pmd_af_packet_drv = { -- 1.8.4.2