All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] fuse: Clear setuid bit even in cache=never path
@ 2019-05-09 19:42 Vivek Goyal
  0 siblings, 0 replies; only message in thread
From: Vivek Goyal @ 2019-05-09 19:42 UTC (permalink / raw)
  To: linux-fsdevel, Miklos Szeredi

If fuse daemon is started with cache=never, fuse falls back to direct IO.
In that write path we don't call file_remove_privs() and that means setuid
bit is not cleared if unpriviliged user writes to a file with setuid bit set.

pjdfstest chmod test 12.t tests this and fails.

Fix this by calling fuse_remove_privs() even for direct I/O path.

I tested this as follows.

- Run fuse example pasthrough fs.

  $ passthrough_ll /mnt/pasthrough-mnt -o default_permissions,allow_other,cache=never
  $ mkdir /mnt/pasthrough-mnt/testdir
  $ cd /mnt/pasthrough-mnt/testdir
  $ prove -rv pjdfstests/tests/chmod/12.t

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
---
 fs/fuse/file.c |   18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

Index: rhvgoyal-linux/fs/fuse/file.c
===================================================================
--- rhvgoyal-linux.orig/fs/fuse/file.c	2019-05-09 15:08:36.782054201 -0400
+++ rhvgoyal-linux/fs/fuse/file.c	2019-05-09 15:28:09.397054201 -0400
@@ -1456,14 +1456,18 @@ static ssize_t fuse_direct_write_iter(st
 	/* Don't allow parallel writes to the same file */
 	inode_lock(inode);
 	res = generic_write_checks(iocb, from);
-	if (res > 0) {
-		if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) {
-			res = fuse_direct_IO(iocb, from);
-		} else {
-			res = fuse_direct_io(&io, from, &iocb->ki_pos,
-					     FUSE_DIO_WRITE);
-		}
+	if (res <= 0)
+		goto out;
+
+	res = file_remove_privs(iocb->ki_filp);
+	if (res)
+		goto out;
+	if (!is_sync_kiocb(iocb) && iocb->ki_flags & IOCB_DIRECT) {
+		res = fuse_direct_IO(iocb, from);
+	} else {
+		res = fuse_direct_io(&io, from, &iocb->ki_pos, FUSE_DIO_WRITE);
 	}
+out:
 	fuse_invalidate_attr(inode);
 	if (res > 0)
 		fuse_write_update_size(inode, iocb->ki_pos);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-05-09 19:42 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-05-09 19:42 [PATCH] fuse: Clear setuid bit even in cache=never path Vivek Goyal

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.