From: Lennart Poettering Date: Tue, 13 Sep 2022 10:33:24 +0000 (+0100) Subject: fs-util: replace symlink_atomic() by symlinkat_atomic() X-Git-Tag: v252-rc1~100^2~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=da9dd029a2eec824aac1202bb60737e797d1abca;p=thirdparty%2Fsystemd.git fs-util: replace symlink_atomic() by symlinkat_atomic() --- diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index cbab59b7773..3f23ccab248 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 f2174af15d7..6be94d913c6 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 d00158a2585..66fcc0a31f5 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)