diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2014-07-21 18:53:04 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2014-07-21 18:53:04 +0200 |
commit | e3b7d4c278a26520be63d99d6ea84b26906fe73d (patch) | |
tree | cb1c7173562dca7f4ecf114723a2c3b5fd28b1d3 /lib | |
parent | 7914d3a435705dd6cf876e9a704557d7632d3cec (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.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -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); |