From c16e4f241fbc00ed6dbf30ca7d74cce360db068f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Apr 2021 20:37:01 -0400 Subject: [PATCH] replace "leaky" call to putenv() with setenv() on non-windows platforms --- src/input.cpp | 11 ++++++++++- unittest/commands/test_simple_commands.cpp | 20 +++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/input.cpp b/src/input.cpp index 3f3c7cb2e6..9079cdd76c 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -1252,7 +1252,16 @@ void Input::shell() #ifdef _WIN32 if (arg[i]) rv = _putenv(utils::strdup(arg[i])); #else - if (arg[i]) rv = putenv(utils::strdup(arg[i])); + if (arg[i]) { + std::string vardef(arg[i]); + auto found = vardef.find_first_of("="); + if (found == std::string::npos) { + rv = setenv(vardef.c_str(),"",1); + } else { + rv = setenv(vardef.substr(0,found).c_str(), + vardef.substr(found+1).c_str(),1); + } + } #endif rv = (rv < 0) ? errno : 0; MPI_Reduce(&rv,&err,1,MPI_INT,MPI_MAX,0,world); diff --git a/unittest/commands/test_simple_commands.cpp b/unittest/commands/test_simple_commands.cpp index 6ee783a8e1..e8cebe98e2 100644 --- a/unittest/commands/test_simple_commands.cpp +++ b/unittest/commands/test_simple_commands.cpp @@ -398,30 +398,28 @@ TEST_F(SimpleCommandsTest, Shell) { BEGIN_HIDE_OUTPUT(); command("shell putenv TEST_VARIABLE=simpletest"); - command("variable simple1 getenv TEST_VARIABLE"); END_HIDE_OUTPUT(); - char *test_var = getenv("TEST_VARIABLE"); + const char *test_var = getenv("TEST_VARIABLE"); ASSERT_NE(test_var, nullptr); ASSERT_THAT(test_var, StrEq("simpletest")); BEGIN_HIDE_OUTPUT(); - command("shell putenv TEST_VARIABLE=simpletest2"); + command("shell putenv TEST_VARIABLE"); command("shell putenv TEST_VARIABLE2=simpletest OTHER_VARIABLE=2"); END_HIDE_OUTPUT(); - char *test_var2 = getenv("TEST_VARIABLE2"); - char *other_var = getenv("OTHER_VARIABLE"); + test_var = getenv("TEST_VARIABLE2"); + ASSERT_NE(test_var, nullptr); + ASSERT_THAT(test_var, StrEq("simpletest")); - ASSERT_NE(test_var2, nullptr); - ASSERT_THAT(test_var2, StrEq("simpletest")); - - ASSERT_NE(other_var, nullptr); - ASSERT_THAT(other_var, StrEq("2")); + test_var = getenv("OTHER_VARIABLE"); + ASSERT_NE(test_var, nullptr); + ASSERT_THAT(test_var, StrEq("2")); test_var = getenv("TEST_VARIABLE"); ASSERT_NE(test_var, nullptr); - ASSERT_THAT(test_var, StrEq("simpletest2")); + ASSERT_THAT(test_var, StrEq("")); } TEST_F(SimpleCommandsTest, CiteMe)