if (size - sizeof(outarg) != outarg.size)
return -EINVAL;
+ if (outarg.offset >= MAX_LFS_FILESIZE)
+ return -EINVAL;
+
nodeid = outarg.nodeid;
+ num = min(outarg.size, MAX_LFS_FILESIZE - outarg.offset);
down_read(&fc->killsb);
index = outarg.offset >> PAGE_SHIFT;
offset = outarg.offset & ~PAGE_MASK;
file_size = i_size_read(inode);
- end = outarg.offset + outarg.size;
+ end = outarg.offset + num;
if (end > file_size) {
file_size = end;
- fuse_write_update_attr(inode, file_size, outarg.size);
+ fuse_write_update_attr(inode, file_size, num);
}
- num = outarg.size;
while (num) {
struct folio *folio;
unsigned int folio_offset;
num = min(outarg->size, fc->max_write);
if (outarg->offset > file_size)
num = 0;
- else if (outarg->offset + num > file_size)
+ else if (num > file_size - outarg->offset)
num = file_size - outarg->offset;
num_pages = (num + offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
fuse_copy_finish(cs);
+ if (outarg.offset >= MAX_LFS_FILESIZE)
+ return -EINVAL;
+
down_read(&fc->killsb);
err = -ENOENT;
nodeid = outarg.nodeid;