Add more documentation for FUSE_CAP_EXPORT_SUPPORT (#917)

Add more documentation for FUSE_CAP_EXPORT_SUPPORT

Also remove the flag from passthrough_ll.c and passthrough_hp.cc
as these implementations do _not_ handle that flag. They just
cast fuse_ino_t to an inode and cause a heap buffer overflow
for unknown objects (simplest reproducer are the examples
in "man 2 open_by_handle_at", but to unmount/mount the file
system after name_to_handle_at and before open_by_handle_at).

Fixes https://github.com/libfuse/libfuse/issues/838

---------

Co-authored-by: Nikolaus Rath <Nikolaus@rath.org>
This commit is contained in:
Bernd Schubert
2024-04-02 23:52:18 +02:00
committed by GitHub
parent 3e283a1bcb
commit e2df577a7c
4 changed files with 16 additions and 6 deletions
+11
View File
@@ -21,6 +21,17 @@ be requested on any inode, including non-directories, while the latter
is only requested for directories. Otherwise these special lookups
should behave identically to ordinary lookups.
Furthermore, setting FUSE_CAP_EXPORT_SUPPORT requires the file system
to handle node-ids (fuse_ino_t) that the file system may does not know
about - e.g. a fuse FORGET request might have been received or the node-id
was used in a previous instance of the file system daemon. The node-id might
not be valid at all when an invalid handle is passed to open_by_handle_at().
This implies that the filesystem *must not* reuse node-ids even if
generation numbers are set correctly. This is because generation numbers
are not provided by the kernel to e.g. the getattr() handler, so the
handler would be unable to tell if the provided node-id refers to the
"known" current one, or a previous one that has been forgotten and re-used.
2) high-level interface
Because the high-level interface is path based, it is not possible to
-3
View File
@@ -190,9 +190,6 @@ static int get_fs_fd(fuse_ino_t ino) {
static void sfs_init(void *userdata, fuse_conn_info *conn) {
(void)userdata;
if (conn->capable & FUSE_CAP_EXPORT_SUPPORT)
conn->want |= FUSE_CAP_EXPORT_SUPPORT;
if (fs.timeout && conn->capable & FUSE_CAP_WRITEBACK_CACHE)
conn->want |= FUSE_CAP_WRITEBACK_CACHE;
-3
View File
@@ -170,9 +170,6 @@ static void lo_init(void *userdata,
{
struct lo_data *lo = (struct lo_data*) userdata;
if(conn->capable & FUSE_CAP_EXPORT_SUPPORT)
conn->want |= FUSE_CAP_EXPORT_SUPPORT;
if (lo->writeback &&
conn->capable & FUSE_CAP_WRITEBACK_CACHE) {
if (lo->debug)
+5
View File
@@ -183,6 +183,11 @@ struct fuse_loop_config_v1 {
/**
* Indicates that the filesystem supports lookups of "." and "..".
*
* When this flag is set, the filesystem must be prepared to receive requests
* for invalid inodes (i.e., for which a FORGET request was received or
* which have been used in a previous instance of the filesystem daemon) and
* must not reuse node-ids (even when setting generation numbers).
*
* This feature is disabled by default.
*/
#define FUSE_CAP_EXPORT_SUPPORT (1 << 4)