summaryrefslogtreecommitdiff
path: root/drivers/bus/fslmc
diff options
context:
space:
mode:
authorShreyansh Jain <shreyansh.jain@nxp.com>2018-05-09 20:57:51 +0530
committerThomas Monjalon <thomas@monjalon.net>2018-05-14 01:01:03 +0200
commit58b7c9ceed1efced68d4fc7106915fab3b467e47 (patch)
treebc8cd5b56a17dee703f4e801f927b29a30a3abf2 /drivers/bus/fslmc
parentfe33fe37fd8b63e140e9ed91443dc44fa62472d4 (diff)
downloaddpdk-58b7c9ceed1efced68d4fc7106915fab3b467e47.zip
dpdk-58b7c9ceed1efced68d4fc7106915fab3b467e47.tar.gz
dpdk-58b7c9ceed1efced68d4fc7106915fab3b467e47.tar.xz
bus/fslmc: fix memory leak and cleanup
Coverity issue: 268327 Fixes: 828d51d8fc3e ("bus/fslmc: refactor scan and probe functions") Cc: stable@dpdk.org Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com> Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Diffstat (limited to 'drivers/bus/fslmc')
-rw-r--r--drivers/bus/fslmc/fslmc_vfio.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
index 96ba568..26167f1 100644
--- a/drivers/bus/fslmc/fslmc_vfio.c
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -569,38 +569,39 @@ fslmc_process_iodevices(struct rte_dpaa2_device *dev)
static int
fslmc_process_mcp(struct rte_dpaa2_device *dev)
{
+ int ret;
intptr_t v_addr;
- char *dev_name;
+ char *dev_name = NULL;
struct fsl_mc_io dpmng = {0};
struct mc_version mc_ver_info = {0};
rte_mcp_ptr_list = malloc(sizeof(void *) * 1);
if (!rte_mcp_ptr_list) {
DPAA2_BUS_ERR("Unable to allocate MC portal memory");
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto cleanup;
}
dev_name = strdup(dev->device.name);
if (!dev_name) {
DPAA2_BUS_ERR("Unable to allocate MC device name memory");
- free(rte_mcp_ptr_list);
- rte_mcp_ptr_list = NULL;
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto cleanup;
}
v_addr = vfio_map_mcp_obj(&vfio_group, dev_name);
if (v_addr == (intptr_t)MAP_FAILED) {
DPAA2_BUS_ERR("Error mapping region (errno = %d)", errno);
- free(rte_mcp_ptr_list);
- rte_mcp_ptr_list = NULL;
- return -1;
+ ret = -1;
+ goto cleanup;
}
/* check the MC version compatibility */
dpmng.regs = (void *)v_addr;
if (mc_get_version(&dpmng, CMD_PRI_LOW, &mc_ver_info)) {
DPAA2_BUS_ERR("Unable to obtain MC version");
- return -1;
+ ret = -1;
+ goto cleanup;
}
if ((mc_ver_info.major != MC_VER_MAJOR) ||
@@ -610,13 +611,24 @@ fslmc_process_mcp(struct rte_dpaa2_device *dev)
MC_VER_MAJOR, MC_VER_MINOR,
mc_ver_info.major, mc_ver_info.minor,
mc_ver_info.revision);
- free(rte_mcp_ptr_list);
- rte_mcp_ptr_list = NULL;
- return -1;
+ ret = -1;
+ goto cleanup;
}
rte_mcp_ptr_list[0] = (void *)v_addr;
+ free(dev_name);
return 0;
+
+cleanup:
+ if (dev_name)
+ free(dev_name);
+
+ if (rte_mcp_ptr_list) {
+ free(rte_mcp_ptr_list);
+ rte_mcp_ptr_list = NULL;
+ }
+
+ return ret;
}
int