]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fuse: limit FUSE_NOTIFY_RETRIEVE to uptodate folios
authorJann Horn <jannh@google.com>
Tue, 19 May 2026 14:40:34 +0000 (16:40 +0200)
committerChristian Brauner <brauner@kernel.org>
Fri, 22 May 2026 13:19:26 +0000 (15:19 +0200)
FUSE_NOTIFY_RETRIEVE must be limited to uptodate folios; !uptodate folios
can contain uninitialized data.
Since FUSE_NOTIFY_RETRIEVE is intended to only return data that is already
in the page cache and not wait for data from the FUSE daemon, treat
!uptodate folios as if they weren't present.

This only has security impact on systems that don't enable automatic
zero-initialization of all page allocations via
CONFIG_INIT_ON_ALLOC_DEFAULT_ON or init_on_alloc=1.

Cc: stable@kernel.org
Fixes: 2d45ba381a74 ("fuse: add retrieve request")
Signed-off-by: Jann Horn <jannh@google.com>
Link: https://patch.msgid.link/20260519-fuse-retrieve-uptodate-v1-1-a7a1912a37f9@google.com
Acked-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
fs/fuse/dev.c

index 5dda7080f4a909740cd3dbf804a5260e7493b512..08d364ed7d6c16e72d66c8f1f0a0c4235aaab825 100644 (file)
@@ -1912,6 +1912,10 @@ static int fuse_retrieve(struct fuse_mount *fm, struct inode *inode,
                folio = filemap_get_folio(mapping, index);
                if (IS_ERR(folio))
                        break;
+               if (!folio_test_uptodate(folio)) {
+                       folio_put(folio);
+                       break;
+               }
 
                folio_offset = offset_in_folio(folio, pos);
                nr_bytes = min(folio_size(folio) - folio_offset, num);