diff options
author | HATAYAMA Daisuke <d.hatayama@fujitsu.com> | 2019-11-13 06:30:58 -0500 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-11-19 11:07:31 +0100 |
commit | a87e8fdc72d73184714e809240bad3c6d8e8a98b (patch) | |
tree | 833ad9d068375447fcbc6c63d0a655b89f3a233d | |
parent | 3aea728cd2d20d234c8f2292c9f328432581901f (diff) | |
download | systemd-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.c | 11 |
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++) { |