[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