unix: do not set environ unless one is provided

Currently, `uv_spawn` will set `environ` to the value of `options.env`, even if
`options.env` is `NULL`.  This results in child processes for whom `environ ==
NULL`, which can cause a variety of unexpected issues.

This is a back-port of commit 1d85815 from the master branch.
This commit is contained in:
Charlie McConnell 2012-11-01 10:55:06 -04:00 committed by Ben Noordhuis
parent f43ad85edd
commit fb64948746
4 changed files with 56 additions and 1 deletions

View File

@ -260,7 +260,9 @@ static void uv__process_child_init(uv_process_options_t options,
_exit(127); _exit(127);
} }
environ = options.env; if (options.env) {
environ = options.env;
}
execvp(options.file, options.args); execvp(options.file, options.args);
perror("execvp()"); perror("execvp()");

View File

@ -134,5 +134,18 @@ static int maybe_run_test(int argc, char **argv) {
return 1; 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); return run_test(argv[1], TEST_TIMEOUT, 0);
} }

View File

@ -133,6 +133,7 @@ TEST_DECLARE (spawn_and_kill)
TEST_DECLARE (spawn_detached) TEST_DECLARE (spawn_detached)
TEST_DECLARE (spawn_and_kill_with_std) TEST_DECLARE (spawn_and_kill_with_std)
TEST_DECLARE (spawn_and_ping) TEST_DECLARE (spawn_and_ping)
TEST_DECLARE (spawn_preserve_env)
TEST_DECLARE (spawn_setuid_fails) TEST_DECLARE (spawn_setuid_fails)
TEST_DECLARE (spawn_setgid_fails) TEST_DECLARE (spawn_setgid_fails)
TEST_DECLARE (spawn_stdout_to_file) TEST_DECLARE (spawn_stdout_to_file)
@ -362,6 +363,7 @@ TASK_LIST_START
TEST_ENTRY (spawn_detached) TEST_ENTRY (spawn_detached)
TEST_ENTRY (spawn_and_kill_with_std) TEST_ENTRY (spawn_and_kill_with_std)
TEST_ENTRY (spawn_and_ping) TEST_ENTRY (spawn_and_ping)
TEST_ENTRY (spawn_preserve_env)
TEST_ENTRY (spawn_setuid_fails) TEST_ENTRY (spawn_setuid_fails)
TEST_ENTRY (spawn_setgid_fails) TEST_ENTRY (spawn_setgid_fails)
TEST_ENTRY (spawn_stdout_to_file) TEST_ENTRY (spawn_stdout_to_file)

View File

@ -373,6 +373,44 @@ TEST_IMPL(spawn_and_kill) {
return 0; 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);
return 0;
}
TEST_IMPL(spawn_detached) { TEST_IMPL(spawn_detached) {
int r; int r;
uv_err_t err; uv_err_t err;