]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
execute: set the right exit status for CHDIR vs. CHROOT 5287/head
authorLennart Poettering <lennart@poettering.net>
Thu, 9 Feb 2017 12:17:00 +0000 (13:17 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 9 Feb 2017 12:18:35 +0000 (13:18 +0100)
Fixes: #5125
src/core/execute.c

index be036957762c113e1fdea68461b9fe5641cf9167..6041da46d64a25c4388efb1a38bf0f1f518175aa 100644 (file)
@@ -2015,16 +2015,20 @@ static int apply_working_directory(
                 const ExecContext *context,
                 const ExecParameters *params,
                 const char *home,
-                const bool needs_mount_ns) {
+                const bool needs_mount_ns,
+                int *exit_status) {
 
         const char *d, *wd;
 
         assert(context);
+        assert(exit_status);
 
         if (context->working_directory_home) {
 
-                if (!home)
+                if (!home) {
+                        *exit_status = EXIT_CHDIR;
                         return -ENXIO;
+                }
 
                 wd = home;
 
@@ -2035,15 +2039,19 @@ static int apply_working_directory(
 
         if (params->flags & EXEC_APPLY_CHROOT) {
                 if (!needs_mount_ns && context->root_directory)
-                        if (chroot(context->root_directory) < 0)
+                        if (chroot(context->root_directory) < 0) {
+                                *exit_status = EXIT_CHROOT;
                                 return -errno;
+                        }
 
                 d = wd;
         } else
                 d = prefix_roota(context->root_directory, wd);
 
-        if (chdir(d) < 0 && !context->working_directory_missing_ok)
+        if (chdir(d) < 0 && !context->working_directory_missing_ok) {
+                *exit_status = EXIT_CHDIR;
                 return -errno;
+        }
 
         return 0;
 }
@@ -2606,11 +2614,9 @@ static int exec_child(
         }
 
         /* Apply just after mount namespace setup */
-        r = apply_working_directory(context, params, home, needs_mount_namespace);
-        if (r < 0) {
-                *exit_status = EXIT_CHROOT;
+        r = apply_working_directory(context, params, home, needs_mount_namespace, exit_status);
+        if (r < 0)
                 return r;
-        }
 
         /* Drop groups as early as possbile */
         if ((params->flags & EXEC_APPLY_PERMISSIONS) && !command->privileged) {