diff mbox series

fuse: Set iov_len to sizeof(int) for FS_IOC_GETFLAGS and FS_IOC_SETFLAGS ioctls

Message ID 20240710101023.2991031-1-ratna.bolla@quest.com (mailing list archive)
State New
Headers show
Series fuse: Set iov_len to sizeof(int) for FS_IOC_GETFLAGS and FS_IOC_SETFLAGS ioctls | expand

Commit Message

Ratna Manoj Bolla July 10, 2024, 10:09 a.m. UTC
Hi,
User programs are passing integer pointers as argument to these ioctls.
Many filesystems(xfs, ext) honour this to prevent corrupting the other four bytes.

This was discussed in the fsdevel mailing list with subject "Argument type for FS_IOC_GETFLAGS/FS_IOC_SETFLAGS ioctls"

Please see if we can be compatible by breaking correctness.

Thanks.

Signed-off-by: Ratna Manoj Bolla <manoj.br@gmail.com>
---
 fs/fuse/ioctl.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Comments

Miklos Szeredi Aug. 29, 2024, 8:12 a.m. UTC | #1
On Wed, 10 Jul 2024 at 12:10, Ratna Manoj Bolla <manoj.br@gmail.com> wrote:
>
> Hi,
> User programs are passing integer pointers as argument to these ioctls.
> Many filesystems(xfs, ext) honour this to prevent corrupting the other four bytes.
>
> This was discussed in the fsdevel mailing list with subject "Argument type for FS_IOC_GETFLAGS/FS_IOC_SETFLAGS ioctls"
>
> Please see if we can be compatible by breaking correctness.

I don't get it, FS_IOC_[GS]ETFLAGS is handled by the VFS since forever
(v5.13 to be precise).

Thanks,
Miklos
diff mbox series

Patch

diff --git a/fs/fuse/ioctl.c b/fs/fuse/ioctl.c
index 572ce8a82ceb..9e0ec0b3375e 100644
--- a/fs/fuse/ioctl.c
+++ b/fs/fuse/ioctl.c
@@ -264,7 +264,16 @@  long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
 		struct iovec *iov = iov_page;
 
 		iov->iov_base = (void __user *)arg;
-		iov->iov_len = _IOC_SIZE(cmd);
+
+		switch (cmd) {
+		case FS_IOC_GETFLAGS:
+		case FS_IOC_SETFLAGS:
+			iov->iov_len = sizeof(int);
+			break;
+		default:
+			iov->iov_len = _IOC_SIZE(cmd);
+			break;
+		}
 
 		if (_IOC_DIR(cmd) & _IOC_WRITE) {
 			in_iov = iov;