diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-01-03 22:26:52 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-01-19 14:18:34 +0100 |
commit | 30927a24848c4d727f7619cc74b878f098cdd724 (patch) | |
tree | 5deb8cf9fa92762406f4ee25447e6a312b3f4ed0 /src/test/test-env-util.c | |
parent | systemctl: print a warning when trying to import a nonexistent variable (diff) | |
download | systemd-30927a24848c4d727f7619cc74b878f098cdd724.tar.xz systemd-30927a24848c4d727f7619cc74b878f098cdd724.zip |
Allow control characters in environment variable values
So far, we would allow certain control characters (NL since
b4346b9a77bc6129dd3e, TAB since 6294aa76d818e831de45), but not others. Having
other control characters in environment variable *value* is expected and widely
used, for various prompts like $LESS, $LESS_TERMCAP_*, and other similar
variables. The typical environment exported by bash already contains a dozen or
so such variables, so programs need to handle them.
We handle then correctly too, for example in 'systemctl show-environment',
since 804ee07c1370d49aa9a. But we would still disallow setting such variables
by the user, in unit file Environment= and in set-environment/import-environment
operations. This is unexpected and confusing and doesn't help with anything
because such variables are present in the environment through other means.
When printing such variables, 'show-environment' escapes all special
characters, so variables with control characters are plainly visible.
In other uses, e.g. 'cat -v' can be used in similar fashion. This would already
need to be done to suppress color codes starting with \[.
Note that we still forbid invalid utf-8 with this patch. (Control characters
are valid, since they are valid 7-bit ascii.) I'm not sure if we should do
that, but since people haven't been actually asking for invalid utf-8, and only
for control characters, and invalid utf-8 causes other issues, I think it's OK
to leave this unchanged.
Fixes #4446, https://gitlab.gnome.org/GNOME/gnome-session/-/issues/45.
Diffstat (limited to 'src/test/test-env-util.c')
-rw-r--r-- | src/test/test-env-util.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c index dd150b3068..f77b1cdbcb 100644 --- a/src/test/test-env-util.c +++ b/src/test/test-env-util.c @@ -265,6 +265,7 @@ static void test_env_clean(void) { "another=one", "another=final one", "CRLF=\r\n", + "LESS_TERMCAP_mb=\x1b[01;31m", "BASH_FUNC_foo%%=() { echo foo\n}"); assert_se(e); assert_se(!strv_env_is_valid(e)); @@ -277,7 +278,9 @@ static void test_env_clean(void) { assert_se(streq(e[3], "abcd=äöüß")); assert_se(streq(e[4], "xyz=xyz\n")); assert_se(streq(e[5], "another=final one")); - assert_se(e[6] == NULL); + assert_se(streq(e[6], "CRLF=\r\n")); + assert_se(streq(e[7], "LESS_TERMCAP_mb=\x1b[01;31m")); + assert_se(e[8] == NULL); } static void test_env_name_is_valid(void) { @@ -302,8 +305,11 @@ static void test_env_value_is_valid(void) { assert_se(env_value_is_valid("printf \"\\x1b]0;<mock-chroot>\\x07<mock-chroot>\"")); assert_se(env_value_is_valid("tab\tcharacter")); assert_se(env_value_is_valid("new\nline")); - assert_se(!env_value_is_valid("Show this?\rNope. Show that!")); - assert_se(!env_value_is_valid("new DOS\r\nline")); + assert_se(env_value_is_valid("Show this?\rNope. Show that!")); + assert_se(env_value_is_valid("new DOS\r\nline")); + + assert_se(!env_value_is_valid("\xc5")); /* A truncated utf-8-encoded "ł". + * We currently disallow that. */ } static void test_env_assignment_is_valid(void) { |