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 commit is contained in:
parent
dcce1eab3b
commit
1d858156b4
@ -340,7 +340,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);
|
||||||
uv__write_int(error_fd, errno);
|
uv__write_int(error_fd, errno);
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -146,6 +146,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)
|
||||||
@ -395,6 +396,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)
|
||||||
|
|||||||
@ -387,6 +387,45 @@ 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);
|
||||||
|
|
||||||
|
MAKE_VALGRIND_HAPPY();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_IMPL(spawn_detached) {
|
TEST_IMPL(spawn_detached) {
|
||||||
int r;
|
int r;
|
||||||
uv_err_t err;
|
uv_err_t err;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user