]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
systemctl: ignore invalid variables in import-environment 17188/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 28 Sep 2020 15:29:34 +0000 (17:29 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 12 Oct 2020 16:27:20 +0000 (18:27 +0200)
When doing import-environment, we shouldn't fail if some assignment is invalid.
OTOH, if the invalid assignment is specified as a positional argument, we should
keep failing.

This would also fix https://bugzilla.redhat.com/show_bug.cgi?id=1754395, by
ignoring certain variables which are not important in that scenario. It seems
like the right thing to do in general.

src/systemctl/systemctl-set-environment.c

index 462924f5c9a63ef8a4aff7335062fa758eee6563..ac1ec7d6feacdf2e65f3c6689eed0d2abdf320a6 100644 (file)
@@ -61,6 +61,12 @@ int show_environment(int argc, char *argv[], void *userdata) {
         return 0;
 }
 
+static void invalid_callback(const char *p, void *userdata) {
+        _cleanup_free_ char *t = cescape(p);
+        log_debug("Ignoring invalid environment assignment \"%s\".", strnull(t));
+}
+
 int set_environment(int argc, char *argv[], void *userdata) {
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
@@ -112,9 +118,18 @@ int import_environment(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return bus_log_create_error(r);
 
-        if (argc < 2)
-                r = sd_bus_message_append_strv(m, environ);
-        else {
+        if (argc < 2) {
+                _cleanup_strv_free_ char **copy = NULL;
+                copy = strv_copy(environ);
+                if (!copy)
+                        return log_oom();
+                strv_env_clean_with_callback(copy, invalid_callback, NULL);
+                r = sd_bus_message_append_strv(m, copy);
+
+        } else {
                 char **a, **b;
 
                 r = sd_bus_message_open_container(m, 'a', "s");