]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
run: fix Environment parsing 1616/head
authorEvgeny Vereshchagin <evvers@ya.ru>
Tue, 20 Oct 2015 02:04:10 +0000 (02:04 +0000)
committerEvgeny Vereshchagin <evvers@ya.ru>
Tue, 20 Oct 2015 12:55:07 +0000 (12:55 +0000)
* `Environment=` resets previous assignments
* `Environment='a=1 b=2'` sets `a` to `1` and `b` to `2`
* `Environment='"a=1 2" b=2"'` sets `a` to `1 2` and `b` to `2`

src/core/dbus-execute.c
src/shared/bus-util.c

index b71e5ad300f95491fbac14915075901c6e1752a6..98cf0e9ff124d5a2e06bfdcb5bf0276a2b6ceafc 100644 (file)
@@ -1155,18 +1155,24 @@ int bus_exec_context_set_transient_property(
                         _cleanup_free_ char *joined = NULL;
                         char **e;
 
-                        e = strv_env_merge(2, c->environment, l);
-                        if (!e)
-                                return -ENOMEM;
+                        if (strv_length(l) == 0) {
+                                c->environment = strv_free(c->environment);
+                                unit_write_drop_in_private_format(u, mode, name, "Environment=\n");
+                        } else {
+                                e = strv_env_merge(2, c->environment, l);
+                                if (!e)
+                                        return -ENOMEM;
 
-                        strv_free(c->environment);
-                        c->environment = e;
+                                strv_free(c->environment);
+                                c->environment = e;
 
-                        joined = strv_join_quoted(c->environment);
-                        if (!joined)
-                                return -ENOMEM;
+                                joined = strv_join_quoted(c->environment);
+                                if (!joined)
+                                        return -ENOMEM;
+
+                                unit_write_drop_in_private_format(u, mode, name, "Environment=%s\n", joined);
+                        }
 
-                        unit_write_drop_in_private_format(u, mode, name, "Environment=%s\n", joined);
                 }
 
                 return 1;
index 65ca173876f4f72f509b2291d2f50aae0be9f9d5..044862199b59ac30ecc1743fadde08a15e59e3ae 100644 (file)
@@ -31,6 +31,7 @@
 #include "bus-message.h"
 #include "cgroup-util.h"
 #include "def.h"
+#include "env-util.h"
 #include "macro.h"
 #include "missing.h"
 #include "path-util.h"
@@ -1642,8 +1643,44 @@ int bus_append_unit_property_assignment(sd_bus_message *m, const char *assignmen
                 r = sd_bus_message_append(m, "v", "i", i);
 
         } else if (streq(field, "Environment")) {
+                const char *p;
 
-                r = sd_bus_message_append(m, "v", "as", 1, eq);
+                r = sd_bus_message_open_container(m, 'v', "as");
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                r = sd_bus_message_open_container(m, 'a', "s");
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                p = eq;
+
+                for (;;) {
+                        _cleanup_free_ char *word = NULL;
+
+                        r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE);
+                        if (r < 0) {
+                                log_error("Failed to parse Environment value %s", eq);
+                                return -EINVAL;
+                        }
+                        if (r == 0)
+                                break;
+
+                        if (!env_assignment_is_valid(word)) {
+                                log_error("Invalid environment assignment: %s", eq);
+                                return -EINVAL;
+                        }
+
+                        r = sd_bus_message_append_basic(m, 's', word);
+                        if (r < 0)
+                                return bus_log_create_error(r);
+                }
+
+                r = sd_bus_message_close_container(m);
+                if (r < 0)
+                        return bus_log_create_error(r);
+
+                r = sd_bus_message_close_container(m);
 
         } else if (streq(field, "KillSignal")) {
                 int sig;