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:
parent
1a50bf77af
commit
45825a12f9
@ -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;
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user