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;
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,
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);
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);
}
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;