Blob Blame History Raw
From cdc2ef6ba88210264f00997e7c99b7f3339c629e Mon Sep 17 00:00:00 2001
From: Lubomir Rintel <lkundrak@v3.sk>
Date: Wed, 11 Oct 2017 09:29:30 +0200
Subject: [PATCH] basic/env-util: drop the validation when deserializing
 environment

The environment variables we've serialized can quite possibly contain
characters outside the set allowed by env_assignment_is_valid(). In
fact, my environment seems to contain a couple of these:

  * TERMCAP set by screen contains a '\x7f' character
  * BASH_FUNC_module%% variable has a '%' character in name

Strict check of environment variables name and value certainly makes sense for
unit files, but not so much for deserialization of values we already had
in our environment.

(cherry picked from commit ea43bdd1d7c14e3695a4cc081e4ef4f964160dc1)
---
 src/basic/env-util.c     | 5 -----
 src/test/test-env-util.c | 5 +++--
 2 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/src/basic/env-util.c b/src/basic/env-util.c
index fa42edfa96..a8b51e719f 100644
--- a/src/basic/env-util.c
+++ b/src/basic/env-util.c
@@ -809,10 +809,5 @@ int deserialize_environment(char ***environment, const char *line) {
         if (r < 0)
                 return r;
 
-        if (!env_assignment_is_valid(uce)) {
-                free(uce);
-                return -EINVAL;
-        }
-
         return strv_env_replace(environment, uce);
 }
diff --git a/src/test/test-env-util.c b/src/test/test-env-util.c
index 3a2492dc6f..b14d62760f 100644
--- a/src/test/test-env-util.c
+++ b/src/test/test-env-util.c
@@ -319,10 +319,10 @@ static void test_env_assignment_is_valid(void) {
 static void test_deserialize_environment(void) {
         _cleanup_strv_free_ char **env = strv_new("A=1", NULL);
 
-        assert_se(deserialize_environment(&env, "env=test") < 0);
         assert_se(deserialize_environment(&env, "env=B=2") >= 0);
+        assert_se(deserialize_environment(&env, "env=FOO%%=a\\177b\\nc\\td e") >= 0);
 
-        assert_se(strv_equal(env, STRV_MAKE("A=1", "B=2")));
+        assert_se(strv_equal(env, STRV_MAKE("A=1", "B=2", "FOO%%=a\177b\nc\td e")));
 }
 
 static void test_serialize_environment(void) {
@@ -334,6 +334,7 @@ static void test_serialize_environment(void) {
                                                   "B=2",
                                                   "C=ąęółń",
                                                   "D=D=a\\x0Ab",
+                                                  "FOO%%=a\177b\nc\td e",
                                                   NULL);
         _cleanup_strv_free_ char **env2 = NULL;