fuse: handle idmappings properly in ->write_iter()
authorAlexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
Tue, 3 Sep 2024 15:16:23 +0000 (17:16 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Wed, 4 Sep 2024 14:51:11 +0000 (16:51 +0200)
This is needed to properly clear suid/sgid.

Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/file.c

index 0c33ddf..ca553d7 100644 (file)
@@ -1398,6 +1398,7 @@ static void fuse_dio_unlock(struct kiocb *iocb, bool exclusive)
 static ssize_t fuse_cache_write_iter(struct kiocb *iocb, struct iov_iter *from)
 {
        struct file *file = iocb->ki_filp;
+       struct mnt_idmap *idmap = file_mnt_idmap(file);
        struct address_space *mapping = file->f_mapping;
        ssize_t written = 0;
        struct inode *inode = mapping->host;
@@ -1412,7 +1413,7 @@ static ssize_t fuse_cache_write_iter(struct kiocb *iocb, struct iov_iter *from)
                        return err;
 
                if (fc->handle_killpriv_v2 &&
-                   setattr_should_drop_suidgid(&nop_mnt_idmap,
+                   setattr_should_drop_suidgid(idmap,
                                                file_inode(file))) {
                        goto writethrough;
                }