From: Giedrius Statkevičius Date: Tue, 7 Apr 2020 21:38:16 +0000 (+0300) Subject: verify: ignore nonexistent executables if required X-Git-Tag: v246-rc1~590 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c90c597ee3b6b9d30ee86410e46939ba875e467a;p=thirdparty%2Fsystemd.git verify: ignore nonexistent executables if required We provide a way via the '-' symbol to ignore errors when nonexistent executable files are passed to Exec* parameters & so on. In such a case, the flag `EXEC_COMMAND_IGNORE_FAILURE` is set and we go on happily with our life if that happens. However, `systemd-analyze verify` complained about missing executables even in such a case. In such a case it is not an error for this to happen so check if the flag is set before checking if the file is accessible and executable. Add some small tests to check this condition. Closes #15218. --- diff --git a/src/analyze/analyze-verify.c b/src/analyze/analyze-verify.c index 4cfbdfa5ab2..8275360adc3 100644 --- a/src/analyze/analyze-verify.c +++ b/src/analyze/analyze-verify.c @@ -124,10 +124,13 @@ static int verify_socket(Unit *u) { return 0; } -static int verify_executable(Unit *u, ExecCommand *exec) { +int verify_executable(Unit *u, const ExecCommand *exec) { if (!exec) return 0; + if (exec->flags & EXEC_COMMAND_IGNORE_FAILURE) + return 0; + if (access(exec->path, X_OK) < 0) return log_unit_error_errno(u, errno, "Command %s is not executable: %m", exec->path); diff --git a/src/analyze/analyze-verify.h b/src/analyze/analyze-verify.h index 3561d4302bf..3da2cf7097a 100644 --- a/src/analyze/analyze-verify.h +++ b/src/analyze/analyze-verify.h @@ -3,6 +3,8 @@ #include +#include "execute.h" #include "path-lookup.h" +int verify_executable(Unit *u, const ExecCommand *exec); int verify_units(char **filenames, UnitFileScope scope, bool check_man, bool run_generators); diff --git a/src/analyze/test-verify.c b/src/analyze/test-verify.c new file mode 100644 index 00000000000..dcbb6394c6b --- /dev/null +++ b/src/analyze/test-verify.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ +#include "analyze-verify.h" +#include "tests.h" + +static void test_verify_nonexistent(void) { + /* Negative cases */ + assert_se(verify_executable(NULL, &(ExecCommand) {.flags = EXEC_COMMAND_IGNORE_FAILURE, .path = (char*) "/non/existent"}) == 0); + assert_se(verify_executable(NULL, &(ExecCommand) {.path = (char*) "/non/existent"}) < 0); + + /* Ordinary cases */ + assert_se(verify_executable(NULL, &(ExecCommand) {.path = (char*) "/bin/echo"}) == 0); + assert_se(verify_executable(NULL, &(ExecCommand) {.flags = EXEC_COMMAND_IGNORE_FAILURE, .path = (char*) "/bin/echo"}) == 0); +} + +int main(int argc, char *argv[]) { + test_setup_logging(LOG_DEBUG); + + test_verify_nonexistent(); +} diff --git a/src/test/meson.build b/src/test/meson.build index a674d6cfe93..7f96be8f55a 100644 --- a/src/test/meson.build +++ b/src/test/meson.build @@ -1127,6 +1127,10 @@ tests += [ [], []], + [['src/analyze/test-verify.c', 'src/analyze/analyze-verify.c', 'src/analyze/analyze-verify.h'], + [libcore, libshared], + []], + [['src/login/test-inhibit.c'], [], [],