1) When 'ice_get_parser_list()' fails and return, 'parser_node' is not released, we can move the parser list action ahead of the memory allocation to avoid this memory leak. 2) In another error handling branch, we release 'parser_node' directly to avoid the memory leak.
Fixes: 7615a6895009cb ("net/ice: rework for generic flow enabling") Signed-off-by: Weiguo Li <liw...@foxmail.com> --- drivers/net/ice/ice_generic_flow.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/net/ice/ice_generic_flow.c b/drivers/net/ice/ice_generic_flow.c index 53b1c0b69a..e3df090186 100644 --- a/drivers/net/ice/ice_generic_flow.c +++ b/drivers/net/ice/ice_generic_flow.c @@ -1920,6 +1920,10 @@ ice_register_parser(struct ice_flow_parser *parser, struct ice_flow_parser_node *existing_node; void *temp; + list = ice_get_parser_list(parser, ad); + if (list == NULL) + return -EINVAL; + parser_node = rte_zmalloc("ice_parser", sizeof(*parser_node), 0); if (parser_node == NULL) { PMD_DRV_LOG(ERR, "Failed to allocate memory."); @@ -1927,10 +1931,6 @@ ice_register_parser(struct ice_flow_parser *parser, } parser_node->parser = parser; - list = ice_get_parser_list(parser, ad); - if (list == NULL) - return -EINVAL; - if (ad->devargs.pipe_mode_support) { TAILQ_INSERT_TAIL(list, parser_node, node); } else { @@ -1961,6 +1961,7 @@ ice_register_parser(struct ice_flow_parser *parser, } else if (parser->engine->type == ICE_FLOW_ENGINE_ACL) { TAILQ_INSERT_HEAD(list, parser_node, node); } else { + rte_free(parser_node); return -EINVAL; } } -- 2.25.1