summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHATAYAMA Daisuke <d.hatayama@fujitsu.com>2019-11-13 06:30:58 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-11-19 11:07:31 +0100
commita87e8fdc72d73184714e809240bad3c6d8e8a98b (patch)
tree833ad9d068375447fcbc6c63d0a655b89f3a233d
parent3aea728cd2d20d234c8f2292c9f328432581901f (diff)
downloadsystemd-a87e8fdc72d73184714e809240bad3c6d8e8a98b.tar.gz
verify: fix segmentation fault
systemd-analyze verify command now results in segmentation fault if two consecutive non-existent unit file names are given: # ./build/systemd-analyze a.service b.service ...<snip irrelevant part>... Unit a.service not found. Unit b.service not found. Segmentation fault (core dumped) The cause of this is a wrong handling of return value of manager_load_startable_unit_or_warn() in verify_units() in failure case. It looks that the current logic wants to assign the first error status throughout verify_units() into variable r and count up variable count only when a given unit file exists. However, due to the wrong handling of the return value of manager_load_startable_unit_or_warn() in verify_units(), the variable count is unexpectedly incremented even when there is no such unit file because the variable r already contains non-zero value in the 2nd failure, set by the 1st failure, and then the condition k < 0 && r == 0 evaluates to false. This commit fixes the wrong handling of return value of manager_load_startable_unit_or_warn() in verify_units(). (cherry picked from commit fc9de36a3b60c69a17442aabf215e2d87e697e6f)
-rw-r--r--src/analyze/analyze-verify.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/analyze/analyze-verify.c b/src/analyze/analyze-verify.c
index 16b07cc856..4cfbdfa5ab 100644
--- a/src/analyze/analyze-verify.c
+++ b/src/analyze/analyze-verify.c
@@ -271,10 +271,13 @@ int verify_units(char **filenames, UnitFileScope scope, bool check_man, bool run
}
k = manager_load_startable_unit_or_warn(m, NULL, prepared, &units[count]);
- if (k < 0 && r == 0)
- r = k;
- else
- count++;
+ if (k < 0) {
+ if (r == 0)
+ r = k;
+ continue;
+ }
+
+ count++;
}
for (i = 0; i < count; i++) {