summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiedrius Statkevičius <giedriuswork@gmail.com>2020-04-08 00:38:16 +0300
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-04-17 14:34:07 +0200
commite7ee9063719457dfd9af2c762266a542b5528827 (patch)
treeb3800566a85653c00fae02978bb624532c1736f2
parent037b5e2281fe64f3ee0cbf7dd4c454e9471723b0 (diff)
downloadsystemd-e7ee9063719457dfd9af2c762266a542b5528827.tar.gz
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. (cherry picked from commit c90c597ee3b6b9d30ee86410e46939ba875e467a)
-rw-r--r--src/analyze/analyze-verify.c5
-rw-r--r--src/analyze/analyze-verify.h2
-rw-r--r--src/analyze/test-verify.c19
-rw-r--r--src/test/meson.build4
4 files changed, 29 insertions, 1 deletions
diff --git a/src/analyze/analyze-verify.c b/src/analyze/analyze-verify.c
index 4cfbdfa5ab..8275360adc 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 3561d4302b..3da2cf7097 100644
--- a/src/analyze/analyze-verify.h
+++ b/src/analyze/analyze-verify.h
@@ -3,6 +3,8 @@
#include <stdbool.h>
+#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 0000000000..dcbb6394c6
--- /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 b79b197c16..a150ee106b 100644
--- a/src/test/meson.build
+++ b/src/test/meson.build
@@ -1123,6 +1123,10 @@ tests += [
[],
[]],
+ [['src/analyze/test-verify.c', 'src/analyze/analyze-verify.c', 'src/analyze/analyze-verify.h'],
+ [libcore, libshared],
+ []],
+
[['src/login/test-inhibit.c'],
[],
[],