aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_lowlevel.c
diff options
context:
space:
mode:
authorlegezywzh <94814730+legezywzh@users.noreply.github.com>2024-06-02 05:18:35 +0800
committerGitHub <noreply@github.com>2024-06-01 23:18:35 +0200
commit949944ff3bde50d62f98b0cab15cef2959d40a2d (patch)
treec0d2290d2e5b2da2817ed6a199cb140681baec86 /lib/fuse_lowlevel.c
parent251d2fb0e15316a479cb16476d880d432da62fb6 (diff)
downloadlibfuse-949944ff3bde50d62f98b0cab15cef2959d40a2d.tar.gz
Fix compatibility issue around fuse_custom_io->clone_fd (#953)
Fixes: 73cd124d0408 ("Add clone_fd to custom IO (#927)") Signed-off-by: Xiaoguang Wang <lege.wang@jaguarmicro.com>
Diffstat (limited to 'lib/fuse_lowlevel.c')
-rw-r--r--lib/fuse_lowlevel.c24
1 files changed, 20 insertions, 4 deletions
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;