]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic: Use xopenat_full() in mkdir_p_root_full()
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 28 Oct 2025 07:49:13 +0000 (08:49 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 28 Oct 2025 12:01:48 +0000 (13:01 +0100)
src/basic/mkdir.c

index a3a02b3e4eba90d5531e2e1eb06195c5f91041e1..384b8606114295f25793baffb55310c30fe84033 100644 (file)
@@ -237,22 +237,19 @@ int mkdir_p_root_full(const char *root, const char *p, uid_t uid, gid_t gid, mod
         if (r < 0)
                 return r;
 
-        if (path_strv_contains(subvolumes, p))
-                r = btrfs_subvol_make_fallback(dfd, bn, m);
-        else
-                r = RET_NERRNO(mkdirat(dfd, bn, m));
-        if (r == -EEXIST)
+        _cleanup_close_ int nfd = xopenat_full(
+                                dfd, bn,
+                                O_DIRECTORY|O_CREAT|O_EXCL|O_NOFOLLOW|O_CLOEXEC,
+                                path_strv_contains(subvolumes, p) ? XO_SUBVOLUME : 0,
+                                m);
+        if (nfd == -EEXIST)
                 return 0;
-        if (r < 0)
-                return r;
+        if (nfd < 0)
+                return nfd;
 
         if (ts == USEC_INFINITY && !uid_is_valid(uid) && !gid_is_valid(gid))
                 return 1;
 
-        _cleanup_close_ int nfd = openat(dfd, bn, O_CLOEXEC|O_DIRECTORY|O_NOFOLLOW);
-        if (nfd < 0)
-                return -errno;
-
         if (ts != USEC_INFINITY) {
                 struct timespec tspec;
                 timespec_store(&tspec, ts);