diff --git a/src/unix/process.c b/src/unix/process.c index 79a8b6d7..8b00af5d 100644 --- a/src/unix/process.c +++ b/src/unix/process.c @@ -340,7 +340,9 @@ static void uv__process_child_init(uv_process_options_t options, _exit(127); } - environ = options.env; + if (options.env) { + environ = options.env; + } execvp(options.file, options.args); uv__write_int(error_fd, errno); diff --git a/test/run-tests.c b/test/run-tests.c index fb163037..d0e64f05 100644 --- a/test/run-tests.c +++ b/test/run-tests.c @@ -134,5 +134,18 @@ static int maybe_run_test(int argc, char **argv) { return 1; } + if (strcmp(argv[1], "spawn_helper7") == 0) { + int r; + char *test; + /* Test if the test value from the parent is still set */ + test = getenv("ENV_TEST"); + ASSERT(test != NULL); + + r = fprintf(stdout, "%s", test); + ASSERT(r > 0); + + return 1; + } + return run_test(argv[1], TEST_TIMEOUT, 0); } diff --git a/test/test-list.h b/test/test-list.h index 99609617..ffa68360 100644 --- a/test/test-list.h +++ b/test/test-list.h @@ -146,6 +146,7 @@ TEST_DECLARE (spawn_and_kill) TEST_DECLARE (spawn_detached) TEST_DECLARE (spawn_and_kill_with_std) TEST_DECLARE (spawn_and_ping) +TEST_DECLARE (spawn_preserve_env) TEST_DECLARE (spawn_setuid_fails) TEST_DECLARE (spawn_setgid_fails) TEST_DECLARE (spawn_stdout_to_file) @@ -395,6 +396,7 @@ TASK_LIST_START TEST_ENTRY (spawn_detached) TEST_ENTRY (spawn_and_kill_with_std) TEST_ENTRY (spawn_and_ping) + TEST_ENTRY (spawn_preserve_env) TEST_ENTRY (spawn_setuid_fails) TEST_ENTRY (spawn_setgid_fails) TEST_ENTRY (spawn_stdout_to_file) diff --git a/test/test-spawn.c b/test/test-spawn.c index cb03efdf..d18464d8 100644 --- a/test/test-spawn.c +++ b/test/test-spawn.c @@ -387,6 +387,45 @@ TEST_IMPL(spawn_and_kill) { return 0; } + +TEST_IMPL(spawn_preserve_env) { + int r; + uv_pipe_t out; + uv_stdio_container_t stdio[2]; + + init_process_options("spawn_helper7", exit_cb); + + uv_pipe_init(uv_default_loop(), &out, 0); + options.stdio = stdio; + options.stdio[0].flags = UV_IGNORE; + options.stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; + options.stdio[1].data.stream = (uv_stream_t*) &out; + options.stdio_count = 2; + + ASSERT(setenv("ENV_TEST", "testval", 1) == 0); + /* Explicitly set options.env to NULL to test for env clobbering. */ + options.env = NULL; + + r = uv_spawn(uv_default_loop(), &process, options); + ASSERT(r == 0); + + r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read); + ASSERT(r == 0); + + r = uv_run(uv_default_loop()); + ASSERT(r == 0); + + ASSERT(exit_cb_called == 1); + ASSERT(close_cb_called == 2); + + printf("output is: %s", output); + ASSERT(strcmp("testval", output) == 0); + + MAKE_VALGRIND_HAPPY(); + return 0; +} + + TEST_IMPL(spawn_detached) { int r; uv_err_t err;