]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
systemctl-edit: fix abort in find_paths_to_edit()
authorAnita Zhang <the.anitazha@gmail.com>
Thu, 14 Jan 2021 08:02:09 +0000 (00:02 -0800)
committerAnita Zhang <the.anitazha@gmail.com>
Thu, 14 Jan 2021 23:05:27 +0000 (15:05 -0800)
After 85c5d313b5c92115f5c77663e736bcf21e99f02f, if you, for example,
create a drop-in for -.slice without a corresponding -.slice file, you will
get the following:

  # put some valid stuff in /etc/systemd/system/-.slice.d/override.conf

  [root@image ~]# systemctl daemon-reload
  [root@image ~]# systemctl edit -- -.slice
  Assertion 'path' failed at src/systemctl/systemctl-edit.c:425, function
  find_paths_to_edit(). Aborting.
  Aborted

The aforementioned commit sets the ret_dropin_paths argument for
unit_find_paths(). Thus, unit_find_paths() returns 1 in the example above
because it finds a relevant drop-in. However find_paths_to_edit() was written
to expect 1 only if the unit file itself exists (it does not in this example).

To make this behave more like the version of `systemctl edit` prior to
this commit, add an additional check so the code enters the
"unit file not found" code branch.

src/systemctl/systemctl-edit.c

index f6e8671a388268d48e07a32b017243d5cde45a91..a67318258e9037f0914560bf74da13ecec6c6e27 100644 (file)
@@ -405,9 +405,7 @@ static int find_paths_to_edit(sd_bus *bus, char **names, char ***paths) {
                 if (r < 0)
                         return r;
 
-                if (r == 0) {
-                        assert(!path);
-
+                if (!path) {
                         if (!arg_force) {
                                 log_info("Run 'systemctl edit%s --force --full %s' to create a new unit.",
                                          arg_scope == UNIT_FILE_GLOBAL ? " --global" :
@@ -422,8 +420,6 @@ static int find_paths_to_edit(sd_bus *bus, char **names, char ***paths) {
                                                  arg_full ? NULL : ".d/override.conf",
                                                  NULL, &new_path, &tmp_path);
                 } else {
-                        assert(path);
-
                         unit_name = basename(path);
                         /* We follow unit aliases, but we need to propagate the instance */
                         if (unit_name_is_valid(*name, UNIT_NAME_INSTANCE) &&