aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGravatar Miklos Szeredi <mszeredi@suse.cz>2014-07-21 18:53:04 +0200
committerGravatar Miklos Szeredi <mszeredi@suse.cz>2014-07-21 18:53:04 +0200
commite3b7d4c278a26520be63d99d6ea84b26906fe73d (patch)
treecb1c7173562dca7f4ecf114723a2c3b5fd28b1d3 /lib
parent7914d3a435705dd6cf876e9a704557d7632d3cec (diff)
libfuse: highlevel API: fix directory file handle passed to ioctl() method
Reported by Eric Biggers
Diffstat (limited to 'lib')
-rw-r--r--lib/fuse.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/fuse.c b/lib/fuse.c
index 77da446..75d657c 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -4106,12 +4106,13 @@ static void fuse_lib_bmap(fuse_req_t req, fuse_ino_t ino, size_t blocksize,
}
static void fuse_lib_ioctl(fuse_req_t req, fuse_ino_t ino, int cmd, void *arg,
- struct fuse_file_info *fi, unsigned int flags,
+ struct fuse_file_info *llfi, unsigned int flags,
const void *in_buf, size_t in_bufsz,
size_t out_bufsz)
{
struct fuse *f = req_fuse_prepare(req);
struct fuse_intr_data d;
+ struct fuse_file_info fi;
char *path, *out_buf = NULL;
int err;
@@ -4119,6 +4120,11 @@ static void fuse_lib_ioctl(fuse_req_t req, fuse_ino_t ino, int cmd, void *arg,
if (flags & FUSE_IOCTL_UNRESTRICTED)
goto err;
+ if (flags & FUSE_IOCTL_DIR)
+ get_dirhandle(llfi, &fi);
+ else
+ fi = *llfi;
+
if (out_bufsz) {
err = -ENOMEM;
out_buf = malloc(out_bufsz);
@@ -4136,7 +4142,7 @@ static void fuse_lib_ioctl(fuse_req_t req, fuse_ino_t ino, int cmd, void *arg,
fuse_prepare_interrupt(f, req, &d);
- err = fuse_fs_ioctl(f->fs, path, cmd, arg, fi, flags,
+ err = fuse_fs_ioctl(f->fs, path, cmd, arg, &fi, flags,
out_buf ?: (void *)in_buf);
fuse_finish_interrupt(f, req, &d);