From a43abceb88e42b940863906d1929f3f9038c93ab Mon Sep 17 00:00:00 2001 From: Gilles Gouaillardet Date: Mon, 25 May 2015 14:14:51 +0900 Subject: [PATCH] fix dfs misc memory leaks as reported by Coverity with CIDs 739887, 747706, 1196707-1196709 --- orte/mca/dfs/orted/dfs_orted.c | 55 ++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/orte/mca/dfs/orted/dfs_orted.c b/orte/mca/dfs/orted/dfs_orted.c index 1c7c3ae37d..c49ffe415b 100644 --- a/orte/mca/dfs/orted/dfs_orted.c +++ b/orte/mca/dfs/orted/dfs_orted.c @@ -301,8 +301,8 @@ static void process_opens(int fd, short args, void *cbdata) { orte_dfs_request_t *dfs = (orte_dfs_request_t*)cbdata; int rc; - opal_buffer_t *buffer; - char *scheme, *host, *filename; + opal_buffer_t *buffer = NULL; + char *scheme = NULL, *host = NULL, *filename = NULL; int v; orte_node_t *node, *nptr; @@ -327,6 +327,9 @@ static void process_opens(int fd, short args, void *cbdata) goto complete; } + free(scheme); + scheme = NULL; + /* dissect the uri to extract host and filename/path */ if (NULL == (filename = opal_filename_from_uri(dfs->uri, &host))) { goto complete; @@ -363,6 +366,9 @@ static void process_opens(int fd, short args, void *cbdata) "%s file %s on host %s daemon %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename, host, ORTE_NAME_PRINT(&node->daemon->name)); + + free(host); + host = NULL; /* double-check: if it is our local daemon, then we * treat this as local */ @@ -406,12 +412,14 @@ static void process_opens(int fd, short args, void *cbdata) ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&node->daemon->name), filename); + + free(filename); + filename = NULL; /* send it */ if (0 > (rc = orte_rml.send_buffer_nb(&node->daemon->name, buffer, ORTE_RML_TAG_DFS_CMD, orte_rml_send_callback, NULL))) { ORTE_ERROR_LOG(rc); - OBJ_RELEASE(buffer); opal_list_remove_item(&requests, &dfs->super); goto complete; } @@ -419,6 +427,18 @@ static void process_opens(int fd, short args, void *cbdata) return; complete: + if (NULL != buffer) { + OBJ_RELEASE(buffer); + } + if (NULL != scheme) { + free(scheme); + } + if (NULL != host) { + free(host); + } + if (NULL != filename) { + free(filename); + } OBJ_RELEASE(dfs); } @@ -1619,6 +1639,10 @@ static void recv_dfs_cmd(int status, orte_process_name_t* sender, (long)i64, my_fd); /* do the read */ read_buf = (uint8_t*)malloc(i64); + if (NULL == read_buf) { + ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE); + goto answer_read; + } bytes_read = read(my_fd, read_buf, (long)i64); if (0 < bytes_read) { /* update our location */ @@ -1633,21 +1657,35 @@ static void recv_dfs_cmd(int status, orte_process_name_t* sender, answer = OBJ_NEW(opal_buffer_t); if (OPAL_SUCCESS != (rc = opal_dss.pack(answer, &cmd, 1, ORTE_DFS_CMD_T))) { ORTE_ERROR_LOG(rc); + OBJ_RELEASE(answer); + if (NULL != read_buf) { + free(read_buf); + } return; } if (OPAL_SUCCESS != (rc = opal_dss.pack(answer, &rid, 1, OPAL_UINT64))) { ORTE_ERROR_LOG(rc); + OBJ_RELEASE(answer); + if (NULL != read_buf) { + free(read_buf); + } return; } /* include the number of bytes read */ if (OPAL_SUCCESS != (rc = opal_dss.pack(answer, &bytes_read, 1, OPAL_INT64))) { ORTE_ERROR_LOG(rc); + OBJ_RELEASE(answer); + if (NULL != read_buf) { + free(read_buf); + } return; } /* include the bytes read */ if (0 < bytes_read) { if (OPAL_SUCCESS != (rc = opal_dss.pack(answer, read_buf, bytes_read, OPAL_UINT8))) { ORTE_ERROR_LOG(rc); + OBJ_RELEASE(answer); + free(read_buf); return; } } @@ -2263,6 +2301,10 @@ static void remote_read(int fd, short args, void *cbdata) "%s issuing read", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME)); read_buf = (uint8_t*)malloc(req->nbytes); + if (NULL == read_buf) { + ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE); + return; + } bytes_read = read(req->trk->local_fd, read_buf, (long)req->nbytes); if (0 < bytes_read) { /* update our location */ @@ -2272,21 +2314,28 @@ static void remote_read(int fd, short args, void *cbdata) answer = OBJ_NEW(opal_buffer_t); if (OPAL_SUCCESS != (rc = opal_dss.pack(answer, &cmd, 1, ORTE_DFS_CMD_T))) { ORTE_ERROR_LOG(rc); + free(read_buf); return; } if (OPAL_SUCCESS != (rc = opal_dss.pack(answer, &req->rid, 1, OPAL_UINT64))) { ORTE_ERROR_LOG(rc); + free(read_buf); + OBJ_RELEASE(answer); return; } /* include the number of bytes read */ if (OPAL_SUCCESS != (rc = opal_dss.pack(answer, &bytes_read, 1, OPAL_INT64))) { ORTE_ERROR_LOG(rc); + free(read_buf); + OBJ_RELEASE(answer); return; } /* include the bytes read */ if (0 < bytes_read) { if (OPAL_SUCCESS != (rc = opal_dss.pack(answer, read_buf, bytes_read, OPAL_UINT8))) { ORTE_ERROR_LOG(rc); + free(read_buf); + OBJ_RELEASE(answer); return; } }