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().
This commit is contained in:
HATAYAMA Daisuke 2019-11-13 06:30:58 -05:00 committed by Lennart Poettering
parent a53c38f1a2
commit fc9de36a3b
1 changed files with 7 additions and 4 deletions

View File

@ -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++) {