From: Yu Watanabe Date: Mon, 20 Nov 2023 00:55:49 +0000 (+0900) Subject: kernel-install: propagate failures in plugins X-Git-Tag: v255-rc3~35^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e42931b0ac595cc2095d87ca1523e413bf285bc7;p=thirdparty%2Fsystemd.git kernel-install: propagate failures in plugins 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. --- diff --git a/src/kernel-install/kernel-install.c b/src/kernel-install/kernel-install.c index 6bee169bf41..d7c2aa3a4fa 100644 --- a/src/kernel-install/kernel-install.c +++ b/src/kernel-install/kernel-install.c @@ -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);