core/execute-serialize: use serialize_item_escaped() for external paths
authorMike Yuan <me@yhndnzj.com>
Sat, 3 Aug 2024 20:38:18 +0000 (22:38 +0200)
committerLuca Boccassi <bluca@debian.org>
Thu, 15 Aug 2024 13:04:41 +0000 (14:04 +0100)
Otherwise, read_stripped_line() would spuriously drop trailing spaces.

Fixes #33924

(cherry picked from commit 9be46b1da8b01c3f47e6c050185f2b45484d6300)

src/core/execute-serialize.c

index 3dba7eb2f0b4d955cb5075ed573944536dc995e8..41b31e9ae3f212732d9eec5e93333e1b4f5481fe 100644 (file)
@@ -1759,15 +1759,23 @@ static int exec_context_serialize(const ExecContext *c, FILE *f) {
         if (r < 0)
                 return r;
 
-        r = serialize_item(f, "exec-context-working-directory", c->working_directory);
+        r = serialize_item_escaped(f, "exec-context-working-directory", c->working_directory);
         if (r < 0)
                 return r;
 
-        r = serialize_item(f, "exec-context-root-directory", c->root_directory);
+        r = serialize_bool_elide(f, "exec-context-working-directory-missing-ok", c->working_directory_missing_ok);
         if (r < 0)
                 return r;
 
-        r = serialize_item(f, "exec-context-root-image", c->root_image);
+        r = serialize_bool_elide(f, "exec-context-working-directory-home", c->working_directory_home);
+        if (r < 0)
+                return r;
+
+        r = serialize_item_escaped(f, "exec-context-root-directory", c->root_directory);
+        if (r < 0)
+                return r;
+
+        r = serialize_item_escaped(f, "exec-context-root-image", c->root_image);
         if (r < 0)
                 return r;
 
@@ -1982,14 +1990,6 @@ static int exec_context_serialize(const ExecContext *c, FILE *f) {
                         return r;
         }
 
-        r = serialize_bool_elide(f, "exec-context-working-directory-missing-ok", c->working_directory_missing_ok);
-        if (r < 0)
-                return r;
-
-        r = serialize_bool_elide(f, "exec-context-working-directory-home", c->working_directory_home);
-        if (r < 0)
-                return r;
-
         if (c->oom_score_adjust_set) {
                 r = serialize_item_format(f, "exec-context-oom-score-adjust", "%i", c->oom_score_adjust);
                 if (r < 0)
@@ -2627,17 +2627,29 @@ static int exec_context_deserialize(ExecContext *c, FILE *f) {
                         if (r < 0)
                                 return r;
                 } else if ((val = startswith(l, "exec-context-working-directory="))) {
-                        r = free_and_strdup(&c->working_directory, val);
-                        if (r < 0)
-                                return r;
+                        ssize_t k;
+                        char *p;
+
+                        k = cunescape(val, 0, &p);
+                        if (k < 0)
+                                return k;
+                        free_and_replace(c->working_directory, p);
                 } else if ((val = startswith(l, "exec-context-root-directory="))) {
-                        r = free_and_strdup(&c->root_directory, val);
-                        if (r < 0)
-                                return r;
+                        ssize_t k;
+                        char *p;
+
+                        k = cunescape(val, 0, &p);
+                        if (k < 0)
+                                return k;
+                        free_and_replace(c->root_directory, p);
                 } else if ((val = startswith(l, "exec-context-root-image="))) {
-                        r = free_and_strdup(&c->root_image, val);
-                        if (r < 0)
-                                return r;
+                        ssize_t k;
+                        char *p;
+
+                        k = cunescape(val, 0, &p);
+                        if (k < 0)
+                                return k;
+                        free_and_replace(c->root_image, p);
                 } else if ((val = startswith(l, "exec-context-root-image-options="))) {
                         for (;;) {
                                 _cleanup_free_ char *word = NULL, *mount_options = NULL, *partition = NULL;