1
1

pml/rsh: fix misc memory leaks

as reported by Coverity with CIDs 71091, 71230, 71231, 72274, 72389,
1196718 and 1196719
Этот коммит содержится в:
Gilles Gouaillardet 2015-03-05 20:03:37 +09:00
родитель d6ae0a5e05
Коммит 7de3f35b90

Просмотреть файл

@ -15,6 +15,8 @@
* Copyright (c) 2008-2009 Sun Microsystems, Inc. All rights reserved. * Copyright (c) 2008-2009 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2011 IBM Corporation. All rights reserved. * Copyright (c) 2011 IBM Corporation. All rights reserved.
* Copyright (c) 2014 Intel Corporation. All rights reserved. * Copyright (c) 2014 Intel Corporation. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$ * $COPYRIGHT$
* *
* Additional copyrights may follow * Additional copyrights may follow
@ -330,7 +332,6 @@ static int setup_launch(int *argcptr, char ***argvptr,
char **argv; char **argv;
char *param, *value; char *param, *value;
orte_plm_rsh_shell_t remote_shell, local_shell; orte_plm_rsh_shell_t remote_shell, local_shell;
char *lib_base, *bin_base;
int orted_argc; int orted_argc;
char **orted_argv; char **orted_argv;
char *orted_cmd, *orted_prefix, *final_cmd; char *orted_cmd, *orted_prefix, *final_cmd;
@ -366,9 +367,6 @@ static int setup_launch(int *argcptr, char ***argvptr,
and use that on the remote node. and use that on the remote node.
*/ */
lib_base = opal_basename(opal_install_dirs.libdir);
bin_base = opal_basename(opal_install_dirs.bindir);
/* /*
* Build argv array * Build argv array
*/ */
@ -444,7 +442,10 @@ static int setup_launch(int *argcptr, char ***argvptr,
*/ */
char *opal_prefix = getenv("OPAL_PREFIX"); char *opal_prefix = getenv("OPAL_PREFIX");
char* full_orted_cmd = NULL; char* full_orted_cmd = NULL;
char *lib_base, *bin_base;
bin_base = opal_basename(opal_install_dirs.bindir);
if (NULL != orted_cmd) { if (NULL != orted_cmd) {
if (0 == strcmp(orted_cmd, "orted")) { if (0 == strcmp(orted_cmd, "orted")) {
/* if the cmd is our standard one, then add the prefix */ /* if the cmd is our standard one, then add the prefix */
@ -453,8 +454,11 @@ static int setup_launch(int *argcptr, char ***argvptr,
/* someone specified something different, so don't prefix it */ /* someone specified something different, so don't prefix it */
full_orted_cmd = strdup(orted_cmd); full_orted_cmd = strdup(orted_cmd);
} }
free(orted_cmd);
} }
lib_base = opal_basename(opal_install_dirs.libdir);
if (ORTE_PLM_RSH_SHELL_SH == remote_shell || if (ORTE_PLM_RSH_SHELL_SH == remote_shell ||
ORTE_PLM_RSH_SHELL_KSH == remote_shell || ORTE_PLM_RSH_SHELL_KSH == remote_shell ||
ORTE_PLM_RSH_SHELL_ZSH == remote_shell || ORTE_PLM_RSH_SHELL_ZSH == remote_shell ||
@ -519,8 +523,14 @@ static int setup_launch(int *argcptr, char ***argvptr,
orte_show_help("help-plm-rsh.txt", "cannot-resolve-shell-with-prefix", true, orte_show_help("help-plm-rsh.txt", "cannot-resolve-shell-with-prefix", true,
(NULL == opal_prefix) ? "NULL" : opal_prefix, (NULL == opal_prefix) ? "NULL" : opal_prefix,
prefix_dir); prefix_dir);
free(bin_base);
free(lib_base);
if (NULL != orted_prefix) free(orted_prefix);
if (NULL != full_orted_cmd) free(full_orted_cmd);
return ORTE_ERR_SILENT; return ORTE_ERR_SILENT;
} }
free(bin_base);
free(lib_base);
if( NULL != full_orted_cmd ) { if( NULL != full_orted_cmd ) {
free(full_orted_cmd); free(full_orted_cmd);
} }
@ -529,12 +539,12 @@ static int setup_launch(int *argcptr, char ***argvptr,
(void)asprintf(&final_cmd, "%s %s", (void)asprintf(&final_cmd, "%s %s",
(orted_prefix != NULL ? orted_prefix : ""), (orted_prefix != NULL ? orted_prefix : ""),
(orted_cmd != NULL ? orted_cmd : "")); (orted_cmd != NULL ? orted_cmd : ""));
if (NULL != orted_cmd) free(orted_cmd);
} }
/* now add the final cmd to the argv array */ /* now add the final cmd to the argv array */
opal_argv_append(&argc, &argv, final_cmd); opal_argv_append(&argc, &argv, final_cmd);
free(final_cmd); /* done with this */ free(final_cmd); /* done with this */
if (NULL != orted_prefix) free(orted_prefix); if (NULL != orted_prefix) free(orted_prefix);
if (NULL != orted_cmd) free(orted_cmd);
/* if we are not tree launching or debugging, tell the daemon /* if we are not tree launching or debugging, tell the daemon
* to daemonize so we can launch the next group * to daemonize so we can launch the next group
@ -1214,6 +1224,7 @@ static void launch_daemons(int fd, short args, void *cbdata)
* function determine they are all alive and trigger the next stage * function determine they are all alive and trigger the next stage
*/ */
OBJ_RELEASE(state); OBJ_RELEASE(state);
opal_argv_free(argv);
return; return;
cleanup: cleanup:
@ -1326,7 +1337,10 @@ static int launch_agent_setup(const char *agent, char *path)
} }
bname = opal_basename(rsh_agent_argv[0]); bname = opal_basename(rsh_agent_argv[0]);
if (NULL != bname && 0 == strcmp(bname, "ssh")) { if (NULL == bname) {
return ORTE_SUCCESS;
}
if (0 == strcmp(bname, "ssh")) {
/* if xterm option was given, add '-X', ensuring we don't do it twice */ /* if xterm option was given, add '-X', ensuring we don't do it twice */
if (NULL != orte_xterm) { if (NULL != orte_xterm) {
opal_argv_append_unique_nosize(&rsh_agent_argv, "-X", false); opal_argv_append_unique_nosize(&rsh_agent_argv, "-X", false);
@ -1345,6 +1359,7 @@ static int launch_agent_setup(const char *agent, char *path)
} }
} }
} }
free(bname);
/* the caller can append any additional argv's they desire */ /* the caller can append any additional argv's they desire */
return ORTE_SUCCESS; return ORTE_SUCCESS;