net/mlx5: Avoid double free in fs init error unwinding path
authorParav Pandit <parav@mellanox.com>
Fri, 10 May 2019 15:26:23 +0000 (10:26 -0500)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 29 May 2019 01:25:41 +0000 (18:25 -0700)
In below code flow, for ingress acl table root ns memory leads
to double free.

mlx5_init_fs
  init_ingress_acls_root_ns()
    init_ingress_acl_root_ns
       kfree(steering->esw_ingress_root_ns);
       /* steering->esw_ingress_root_ns is not marked NULL */
  mlx5_cleanup_fs
    cleanup_ingress_acls_root_ns
       steering->esw_ingress_root_ns non NULL check passes.
       kfree(steering->esw_ingress_root_ns);
       /* double free */

Similar issue exist for other tables.

Hence zero out the pointers to not process the table again.

Fixes: 9b93ab981e3bf ("net/mlx5: Separate ingress/egress namespaces for each vport")
Fixes: 40c3eebb49e51 ("net/mlx5: Add support in RDMA RX steering")
Signed-off-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

index 4fa87ca63bca94e8182cf2e6e5b957aa341f6e34..34276a2b6da2c07ddac6303f8d4e9c15441101c1 100644 (file)
@@ -2427,6 +2427,7 @@ static void cleanup_egress_acls_root_ns(struct mlx5_core_dev *dev)
                cleanup_root_ns(steering->esw_egress_root_ns[i]);
 
        kfree(steering->esw_egress_root_ns);
+       steering->esw_egress_root_ns = NULL;
 }
 
 static void cleanup_ingress_acls_root_ns(struct mlx5_core_dev *dev)
@@ -2441,6 +2442,7 @@ static void cleanup_ingress_acls_root_ns(struct mlx5_core_dev *dev)
                cleanup_root_ns(steering->esw_ingress_root_ns[i]);
 
        kfree(steering->esw_ingress_root_ns);
+       steering->esw_ingress_root_ns = NULL;
 }
 
 void mlx5_cleanup_fs(struct mlx5_core_dev *dev)
@@ -2625,6 +2627,7 @@ cleanup_root_ns:
        for (i--; i >= 0; i--)
                cleanup_root_ns(steering->esw_egress_root_ns[i]);
        kfree(steering->esw_egress_root_ns);
+       steering->esw_egress_root_ns = NULL;
        return err;
 }
 
@@ -2652,6 +2655,7 @@ cleanup_root_ns:
        for (i--; i >= 0; i--)
                cleanup_root_ns(steering->esw_ingress_root_ns[i]);
        kfree(steering->esw_ingress_root_ns);
+       steering->esw_ingress_root_ns = NULL;
        return err;
 }