From: HATAYAMA Daisuke Date: Wed, 13 Nov 2019 11:30:58 +0000 (-0500) Subject: verify: fix segmentation fault X-Git-Tag: v244-rc1~59 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fc9de36a3b60c69a17442aabf215e2d87e697e6f;p=thirdparty%2Fsystemd.git 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 ...... 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(). --- diff --git a/src/analyze/analyze-verify.c b/src/analyze/analyze-verify.c index 16b07cc8563..4cfbdfa5ab2 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++) {