Blob Blame History Raw
From 9b655d805e78a314a24b8493c6c116a4d943beb9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Date: Fri, 11 Mar 2022 14:27:46 +0100
Subject: [PATCH] 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.

(cherry picked from commit 20d68b3aec62110351bdc695fd1a55adcf3a6ee5)

Related: #2082131
---
 src/shared/install.c          | 12 +++++++-----
 test/test-systemctl-enable.sh |  9 +++------
 2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/shared/install.c b/src/shared/install.c
index 785ef55dbd..fadd2be248 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -1985,6 +1985,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);
@@ -1995,11 +2002,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;
 }
 
diff --git a/test/test-systemctl-enable.sh b/test/test-systemctl-enable.sh
index 3aa61222a8..c1fb9626ab 100644
--- a/test/test-systemctl-enable.sh
+++ b/test/test-systemctl-enable.sh
@@ -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"