From 949944ff3bde50d62f98b0cab15cef2959d40a2d Mon Sep 17 00:00:00 2001 From: legezywzh <94814730+legezywzh@users.noreply.github.com> Date: Sun, 2 Jun 2024 05:18:35 +0800 Subject: Fix compatibility issue around fuse_custom_io->clone_fd (#953) Fixes: 73cd124d0408 ("Add clone_fd to custom IO (#927)") Signed-off-by: Xiaoguang Wang --- lib/fuse_lowlevel.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'lib/fuse_lowlevel.c') diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c index 1f3a5fa..dc1b7a6 100644 --- a/lib/fuse_lowlevel.c +++ b/lib/fuse_lowlevel.c @@ -3190,9 +3190,15 @@ struct fuse_session *fuse_session_new_30(struct fuse_args *args, return _fuse_session_new_317(args, op, op_size, &version, userdata); } -int fuse_session_custom_io(struct fuse_session *se, const struct fuse_custom_io *io, - int fd) +FUSE_SYMVER("fuse_session_custom_io_317", "fuse_session_custom_io@@FUSE_3.17") +int fuse_session_custom_io_317(struct fuse_session *se, + const struct fuse_custom_io *io, size_t op_size, int fd) { + if (sizeof(struct fuse_custom_io) < op_size) { + fuse_log(FUSE_LOG_ERR, "fuse: warning: library too old, some operations may not work\n"); + op_size = sizeof(struct fuse_custom_io); + } + if (fd < 0) { fuse_log(FUSE_LOG_ERR, "Invalid file descriptor value %d passed to " "fuse_session_custom_io()\n", fd); @@ -3212,7 +3218,7 @@ int fuse_session_custom_io(struct fuse_session *se, const struct fuse_custom_io return -EINVAL; } - se->io = malloc(sizeof(struct fuse_custom_io)); + se->io = calloc(1, sizeof(struct fuse_custom_io)); if (se->io == NULL) { fuse_log(FUSE_LOG_ERR, "Failed to allocate memory for custom io. " "Error: %s\n", strerror(errno)); @@ -3220,10 +3226,20 @@ int fuse_session_custom_io(struct fuse_session *se, const struct fuse_custom_io } se->fd = fd; - *se->io = *io; + memcpy(se->io, io, op_size); return 0; } +int fuse_session_custom_io_30(struct fuse_session *se, + const struct fuse_custom_io *io, int fd); +FUSE_SYMVER("fuse_session_custom_io_30", "fuse_session_custom_io@FUSE_3.0") +int fuse_session_custom_io_30(struct fuse_session *se, + const struct fuse_custom_io *io, int fd) +{ + return fuse_session_custom_io_317(se, io, + offsetof(struct fuse_custom_io, clone_fd), fd); +} + int fuse_session_mount(struct fuse_session *se, const char *mountpoint) { int fd; -- cgit v1.2.3