fusefs: fix FUSE_CREATE with file handles and fuse protocol < 7.9

Prior to fuse protocol version 7.9, the fuse_entry_out structure had a
smaller size.  But fuse_vnop_create did not take that into account when
working with servers that use older protocols.  The bug does not matter
for servers which don't use file handles or open flags (the only fields
affected).

PR:		263625
Submitted by:	Ali Abdallah <ali.abdallah@suse.com>
MFC after:	2 weeks
This commit is contained in:
Alan Somers 2022-04-28 15:13:09 -06:00
parent 1a50bf77af
commit 45825a12f9
2 changed files with 13 additions and 6 deletions

View File

@ -1042,7 +1042,11 @@ fuse_vnop_create(struct vop_create_args *ap)
}
if (op == FUSE_CREATE) {
foo = (struct fuse_open_out*)(feo + 1);
if (fuse_libabi_geq(data, 7, 9))
foo = (struct fuse_open_out*)(feo + 1);
else
foo = (struct fuse_open_out*)((char*)feo +
FUSE_COMPAT_ENTRY_OUT_SIZE);
} else {
/* Issue a separate FUSE_OPEN */
struct fuse_open_in *foi;

View File

@ -415,15 +415,18 @@ TEST_F(Create_7_8, ok)
expect_create(RELPATH, mode,
ReturnImmediate([=](auto in __unused, auto& out) {
SET_OUT_HEADER_LEN(out, create_7_8);
out.body.create.entry.attr.mode = mode;
out.body.create.entry.nodeid = ino;
out.body.create.entry.entry_valid = UINT64_MAX;
out.body.create.entry.attr_valid = UINT64_MAX;
out.body.create_7_8.entry.attr.mode = mode;
out.body.create_7_8.entry.nodeid = ino;
out.body.create_7_8.entry.entry_valid = UINT64_MAX;
out.body.create_7_8.entry.attr_valid = UINT64_MAX;
out.body.create_7_8.open.fh = FH;
}));
expect_flush(ino, 1, ReturnErrno(0));
expect_release(ino, FH);
fd = open(FULLPATH, O_CREAT | O_EXCL, mode);
ASSERT_LE(0, fd) << strerror(errno);
leak(fd);
close(fd);
}
TEST_F(Create_7_11, ok)