[mpich2-commits] r7991 - in mpich2/trunk/src/pm/hydra: include utils/env
goodell at mcs.anl.gov
goodell at mcs.anl.gov
Fri Feb 18 15:57:23 CST 2011
Author: goodell
Date: 2011-02-18 15:57:23 -0600 (Fri, 18 Feb 2011)
New Revision: 7991
Modified:
mpich2/trunk/src/pm/hydra/include/hydra.h
mpich2/trunk/src/pm/hydra/utils/env/env.c
Log:
bugfix: make hydra correctly handle env vars with '=' in the value
The old behavior was causing "VALGRIND_OPTS=--memcheck:error-limit=no"
to be stripped down to "VALGRIND_OPTS=--memcheck:error-limit" when
passed to the launched process.
This also changes HYDU_append_env_str_to_list to not clobber its input
string and prevents memory leaks in error cases.
Reviewed by balaji at .
Modified: mpich2/trunk/src/pm/hydra/include/hydra.h
===================================================================
--- mpich2/trunk/src/pm/hydra/include/hydra.h 2011-02-18 17:55:09 UTC (rev 7990)
+++ mpich2/trunk/src/pm/hydra/include/hydra.h 2011-02-18 21:57:23 UTC (rev 7991)
@@ -461,7 +461,7 @@
struct HYD_env *HYDU_env_lookup(char *env_name, struct HYD_env *env_list);
HYD_status HYDU_append_env_to_list(const char *env_name, const char *env_value,
struct HYD_env **env_list);
-HYD_status HYDU_append_env_str_to_list(char *str, struct HYD_env **env_list);
+HYD_status HYDU_append_env_str_to_list(const char *str, struct HYD_env **env_list);
HYD_status HYDU_putenv(struct HYD_env *env, HYD_env_overwrite_t overwrite);
HYD_status HYDU_putenv_list(struct HYD_env *env_list, HYD_env_overwrite_t overwrite);
HYD_status HYDU_comma_list_to_env_list(char *str, struct HYD_env **env_list);
Modified: mpich2/trunk/src/pm/hydra/utils/env/env.c
===================================================================
--- mpich2/trunk/src/pm/hydra/utils/env/env.c 2011-02-18 17:55:09 UTC (rev 7990)
+++ mpich2/trunk/src/pm/hydra/utils/env/env.c 2011-02-18 21:57:23 UTC (rev 7991)
@@ -40,7 +40,7 @@
HYD_status HYDU_list_inherited_env(struct HYD_env **env_list)
{
- char *env_str, *env_name;
+ char *env_str = NULL, *env_name;
int i, ret;
HYD_status status = HYD_SUCCESS;
@@ -56,23 +56,22 @@
HYDU_ERR_POP(status, "error querying environment propagation\n");
HYDU_FREE(env_str);
+ env_str = NULL;
if (!ret) {
i++;
continue;
}
- env_str = HYDU_strdup(environ[i]);
-
- status = HYDU_append_env_str_to_list(env_str, env_list);
+ status = HYDU_append_env_str_to_list(environ[i], env_list);
HYDU_ERR_POP(status, "unable to add env to list\n");
- HYDU_FREE(env_str);
-
i++;
}
fn_exit:
+ if (env_str)
+ HYDU_FREE(env_str);
HYDU_FUNC_EXIT();
return status;
@@ -239,19 +238,25 @@
goto fn_exit;
}
-HYD_status HYDU_append_env_str_to_list(char *str, struct HYD_env **env_list)
+HYD_status HYDU_append_env_str_to_list(const char *str, struct HYD_env **env_list)
{
+ char *my_str = NULL;
char *env_name, *env_value;
HYD_status status = HYD_SUCCESS;
HYDU_FUNC_ENTER();
- env_name = strtok(str, "=");
- env_value = strtok(NULL, "=");
+ my_str = env_value = HYDU_strdup(str);
+ /* don't use strtok, it will mangle env values that contain '=' */
+ env_name = strsep(&env_value, "=");
+ HYDU_ASSERT(env_name != NULL, status);
+
status = HYDU_append_env_to_list(env_name, env_value, env_list);
HYDU_ERR_POP(status, "unable to append env to list\n");
fn_exit:
+ if (my_str)
+ HYDU_FREE(my_str);
HYDU_FUNC_EXIT();
return status;
More information about the mpich2-commits
mailing list