Need to free all the allocated variables in case of error.

Signed-off-by: Alex Netes <ale...@mellanox.com>
---
 opensm/osm_ucast_ftree.c |   26 +++++++++++++++++++++-----
 1 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/opensm/osm_ucast_ftree.c b/opensm/osm_ucast_ftree.c
index 11980cc..51e252a 100644
--- a/opensm/osm_ucast_ftree.c
+++ b/opensm/osm_ucast_ftree.c
@@ -554,25 +554,40 @@ static ftree_sw_t *sw_create(IN ftree_fabric_t * p_ftree,
        p_sw->down_port_groups =
            (ftree_port_group_t **) malloc(ports_num *
                                           sizeof(ftree_port_group_t *));
+       if (p_sw->down_port_groups == NULL)
+               goto FREE_P_SW;
+
        p_sw->up_port_groups =
            (ftree_port_group_t **) malloc(ports_num *
                                           sizeof(ftree_port_group_t *));
+       if (p_sw->sibling_port_groups == NULL)
+               goto FREE_DOWN;
+
        p_sw->sibling_port_groups =
            (ftree_port_group_t **) malloc(ports_num *
                                           sizeof(ftree_port_group_t *));
-
-       if (!p_sw->down_port_groups || !p_sw->up_port_groups
-           || !p_sw->sibling_port_groups)
-               return NULL;
+       if (p_sw->sibling_port_groups == NULL)
+               goto FREE_UP;
 
        /* initialize lft buffer */
        memset(p_osm_sw->new_lft, OSM_NO_PATH, p_osm_sw->lft_size);
        p_sw->hops = malloc((p_osm_sw->max_lid_ho + 1) * sizeof(*(p_sw->hops)));
        if (p_sw->hops == NULL)
-               return NULL;
+               goto FREE_SIBLING;
+
        memset(p_sw->hops, OSM_NO_PATH, p_osm_sw->max_lid_ho + 1);
 
        return p_sw;
+
+FREE_SIBLING:
+       free(p_sw->sibling_port_groups);
+FREE_UP:
+       free(p_sw->up_port_groups);
+FREE_DOWN:
+       free(p_sw->down_port_groups);
+FREE_P_SW:
+       free(p_sw);
+       return NULL;
 }                              /* sw_create() */
 
 /***************************************************/
@@ -1662,6 +1677,7 @@ static int fabric_create_leaf_switch_array(IN 
ftree_fabric_t * p_ftree)
        if (!p_ftree->leaf_switches) {
                osm_log(&p_ftree->p_osm->log, OSM_LOG_SYS,
                        "Fat-tree routing: Memory allocation failed\n");
+               free(all_switches_at_leaf_level);
                res = -1;
                goto Exit;
        }
-- 
1.7.3.4

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to