install: when linking a file, create the link first or abort

We'd create aliases and other symlinks first, and only then try to create
the main link. Since that can fail, let's do things in opposite order, and
abort immediately if we can't link the file itself.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2022-03-11 14:27:46 +01:00
parent 17a2679e99
commit 20d68b3aec
2 changed files with 10 additions and 11 deletions

View File

@@ -1980,6 +1980,13 @@ static int install_info_apply(
bool force = file_flags & UNIT_FILE_FORCE;
r = install_info_symlink_link(info, lp, config_path, force, changes, n_changes);
/* Do not count links to the unit file towards the "carries_install_info" count */
if (r < 0)
/* If linking of the file failed, do not try to create other symlinks,
* because they might would pointing to a non-existent or wrong unit. */
return r;
r = install_info_symlink_alias(scope, info, lp, config_path, force, changes, n_changes);
q = install_info_symlink_wants(scope, file_flags, info, lp, config_path, info->wanted_by, ".wants/", changes, n_changes);
@@ -1990,11 +1997,6 @@ static int install_info_apply(
if (r == 0)
r = q;
q = install_info_symlink_link(info, lp, config_path, force, changes, n_changes);
/* Do not count links to the unit file towards the "carries_install_info" count */
if (r == 0 && q < 0)
r = q;
return r;
}

View File

@@ -173,12 +173,9 @@ islink "$root/etc/systemd/system/link1.path" "/link1.path"
islink "$root/etc/systemd/system/paths.target.wants/link1.path" "/link1.path"
: -------enable already linked different path-----------------
# FIXME
# "$systemctl" --root="$root" enable '/subdir/link1.path' && { echo "Expected failure" >&2; exit 1; }
# test -h "$root/etc/systemd/system/link1.path"
# readlink "$root/etc/systemd/system/link1.path"
# test -h "$root/etc/systemd/system/paths.target.wants/link1.path"
# readlink "$root/etc/systemd/system/paths.target.wants/link1.path"
"$systemctl" --root="$root" enable '/subdir/link1.path' && { echo "Expected failure" >&2; exit 1; }
islink "$root/etc/systemd/system/link1.path" "/link1.path"
islink "$root/etc/systemd/system/paths.target.wants/link1.path" "/link1.path"
: -------enable bad suffix------------------------------------
cp "$root/link1.path" "$root/subdir/link1.suffix"