From 510aa8b33d9221c7370a199192ee375f988d039c Mon Sep 17 00:00:00 2001
From: Mike Yuan <me@yhndnzj.com>
Date: Sat, 3 Aug 2024 22:38:18 +0200
Subject: [PATCH 0837/1160] core/execute-serialize: use
 serialize_item_escaped() for external paths

Otherwise, read_stripped_line() would spuriously drop trailing spaces.

Fixes #33924

(cherry picked from commit 9be46b1da8b01c3f47e6c050185f2b45484d6300)
(cherry picked from commit c3ede0cfe78c4d70cfbeb333897969e27a6c6dda)
---
 src/core/execute-serialize.c | 52 ++++++++++++++++++++++--------------
 1 file changed, 32 insertions(+), 20 deletions(-)

diff --git a/src/core/execute-serialize.c b/src/core/execute-serialize.c
index 5239d8ccf0..7320722512 100644
--- a/src/core/execute-serialize.c
+++ b/src/core/execute-serialize.c
@@ -1739,15 +1739,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;
 
@@ -1968,14 +1976,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)
@@ -2611,17 +2611,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;
-- 
2.33.0