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 <jie1x.w...@intel.com> --- 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 <iavf.h> #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; } -- 2.25.1