]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
kernel-install: propagate failures in plugins
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 20 Nov 2023 00:55:49 +0000 (09:55 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 20 Nov 2023 00:55:53 +0000 (09:55 +0900)
This fixes a regression introduced by
42551ea7e923bac5df12b20e3e735a487d38dcd5.

In the shell script version, plugin failures are propagated to the
caller. But after the commit, failures in plugins are logged, but never
propagated as the exit code of the execution.

Fixes #30087.

src/kernel-install/kernel-install.c

index 6bee169bf416ae354373d3704537d4c723af8147..d7c2aa3a4fa81e792e26ece479fe788228f15d34 100644 (file)
@@ -1043,7 +1043,7 @@ static int context_prepare_execution(Context *c) {
 }
 
 static int context_execute(Context *c) {
-        int r;
+        int r, ret;
 
         assert(c);
 
@@ -1062,7 +1062,7 @@ static int context_execute(Context *c) {
                 log_debug("Plugin arguments: %s", strna(z));
         }
 
-        r = execute_strv(
+        ret = execute_strv(
                         /* name = */ NULL,
                         c->plugins,
                         /* root = */ NULL,
@@ -1072,14 +1072,13 @@ static int context_execute(Context *c) {
                         c->argv,
                         c->envp,
                         EXEC_DIR_SKIP_REMAINING);
-        if (r < 0)
-                return r;
 
         r = context_remove_entry_dir(c);
         if (r < 0)
                 return r;
 
-        return 0;
+        /* This returns 0 on success, positive exit code on plugin failure, negative errno on other failures. */
+        return ret;
 }
 
 static bool bypass(void) {
@@ -1254,10 +1253,10 @@ static int verb_add_all(int argc, char *argv[], void *userdata) {
                            /* version= */ (*d)->d_name,
                            /* kernel= */ full,
                            /* initrds= */ NULL);
-                RET_GATHER(ret, r);
-
-                if (r >= 0)
+                if (r == 0)
                         n++;
+                else if (ret == 0)
+                        ret = r;
         }
 
         if (n > 0)
@@ -1715,4 +1714,4 @@ static int run(int argc, char* argv[]) {
         return dispatch_verb(argc, argv, verbs, &c);
 }
 
-DEFINE_MAIN_FUNCTION(run);
+DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run);