Overwrite tracked file descriptors when exporting COLORED_STDERR_FDS.

If the list of tracked file descriptors is modified to contain unwanted
values (e.g. when a parent process closes or redirects stderr), this
makes it possible to set the tracked file descriptors back to a given
list.

This problem occurred with startx which somehow closes or redirects
stderr. As COLORED_STDERR_FDS was set in the shell running startx, this
disabled coloring stderr for all processes started in the X11 session.

This is no longer an issue. As COLORED_STDERR_FDS is set in the shell
configuration file, it automatically sets the list to the correct value
when a shell is opened in the terminal emulator once X11 is running.
This commit is contained in:
Simon Ruderich
2013-06-21 18:26:23 +02:00
parent 045ca46e79
commit 0d7f306898
8 changed files with 160 additions and 59 deletions

View File

@@ -169,9 +169,38 @@ int main(int argc unused, char **argv) {
execvp(argv[0], args);
return EXIT_FAILURE;
} else {
/* Test handling of COLORED_STDERR_FDS. */
} else if (!skip--) {
/* And the rest. */
close(3);
close(8);
dup2(2, 5);
char *args[] = { argv0, NULL };
char *envp[] = { ldpreload, "COLORED_STDERR_FDS=5,", NULL };
execve(argv[0], args, envp);
return EXIT_FAILURE;
} else if (!skip--) {
char *args[] = { argv0, NULL };
char *envp[] = { ldpreload, NULL };
dup2(5, 6);
close(5);
execve(argv[0], args, envp);
return EXIT_FAILURE;
} else if (!skip--) {
close(6);
char *args[] = { argv0, NULL };
setenv("COLORED_STDERR_FDS", "2,", 1);
execv(argv[0], args);
return EXIT_FAILURE;
}
@@ -292,13 +321,13 @@ int main(int argc unused, char **argv) {
} else if (!skip--) {
puts("argv[0] = |./example_exec|");
puts("environ[0] = |TEST=54|");
puts("environ[2] = |COLORED_STDERR_FDS=2,|");
puts("environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|");
puts("");
puts("argv[0] = |./example_exec|");
puts("argv[1] = |foo|");
puts("argv[2] = |bar|");
puts("environ[0] = |TEST=55|");
puts("environ[2] = |COLORED_STDERR_FDS=2,|");
puts("environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|");
puts("");
#endif
}

View File

@@ -1,114 +1,125 @@
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_FDS=2,|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,|
CHECKING COLORING.
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_FDS=2,3,|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,|
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_FDS=2,3,4,|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,4,|
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_FDS=2,3,4,5,|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,4,5,|
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_FDS=2,3,4,5,6,|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,4,5,6,|
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_FDS=2,3,4,7,|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,4,7,|
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_FDS=2,3,8,|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,3,8,|
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_FDS=5,|
environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,5,|
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=6,|
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=|
environ[2] = |COLORED_STDERR_FDS=2,|
CHECKING TRANSPARENCY.
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_FDS=2,|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
environ[0] = |TEST=42|
environ[2] = |COLORED_STDERR_FDS=2,|
environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
argv[1] = |foo|
argv[2] = |bar|
environ[0] = |TEST=43|
environ[1] = |FOO=|
environ[3] = |COLORED_STDERR_FDS=2,|
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
environ[0] = |TEST=44|
environ[1] = |FOO=|
environ[3] = |COLORED_STDERR_FDS=2,|
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
argv[1] = |foo|
argv[2] = |bar|
environ[0] = |TEST=45|
environ[1] = |FOO=|
environ[3] = |COLORED_STDERR_FDS=2,|
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
environ[0] = |TEST=46|
environ[1] = |FOO=|
environ[3] = |COLORED_STDERR_FDS=2,|
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
argv[1] = |foo|
argv[2] = |bar|
environ[0] = |TEST=47|
environ[1] = |FOO=|
environ[3] = |COLORED_STDERR_FDS=2,|
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
environ[1] = |COLORED_STDERR_FDS=2,|
environ[1] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
environ[0] = |TEST=48|
environ[2] = |COLORED_STDERR_FDS=2,|
environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
argv[1] = |foo|
argv[2] = |bar|
environ[0] = |TEST=49|
environ[1] = |FOO=|
environ[3] = |COLORED_STDERR_FDS=2,|
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
environ[0] = |TEST=50|
environ[1] = |FOO=|
environ[3] = |COLORED_STDERR_FDS=2,|
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
argv[1] = |foo|
argv[2] = |bar|
environ[0] = |TEST=51|
environ[1] = |FOO=|
environ[3] = |COLORED_STDERR_FDS=2,|
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
environ[0] = |TEST=52|
environ[1] = |FOO=|
environ[3] = |COLORED_STDERR_FDS=2,|
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
argv[1] = |foo|
argv[2] = |bar|
environ[0] = |TEST=53|
environ[1] = |FOO=|
environ[3] = |COLORED_STDERR_FDS=2,|
environ[3] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
environ[0] = |TEST=54|
environ[2] = |COLORED_STDERR_FDS=2,|
environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|
argv[0] = |./example_exec|
argv[1] = |foo|
argv[2] = |bar|
environ[0] = |TEST=55|
environ[2] = |COLORED_STDERR_FDS=2,|
environ[2] = |COLORED_STDERR_PRIVATE_FDS=2,|
Done.

View File

@@ -40,7 +40,10 @@ fi
LC_ALL=C
unset LANGUAGE
# Set default COLORED_STDERR_FDS value.
# Clear user defined variables.
unset COLORED_STDERR_FDS
unset COLORED_STDERR_FORCE_WRITE
# Set default COLORED_STDERR_PRIVATE_FDS value.
fds=2,
@@ -78,9 +81,9 @@ run_test() {
(
# Standard setup.
LD_PRELOAD="$library"
COLORED_STDERR_FDS="$fds"
COLORED_STDERR_PRIVATE_FDS="$fds"
export LD_PRELOAD
export COLORED_STDERR_FDS
export COLORED_STDERR_PRIVATE_FDS
# Change pre/post strings for simpler testing.
COLORED_STDERR_PRE='>STDERR>'

View File

@@ -18,7 +18,7 @@
test "x$srcdir" = x && srcdir=.
. "$srcdir/lib.sh"
# Test unexpected values for COLORED_STDERR_FDS environment variable.
# Test unexpected values for COLORED_STDERR_PRIVATE_FDS environment variable.
# Empty fields.
fds=
@@ -44,3 +44,18 @@ test_program_subshell example example_environment
fds=-20,-30,2,-1,
test_program example example_environment
test_program_subshell example example_environment
# Test COLORED_STDERR_FDS overwrites COLORED_STDERR_PRIVATE_FDS. Additional
# tests in example_exec.
fds=
COLORED_STDERR_FDS=2,
export COLORED_STDERR_FDS
test_program example example_environment
test_program_subshell example example_environment
fds=2,
COLORED_STDERR_FDS=
export COLORED_STDERR_FDS
test_program example example_environment_empty
test_program_subshell example example_environment_empty