]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
verify: fix segmentation fault
authorHATAYAMA Daisuke <d.hatayama@fujitsu.com>
Wed, 13 Nov 2019 11:30:58 +0000 (06:30 -0500)
committerLennart Poettering <lennart@poettering.net>
Wed, 13 Nov 2019 21:20:01 +0000 (22:20 +0100)
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().

src/analyze/analyze-verify.c

index 16b07cc8563a9c41f7b2b69c285eb9fff053d411..4cfbdfa5ab2b353bbd68e2daf7960bed8def7752 100644 (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++) {