From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from rnd-relay.smtp.broadcom.com (rnd-relay.smtp.broadcom.com [192.19.229.170]) by dpdk.org (Postfix) with ESMTP id 827C21B2BE for ; Tue, 10 Oct 2017 16:23:07 +0200 (CEST) Received: from mail-irv-17.broadcom.com (mail-irv-17.lvn.broadcom.net [10.75.224.233]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id 4D75C30C035; Tue, 10 Oct 2017 07:23:06 -0700 (PDT) Received: from C02PT1RBG8WP.vpn.broadcom.net (unknown [10.10.115.198]) by mail-irv-17.broadcom.com (Postfix) with ESMTP id CBFF081EB1; Tue, 10 Oct 2017 07:23:05 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Tue, 10 Oct 2017 09:23:00 -0500 Message-Id: <20171010142303.17433-2-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.13.5 (Apple Git-94) In-Reply-To: <20171010142303.17433-1-ajit.khaparde@broadcom.com> References: <20171010142303.17433-1-ajit.khaparde@broadcom.com> Subject: [dpdk-dev] [PATCH 1/4] net/bnxt: fix cleanup if a filter allocation fails X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 Oct 2017 14:23:07 -0000 We are not checking if a filter allocation succeeded. And we end up accessing a null pointer after that. Also invalidate the fw_l2_filter_id to prevent unnecessary HW access and hence HWRM command failures during exit. Signed-off-by: Ajit Khaparde --- drivers/net/bnxt/bnxt_filter.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/net/bnxt/bnxt_filter.c b/drivers/net/bnxt/bnxt_filter.c index 9f171fd99..4c1db559d 100644 --- a/drivers/net/bnxt/bnxt_filter.c +++ b/drivers/net/bnxt/bnxt_filter.c @@ -828,12 +828,20 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, } filter->dst_id = vnic->fw_vnic_id; filter1 = bnxt_get_l2_filter(bp, filter, vnic); + if (filter1 == NULL) { + rc = -ENOSPC; + goto ret; + } filter->fw_l2_filter_id = filter1->fw_l2_filter_id; RTE_LOG(DEBUG, PMD, "VNIC found\n"); break; case RTE_FLOW_ACTION_TYPE_DROP: vnic0 = STAILQ_FIRST(&bp->ff_pool[0]); filter1 = bnxt_get_l2_filter(bp, filter, vnic0); + if (filter1 == NULL) { + rc = -ENOSPC; + goto ret; + } filter->fw_l2_filter_id = filter1->fw_l2_filter_id; if (filter->filter_type == HWRM_CFA_EM_FILTER) filter->flags = @@ -845,6 +853,10 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, case RTE_FLOW_ACTION_TYPE_COUNT: vnic0 = STAILQ_FIRST(&bp->ff_pool[0]); filter1 = bnxt_get_l2_filter(bp, filter, vnic0); + if (filter1 == NULL) { + rc = -ENOSPC; + goto ret; + } filter->fw_l2_filter_id = filter1->fw_l2_filter_id; filter->flags = HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_FLAGS_METER; break; @@ -892,6 +904,7 @@ bnxt_flow_validate(struct rte_eth_dev *dev, ret = bnxt_validate_and_parse_flow(dev, pattern, actions, attr, error, filter); /* No need to hold on to this filter if we are just validating flow */ + filter->fw_l2_filter_id = -1; bnxt_free_filter(bp, filter); return ret; @@ -961,6 +974,7 @@ bnxt_flow_create(struct rte_eth_dev *dev, return flow; } free_filter: + filter->fw_l2_filter_id = -1; bnxt_free_filter(bp, filter); free_flow: RTE_LOG(ERR, PMD, "Failed to create flow.\n"); -- 2.13.5 (Apple Git-94)