From c067e61b85f7b542125c16cc35db9194d23d9455 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Thu, 29 Dec 2022 14:51:06 +0800 Subject: [PATCH] systemctl: enable: overwrite broken alias symlinks When switching to an alternative alias provider, the previous one might have been uninstalled or so. It should be fine for us to overwrite them directly. Closes #23694 --- src/shared/install.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/shared/install.c b/src/shared/install.c index db150247fc..dc6e12fd06 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -1892,6 +1892,7 @@ static int install_info_symlink_alias( STRV_FOREACH(s, info->aliases) { _cleanup_free_ char *alias_path = NULL, *dst = NULL, *dst_updated = NULL; + bool broken; q = install_name_printf(scope, info, *s, &dst); if (q < 0) { @@ -1912,7 +1913,14 @@ static int install_info_symlink_alias( if (!alias_path) return -ENOMEM; - q = create_symlink(lp, info->path, alias_path, force, changes, n_changes); + q = chase_symlinks(alias_path, lp->root_dir, CHASE_NONEXISTENT, NULL, NULL); + if (q < 0 && q != -ENOENT) { + r = r < 0 ? r : q; + continue; + } + broken = q == 0; /* symlink target does not exist? */ + + q = create_symlink(lp, info->path, alias_path, force || broken, changes, n_changes); r = r < 0 ? r : q; }