From da9dd029a2eec824aac1202bb60737e797d1abca Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sep 23 2022 07:22:36 +0000 Subject: fs-util: replace symlink_atomic() by symlinkat_atomic() --- diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index cbab59b..3f23cca 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -432,7 +432,7 @@ int symlink_idempotent(const char *from, const char *to, bool make_relative) { return 0; } -int symlink_atomic_full(const char *from, const char *to, bool make_relative) { +int symlinkat_atomic_full(const char *from, int atfd, const char *to, bool make_relative) { _cleanup_free_ char *relpath = NULL, *t = NULL; int r; @@ -451,12 +451,13 @@ int symlink_atomic_full(const char *from, const char *to, bool make_relative) { if (r < 0) return r; - if (symlink(from, t) < 0) + if (symlinkat(from, atfd, t) < 0) return -errno; - if (rename(t, to) < 0) { - unlink_noerrno(t); - return -errno; + r = RET_NERRNO(renameat(atfd, t, atfd, to)); + if (r < 0) { + (void) unlinkat(atfd, t, 0); + return r; } return 0; diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index f2174af..6be94d9 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -58,9 +58,9 @@ static inline int touch(const char *path) { int symlink_idempotent(const char *from, const char *to, bool make_relative); -int symlink_atomic_full(const char *from, const char *to, bool make_relative); +int symlinkat_atomic_full(const char *from, int atfd, const char *to, bool make_relative); static inline int symlink_atomic(const char *from, const char *to) { - return symlink_atomic_full(from, to, false); + return symlinkat_atomic_full(from, AT_FDCWD, to, false); } int mknod_atomic(const char *path, mode_t mode, dev_t dev); int mkfifo_atomic(const char *path, mode_t mode); diff --git a/src/shared/label.c b/src/shared/label.c index d00158a..66fcc0a 100644 --- a/src/shared/label.c +++ b/src/shared/label.c @@ -71,7 +71,7 @@ int symlink_atomic_full_label(const char *from, const char *to, bool make_relati if (r < 0) return r; - r = symlink_atomic_full(from, to, make_relative); + r = symlinkat_atomic_full(from, AT_FDCWD, to, make_relative); mac_selinux_create_file_clear(); if (r < 0)