| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| fuse-3.18.3.tar.gz.sig | 2026-09-08 | 146 Bytes | |
| fuse-3.18.3.tar.gz | 2026-09-08 | 2.6 MB | |
| fuse-3.18.3 source code.tar.gz | 2026-09-08 | 1.0 MB | |
| fuse-3.18.3 source code.zip | 2026-09-08 | 1.1 MB | |
| README.md | 2026-09-08 | 7.3 kB | |
| Totals: 5 Items | 4.7 MB | 3 | |
Dear all,
I am pleased to announce the release of libfuse 3.18.3.
The source code is available for download at https://github.com/libfuse/libfuse/releases.
Please report any issues on this mailing list or the GitHub issue tracker at https://github.com/libfuse/libfuse/issues.
From ChangeLog.rst:
Security Fixes
-
fuse_session_custom_io()is disabled unless libfuse is built with-Denable-custom-io=true, and returns-ENOTSUPotherwise. Thehello_ll_udsexample is built only with that option, and enabling it warns at configure time. Reason is a custom io peer might not be a kernel and can forge requests that libfuse parses without bounds checks, crashing or corrupting the filesystem process. Seedoc/README.custom-io. -
fusermount3: resolve the mountpoint once, through an
O_PATH|O_NOFOLLOWdescriptor. A symlink swapped in between the type check and the second lookup could redirect the mount. - fusermount3: run the auto-unmount probe as the calling user. It opened the caller-supplied mountpoint with elevated privileges before, so a symlink could get an attacker-chosen path opened as root.
- mount_util: terminate the
/bin/mountand/bin/umountargument vectors with--.fsnamereaches them straight from-ofsname=in setuid-root fusermount3, and the child raises the real uid to 0 beforeexecle(), so an unprivileged caller controlled a positional operand of a mount(8) that was not in restricted mode. - mount_util: skip the mtab update entirely for option-like mount arguments.
BusyBox mount(8) does not honour
--. - fusermount3: unmount through
unmount_fuse()when passing the device descriptor to the caller fails, so that path drops privileges and runs thefusermount3 -uchecks instead of callingumount2()as root on a caller-supplied path. - fusermount3 and lib: pass
UMOUNT_NOFOLLOWon the kernel and non-setuid unmount paths. - fusermount3: check the
fstat()return value when validating the communication file descriptor. - fusermount3: fix an out-of-bounds read at index -1 in
get_mnt_opts()when the option string is empty, which a read-only mount with no further options reaches. - util: avoid a pointer underflow when trimming
fuse.conflines. - fusermount3: reject a negative
mount_maxother than the documented -1. A typo such as -2 made the limit comparison always true and blocked every non-root mount. - lib: relay the KILLPRIV_V2 kill-suidgid flags to the filesystem in the new
fuse_file_info::kill_suidgid. Onlysetattrsaw them before, so a filesystem that had taken over clearing suid/sgid never learned of it onO_TRUNCopen and on write, and the bits survived.
Note: fuse_file_info::kill_suidgid is new in 3.18.3 and FUSE_VERSION
carries no patch level. A filesystem built against these headers but running
against an older 3.18 library finds the field permanently zero, so require
3.18.3 at run time as well.
Important Fixes
- Fixed a hang on
statxin builds withoutHAVE_STATX:_do_statx()never replied, so the kernel waited forever. - io-uring: the CQE dispatch validated the opcode against
fuse_ll_ops[]but called throughfuse_ll_ops2[], so an opcode with no handler there was called as a null function pointer. - io-uring: fixed the notify-retrieve reply buffer handling. The
fuse_notify_retrieve_inheader sits at the start of the payload buffer, not in the ring header. - io-uring: fixed the
req_header_szcalculation, which sized the header buffer from the wrong struct. - io-uring: create the rings with
IORING_SETUP_SUBMIT_ALL, so one failing commit SQE no longer leaves the rest of the batch unsubmitted. - io-uring:
fuse_reply_none()commits the ring entry. A FORGET answered that way leaked the entry and left the kernel-side request outstanding. - fusermount3: treat
ECONNABORTEDlikeENOTCONNwhen deciding whether to auto-unmount, so a daemon that dies with io-uring registered no longer leaves the mount behind. receive_fd(): checkCMSG_FIRSTHDR()for NULL before dereferencing it.fuse_session_loop_mt_312()no longer destroysse->mt_lockbeforefuse_session_destroy()destroys it again, which was undefined behaviour on every multi-threaded shutdown.fuse_loop_cfg_create()returning NULL is checked before the config is dereferenced infuse_session_loop_mt_312()andfuse_session_loop_mt_31().- iconv: the error check after opening the
fromfsdescriptor testedtofs, so a failediconv_open()was ignored and left an invalid descriptor behind. - mount.fuse: a failure to clear
FD_CLOEXECwent undetected, because the result was compared against 1 rather than -1. grow_pipe_to_max()opens/proc/sys/fs/pipe-max-sizewithO_CLOEXEC; a concurrent fork+exec leaked the descriptor into the child.- Fixed a build failure for
FUSE_USE_VERSION312 and newer without symbol versioning, wherefuse_loop_mt()expanded to an undeclaredfuse_loop_mt_312(). - Fixed a Clang 21 build failure in
ST_MTIM_NSEC. - Fixed leaks: the pipe when its size cannot be grown, the mountpoint in
fuse_session_mount()andfuse_session_destroy(), the pipe descriptors whenfork()orsetsid()fail infuse_daemonize(), the context whenpthread_setspecific()fails,print_module_help(), and afuse_pollhandleinfuse_lib_poll(). - Examples:
update_fs()useslocaltime_r().localtime()returns a shared staticstruct tm, so it raced with the session threads andstrftime()could format a half-overwritten time. - Examples:
cuse_clientcaps the transfer size at 16 MiB.do_rw()passed the SIZE argument straight tocalloc(). - Examples: memfs_ll locking, refcounting and bounds fixes, including a use-after-free on rename overwrite and on a concurrent forget.
- Examples: passthrough_hp lock-order and lifetime fixes. The directory
stream is protected by a per-handle lock,
fs.mutexis taken beforeInode::mand whenlink()raises nlookup, and no inode lock is held across a syscall or a reply.
Documentation
- The fuse-devel mailing list moved to lists.linux.dev.
- Man page and README corrections.
The following people have contributed code to this release:
Abhinav Agarwal abhinavagarwal1996@gmail.com Alexander Mikhalitsyn aleksandr.mikhalitsyn@futurfusion.io Ashish Ahuja shivashish.ahuja@gmail.com Benjamin Peterson benjamin@python.org Bernd Schubert bernd@bsbernd.com Darrick J. Wong djwong@kernel.org Jan Engelhardt jengelh@inai.de Jingbo Xu jefflexu@linux.alibaba.com Keerthana KT keerthana@labs.digiscrypt.com Mikhail Novosyolov m.novosyolov@rosa.ru Miklos Szeredi mszeredi@redhat.com Robert Doebbelin robert@quobyte.com nikola-sh nikola-sh@narod.ru wangrzneu wangrzneu@gmail.com wilkis marvin+github@alruno.eu
(a full list of credits containing all known contributors is included in
the AUTHORS file).
Best, -Bernd