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

Reply via email to