From patchwork Sat Oct 8 06:34:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jie Wang X-Patchwork-Id: 117662 X-Patchwork-Delegate: qi.z.zhang@intel.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 E9F08A0542; Sat, 8 Oct 2022 08:35:18 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DF5A54021E; Sat, 8 Oct 2022 08:35:18 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id 4E7A440042 for ; Sat, 8 Oct 2022 08:35:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1665210918; x=1696746918; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=cwCxv9wqH5aTAK+qy4kAV9o36M/T92GDdnG0vufqz68=; b=Iivl6UVVxFpV4jyGFluht1a7tsCGnc7xYX+kU7eUIQXKePdxvcE9jQ0e ptynHu93MYWdRLCMNNgfdaPVrP2SXf8OAsZfy574phZKo6nFE1GgJBRZJ qlgisO9PNuGizBBlAvDETG0oSvi6KdmeVRdiLdp0uInYv5oou3eV+AZsW /Id7hdRKGnJB68uAzrkx16+bt2dJrVJ4SHnrUsLUxofFdafTcxFUGM2q/ ci/MWjBiyUfPn8PLnMCalSteYGQOobw5jNqtWWKfyZ1Ftvszi4fw33bT7 npU49Jl4ERppWhvih5zcYE1CJ2ItozhY1Hg5UepMeeJRl7fSdNyUPkj8+ w==; X-IronPort-AV: E=McAfee;i="6500,9779,10493"; a="368040721" X-IronPort-AV: E=Sophos;i="5.95,169,1661842800"; d="scan'208";a="368040721" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Oct 2022 23:35:17 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10493"; a="954325657" X-IronPort-AV: E=Sophos;i="5.95,169,1661842800"; d="scan'208";a="954325657" Received: from intel-cd-odc-gavin.cd.intel.com ([10.240.178.187]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Oct 2022 23:35:14 -0700 From: Jie Wang To: dev@dpdk.org Cc: stevex.yang@intel.com, qi.z.zhang@intel.com, qiming.yang@intel.com, jingjing.wu@intel.com, beilei.xing@intel.com, Jie Wang Subject: [PATCH] net/iavf: fix memory leak in flow subscription Date: Sat, 8 Oct 2022 14:34:01 +0800 Message-Id: <20221008063401.10060-1-jie1x.wang@intel.com> X-Mailer: git-send-email 2.25.1 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 When creating flow subscription pattern that it might cause a memory leak. This patch fix the error by adding a free memory code. And some typos have also been fixed. Coverity issue: 381130 Fixes: b110b2f63e50 ("net/iavf: add flow subscrption supported pattern") Fixes: 6416f63aae8b ("net/iavf: support flow subscription rule") Signed-off-by: Jie Wang Acked-by: Qi Zhang --- drivers/net/iavf/iavf_fsub.c | 22 ++++++++++++---------- drivers/net/iavf/iavf_vchnl.c | 16 ++++++++++------ 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/drivers/net/iavf/iavf_fsub.c b/drivers/net/iavf/iavf_fsub.c index 3bb6c30d3c..3be75923a5 100644 --- a/drivers/net/iavf/iavf_fsub.c +++ b/drivers/net/iavf/iavf_fsub.c @@ -21,7 +21,6 @@ #include #include "iavf_generic_flow.h" - #define MAX_QGRP_NUM_TYPE 7 #define IAVF_IPV6_ADDR_LENGTH 16 #define MAX_INPUT_SET_BYTE 32 @@ -95,6 +94,7 @@ iavf_fsub_create(struct iavf_adapter *ad, struct rte_flow *flow, rte_memcpy(rule, filter, sizeof(*rule)); flow->rule = rule; + rte_free(meta); return ret; free_entry: @@ -414,7 +414,7 @@ iavf_fsub_parse_pattern(const struct rte_flow_item pattern[], VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, S_VLAN); - if (vlan_spec && vlan_spec) { + if (vlan_spec && vlan_mask) { input = &outer_input_set; *input |= IAVF_INSET_VLAN_OUTER; @@ -578,7 +578,7 @@ iavf_fsub_parse_action(struct iavf_adapter *ad, error1: rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, actions, - "Invalid ethdev_port_id"); + "Invalid port id"); return -rte_errno; error2: @@ -662,14 +662,16 @@ iavf_fsub_parse(struct iavf_adapter *ad, rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_HANDLE, NULL, "No memory for iavf_fsub_conf_ptr"); - goto error; + return -ENOMEM; } /* search flow subscribe pattern */ pattern_match_item = iavf_search_pattern_match_item(pattern, array, array_len, error); - if (!pattern_match_item) - return -rte_errno; + if (!pattern_match_item) { + ret = -rte_errno; + goto error; + } /* parse flow subscribe pattern */ ret = iavf_fsub_parse_pattern(pattern, @@ -686,13 +688,13 @@ iavf_fsub_parse(struct iavf_adapter *ad, /* parse flow subscribe pattern action */ ret = iavf_fsub_parse_action((void *)ad, actions, priority, error, filter); - if (ret) - goto error; - if (meta) +error: + if (!ret && meta) *meta = filter; + else + rte_free(filter); -error: rte_free(pattern_match_item); return ret; } diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index cc0db8d093..30567ea6e9 100644 --- a/drivers/net/iavf/iavf_vchnl.c +++ b/drivers/net/iavf/iavf_vchnl.c @@ -1524,14 +1524,14 @@ iavf_fdir_check(struct iavf_adapter *adapter, PMD_DRV_LOG(ERR, "Failed to check rule request due to parameters validation" " or HW doesn't support"); - return -1; + err = -1; } else { PMD_DRV_LOG(ERR, "Failed to check rule request due to other reasons"); - return -1; + err = -1; } - return 0; + return err; } int @@ -1553,9 +1553,11 @@ iavf_flow_sub(struct iavf_adapter *adapter, struct iavf_fsub_conf *filter) args.out_size = IAVF_AQ_BUF_SZ; err = iavf_execute_vf_cmd(adapter, &args, 0); - if (err) + if (err) { PMD_DRV_LOG(ERR, "Failed to execute command of " "OP_FLOW_SUBSCRIBE"); + return err; + } fsub_cfg = (struct virtchnl_flow_sub *)args.out_buffer; filter->flow_id = fsub_cfg->flow_id; @@ -1602,9 +1604,11 @@ iavf_flow_unsub(struct iavf_adapter *adapter, struct iavf_fsub_conf *filter) args.out_size = IAVF_AQ_BUF_SZ; err = iavf_execute_vf_cmd(adapter, &args, 0); - if (err) + if (err) { PMD_DRV_LOG(ERR, "Failed to execute command of " "OP_FLOW_UNSUBSCRIBE"); + return err; + } unsub_cfg = (struct virtchnl_flow_unsub *)args.out_buffer; @@ -1644,7 +1648,7 @@ iavf_flow_sub_check(struct iavf_adapter *adapter, err = iavf_execute_vf_cmd(adapter, &args, 0); if (err) { - PMD_DRV_LOG(ERR, "fail to check flow director rule"); + PMD_DRV_LOG(ERR, "Failed to check flow subscription rule"); return err; }