]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
fs-util: replace symlink_atomic() by symlinkat_atomic()
authorLennart Poettering <lennart@poettering.net>
Tue, 13 Sep 2022 10:33:24 +0000 (11:33 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 23 Sep 2022 07:22:36 +0000 (09:22 +0200)
src/basic/fs-util.c
src/basic/fs-util.h
src/shared/label.c

index cbab59b777349ba4aa1653c8fca9acfda3048b4f..3f23ccab24814124933563a1cdb3f770bb9f338c 100644 (file)
@@ -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;
index f2174af15d7f0c47719ac10115e08c16463528d5..6be94d913c655763b6da527343ad2bc042295fff 100644 (file)
@@ -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);
index d00158a2585e67b285a2c4f28197e8bf811c62a4..66fcc0a31f548f844a0c35095566b82694e8dda1 100644 (file)
@@ -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)