]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: allow VFS_PWRITE_APPEND_OFFSET in vfs_valid_pwrite_range()
authorRalph Boehme <slow@samba.org>
Fri, 29 Nov 2024 13:09:12 +0000 (14:09 +0100)
committerJeremy Allison <jra@samba.org>
Tue, 7 Jan 2025 22:04:33 +0000 (22:04 +0000)
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/fileio.c
source3/smbd/proto.h
source3/smbd/smb2_aio.c
source3/smbd/vfs.c

index fc6668e41866fa82d826d01ff15c22bb2477460d..c043d9724cb872d716cf051f437217ae4e0d7c59 100644 (file)
@@ -80,7 +80,7 @@ static ssize_t real_write_file(struct smb_request *req,
        ssize_t ret;
        bool ok;
 
-       ok = vfs_valid_pwrite_range(pos, n);
+       ok = vfs_valid_pwrite_range(fsp, pos, n);
        if (!ok) {
                errno = EINVAL;
                return -1;
index e61b137ea1316ca5bccd321fe890eaea04ba500e..12f41e7172c624d3db4ab4bc91c4486982508312 100644 (file)
@@ -1165,7 +1165,9 @@ bool vfs_init_custom(connection_struct *conn, const char *vfs_object);
 bool smbd_vfs_init(connection_struct *conn);
 NTSTATUS vfs_file_exist(connection_struct *conn, struct smb_filename *smb_fname);
 bool vfs_valid_pread_range(off_t offset, size_t length);
-bool vfs_valid_pwrite_range(off_t offset, size_t length);
+bool vfs_valid_pwrite_range(const struct files_struct *fsp,
+                           off_t offset,
+                           size_t length);
 bool vfs_valid_allocation_range(off_t offset, size_t length);
 ssize_t vfs_pwrite_data(struct smb_request *req,
                        files_struct *fsp,
index 88aa68d218f5fa9d539fbb52afd2209f8ebcf6f3..7430a830f1bcbda890e9737c834bdd427564c264 100644 (file)
@@ -188,7 +188,7 @@ struct tevent_req *pwrite_fsync_send(TALLOC_CTX *mem_ctx,
        state->fsp = fsp;
        state->write_through = write_through;
 
-       ok = vfs_valid_pwrite_range(offset, n);
+       ok = vfs_valid_pwrite_range(fsp, offset, n);
        if (!ok) {
                tevent_req_error(req, EINVAL);
                return tevent_req_post(req, ev);
index c5be257c0d353e7c0eb4e4d80e933f46575accd5..a1d4e7707dbe5f5c7405008bacb198383c2195a1 100644 (file)
@@ -449,8 +449,19 @@ bool vfs_valid_allocation_range(off_t offset, size_t length)
        return true;
 }
 
-bool vfs_valid_pwrite_range(off_t offset, size_t length)
+bool vfs_valid_pwrite_range(const struct files_struct *fsp,
+                           off_t offset,
+                           size_t length)
 {
+       if (fsp->fsp_flags.posix_append) {
+               if (offset != VFS_PWRITE_APPEND_OFFSET) {
+                       return false;
+               }
+               return true;
+       } else if (offset == VFS_PWRITE_APPEND_OFFSET) {
+               return false;
+       }
+
        return vfs_valid_allocation_range(offset, length);
 }
 
@@ -464,7 +475,7 @@ ssize_t vfs_pwrite_data(struct smb_request *req,
        ssize_t ret;
        bool ok;
 
-       ok = vfs_valid_pwrite_range(offset, N);
+       ok = vfs_valid_pwrite_range(fsp, offset, N);
        if (!ok) {
                errno = EINVAL;
                return -1;