]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:vfs_default: implement VFS_RENAME_HOW_NO_REPLACE in vfswrap_renameat()
authorStefan Metzmacher <metze@samba.org>
Wed, 7 Aug 2024 11:14:23 +0000 (13:14 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 21 Aug 2024 08:02:30 +0000 (08:02 +0000)
We can use renameat2() without ifdef as libreplace always provides it.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15693

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/modules/vfs_default.c

index ec46596ac6280f07d02b0448a8748abdc7b92d98..5922aba3e8a50d9dea2ad46ef4643e044baf69ee 100644 (file)
@@ -1291,22 +1291,28 @@ static int vfswrap_renameat(vfs_handle_struct *handle,
                          const struct vfs_rename_how *how)
 {
        int result = -1;
+       int flags = 0;
 
        START_PROFILE(syscall_renameat);
 
        SMB_ASSERT(!is_named_stream(smb_fname_src));
        SMB_ASSERT(!is_named_stream(smb_fname_dst));
 
-       if (how->flags != 0) {
+       if (how->flags & ~VFS_RENAME_HOW_NO_REPLACE) {
                END_PROFILE(syscall_renameat);
                errno = EINVAL;
                return -1;
        }
 
-       result = renameat(fsp_get_pathref_fd(srcfsp),
-                       smb_fname_src->base_name,
-                       fsp_get_pathref_fd(dstfsp),
-                       smb_fname_dst->base_name);
+       if (how->flags & VFS_RENAME_HOW_NO_REPLACE) {
+               flags |= RENAME_NOREPLACE;
+       }
+
+       result = renameat2(fsp_get_pathref_fd(srcfsp),
+                          smb_fname_src->base_name,
+                          fsp_get_pathref_fd(dstfsp),
+                          smb_fname_dst->base_name,
+                          flags);
 
        END_PROFILE(syscall_renameat);
        return result;