mirror of
https://github.com/clearlinux/systemd-stable.git
synced 2026-09-06 13:41:31 +00:00
install: create_symlink() check unlink() return value
create_symlink() do not check the return value of unlink(), this may confuse the user. Before the unlink() call we check the 'force' argument. If it is not set we fail with -EEXIST, otherwise we unlink() the file, therefore the next symlink() should not fail with -EEXIST (do not count races...). However since callers may not have appropriate privileges to unlink() the file we lose the -EPERM or any other errno code of unlink(), and return the -EEXIST of the next symlink(). Fix this by checking unlink() results. Before: $ systemctl --force --root=~/container-03 set-default multi-user.target Failed to set default target: File exists After: $ systemctl --force --root=~/container-03 set-default multi-user.target Failed to set default target: Permission denied
This commit is contained in:
committed by
Zbigniew Jędrzejewski-Szmek
parent
a1484a216e
commit
af7fce1cdb
@@ -1170,7 +1170,9 @@ static int create_symlink(
|
||||
if (!force)
|
||||
return -EEXIST;
|
||||
|
||||
unlink(new_path);
|
||||
r = unlink(new_path);
|
||||
if (r < 0 && errno != ENOENT)
|
||||
return -errno;
|
||||
|
||||
if (symlink(old_path, new_path) >= 0) {
|
||||
add_file_change(changes, n_changes, UNIT_FILE_UNLINK, new_path, NULL);
|
||||
|
||||
Reference in New Issue
Block a user