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 <liwg06@foxmail.com>
---
drivers/net/ice/ice_generic_flow.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
@@ -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;
}
}