From 7a8ee2d07d7e7bbb74e8ea096397aaa452c70d94 Mon Sep 17 00:00:00 2001 From: "Laszlo Boszormenyi (GCS)" Date: Mon, 19 May 2025 20:39:08 +0200 Subject: [PATCH] Import fuse3_3.17.2-2.debian.tar.xz [dgit import tarball fuse3 3.17.2-2 fuse3_3.17.2-2.debian.tar.xz] --- NEWS | 9 + changelog | 346 +++++++++++ clean | 2 + control | 95 +++ copyright | 87 +++ examples/Makefile | 17 + fuse3-udeb.install | 2 + fuse3.install | 3 + fuse3.links | 4 + fuse3.manpages | 2 + fuse3.postinst | 52 ++ fuse3.postrm | 28 + fuse3.preinst | 16 + libfuse3-4-udeb.install | 1 + libfuse3-4.docs | 3 + libfuse3-4.install | 1 + libfuse3-4.symbols | 11 + libfuse3-dev.examples | 4 + libfuse3-dev.install | 4 + local/fuse.conf | 8 + local/fuse.hook | 24 + local/fuse.kmod | 1 + not-installed | 2 + ...Add-container_of-and-ROUND_UP-macros.patch | 61 ++ patches/Fix-fuse_apply_conn_info_opts.patch | 559 ++++++++++++++++++ patches/Fix_meson_function_tests.patch | 117 ++++ ...n-want-want_ext_conversion_non_fatal.patch | 92 +++ ...ke-special_funcs-check-more-reliable.patch | 37 ++ patches/series | 5 + rules | 69 +++ source/format | 1 + upstream/metadata | 6 + upstream/signing-key.asc | 85 +++ watch | 6 + 34 files changed, 1760 insertions(+) create mode 100644 NEWS create mode 100644 changelog create mode 100644 clean create mode 100644 control create mode 100644 copyright create mode 100644 examples/Makefile create mode 100644 fuse3-udeb.install create mode 100644 fuse3.install create mode 100644 fuse3.links create mode 100644 fuse3.manpages create mode 100644 fuse3.postinst create mode 100644 fuse3.postrm create mode 100644 fuse3.preinst create mode 100644 libfuse3-4-udeb.install create mode 100644 libfuse3-4.docs create mode 100644 libfuse3-4.install create mode 100644 libfuse3-4.symbols create mode 100644 libfuse3-dev.examples create mode 100644 libfuse3-dev.install create mode 100644 local/fuse.conf create mode 100644 local/fuse.hook create mode 100644 local/fuse.kmod create mode 100644 not-installed create mode 100644 patches/Add-container_of-and-ROUND_UP-macros.patch create mode 100644 patches/Fix-fuse_apply_conn_info_opts.patch create mode 100644 patches/Fix_meson_function_tests.patch create mode 100644 patches/Make_conn-want-want_ext_conversion_non_fatal.patch create mode 100644 patches/meson.build-make-special_funcs-check-more-reliable.patch create mode 100644 patches/series create mode 100755 rules create mode 100644 source/format create mode 100644 upstream/metadata create mode 100644 upstream/signing-key.asc create mode 100644 watch diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..196ba52 --- /dev/null +++ b/NEWS @@ -0,0 +1,9 @@ +fuse3 (3.14.0-6) unstable; urgency=medium + + The fuse3 package honours a dpkg-statoverride of /bin/fusermount3 installed + by a system administrator (e.g. to remove the setuid binary installed by + default). The path to this file according to the package manager is + transitioned to /usr/bin/fusermount3. If you installed a statoverride, + please move it to the new path and verify the permissions. + + -- Helmut Grohne Wed, 12 Jun 2024 13:41:27 +0200 diff --git a/changelog b/changelog new file mode 100644 index 0000000..0430c95 --- /dev/null +++ b/changelog @@ -0,0 +1,346 @@ +fuse3 (3.17.2-2) unstable; urgency=medium + + [ Laszlo Boszormenyi (GCS) ] + * Backport upstream fixes (closes: #1101305): + - make conn->want/want_ext conversion non fatal, + - add container_of and ROUND_UP macros, + - conn->want conversion: fix fuse_apply_conn_info_opts() . + * Update symbols file (closes: #1105099). + + [ Helmut Grohne ] + * Update -latomic architecture list (closes: #1105150). + + -- Laszlo Boszormenyi (GCS) Mon, 19 May 2025 20:39:08 +0200 + +fuse3 (3.17.2-1) unstable; urgency=medium + + * New upstream release: + - check if pthread_setname_np() exists before use it, + - fix example/memfs_ll rename deadlock error, + - signal handlers: Store fuse_session unconditionally. + * Backport upstream fixes: + - fix meson function tests, + - meson.build: make special_funcs check more reliable. + + -- Laszlo Boszormenyi (GCS) Sun, 27 Apr 2025 08:10:01 +0200 + +fuse3 (3.17.1+git250416-1) unstable; urgency=medium + + * New git snapshot release: + - fixes "both 'want' and 'want_ext' are set" errors (closes: #1101305). + * Refer online versions of Free Software Foundation licences. + + -- Laszlo Boszormenyi (GCS) Wed, 16 Apr 2025 18:35:53 +0200 + +fuse3 (3.17.1-1) unstable; urgency=medium + + * New major upstream release: + - fixes want flag conversion (closes: #1101129). + * Update Standards-Version to 4.7.2 . + + -- Laszlo Boszormenyi (GCS) Mon, 24 Mar 2025 14:12:08 +0100 + +fuse3 (3.17.1~rc1-3) unstable; urgency=medium + + * Backport upstream fix for mount: fix closing stdout/err and error logs. + + -- Laszlo Boszormenyi (GCS) Thu, 13 Mar 2025 15:30:01 +0100 + +fuse3 (3.17.1~rc1-2) experimental; urgency=medium + + * Link examples with atomic on armel, m68k and powerpc architectures. + + -- Laszlo Boszormenyi (GCS) Sat, 22 Feb 2025 07:44:45 +0100 + +fuse3 (3.17.1~rc1-1) experimental; urgency=medium + + * New major upstream release candidate version. + + -- Laszlo Boszormenyi (GCS) Wed, 19 Feb 2025 17:29:04 +0100 + +fuse3 (3.17.1~rc0-1) experimental; urgency=medium + + * New major upstream release candidate version (closes: #1095239): + - fixes ABI breaks (closes: #1031802), + - fixes max threads value warning (closes: #1037410). + * Library transition from libfuse3-3 to libfuse3-4. + + -- Laszlo Boszormenyi (GCS) Fri, 14 Feb 2025 22:49:04 +0100 + +fuse3 (3.14.0-10) unstable; urgency=medium + + [ Helmut Grohne ] + * Upgrade Breaks for fuse to Conflicts to prevent accidental file loss + (DEP17, closes: #1082357). + + -- Laszlo Boszormenyi (GCS) Sat, 21 Sep 2024 14:06:04 +0200 + +fuse3 (3.14.0-9) unstable; urgency=medium + + * Fix FTBFS due to the fuse transitional package. + + -- Laszlo Boszormenyi (GCS) Sun, 15 Sep 2024 08:00:33 +0200 + +fuse3 (3.14.0-8) unstable; urgency=medium + + [ Jeremy Bícha ] + * Provide fuse transitional package for upgrade (closes: #918984, #927291, + #1074767, #1081537). + + -- Laszlo Boszormenyi (GCS) Fri, 13 Sep 2024 19:31:58 +0200 + +fuse3 (3.14.0-7) unstable; urgency=medium + + [ Guillem Jover ] + * Use canonical pathnames in initramfs hook (closes: #1079573). + + -- Laszlo Boszormenyi (GCS) Sun, 25 Aug 2024 13:39:34 +0200 + +fuse3 (3.14.0-6) unstable; urgency=medium + + [ Helmut Grohne ] + * Move aliased files to /usr (DEP17) (closes: #1073058). + + -- Laszlo Boszormenyi (GCS) Sun, 07 Jul 2024 07:17:03 +0200 + +fuse3 (3.14.0-5) unstable; urgency=medium + + * Fix 99-fuse3.rules path (closes: #1060067). + * Switch udev build dependency to systemd-dev (closes: #1060606). + + -- Laszlo Boszormenyi (GCS) Fri, 12 Jan 2024 16:46:21 +0100 + +fuse3 (3.14.0-4) unstable; urgency=medium + + * Backport upstream fixes: + - fix max_threads command line parameter propagation, + - fix memory leak in high level API. + + -- Laszlo Boszormenyi (GCS) Tue, 18 Apr 2023 23:07:15 +0200 + +fuse3 (3.14.0-3) unstable; urgency=medium + + [ Helge Deller ] + * Add the big-endian hppa platform to the disabled self-testing list + (closes: #1032187). + + [ Laszlo Boszormenyi (GCS) ] + * Update fuse header name in examples. + * Fix Makefile for examples (closes: #1031544). + + -- Laszlo Boszormenyi (GCS) Fri, 17 Mar 2023 20:51:05 +0100 + +fuse3 (3.14.0-2) unstable; urgency=medium + + * Revert upgrade of fuse_kernel.h for not being upstreamed yet + (closes: #1031524). + + -- Laszlo Boszormenyi (GCS) Sat, 18 Feb 2023 07:22:30 +0100 + +fuse3 (3.14.0-1) unstable; urgency=medium + + * New upstream release: + - fix header installation issue (closes: #1031455). + + -- Laszlo Boszormenyi (GCS) Fri, 17 Feb 2023 19:50:40 +0100 + +fuse3 (3.13.1-1) unstable; urgency=medium + + * New upstream release. + + -- Laszlo Boszormenyi (GCS) Fri, 10 Feb 2023 22:04:50 +0100 + +fuse3 (3.13.0-2) unstable; urgency=medium + + * Can't run self-testing on big-endian machines. + + -- Laszlo Boszormenyi (GCS) Sun, 22 Jan 2023 08:17:08 +0100 + +fuse3 (3.13.0-1) unstable; urgency=medium + + * New upstream release. + + -- Laszlo Boszormenyi (GCS) Tue, 17 Jan 2023 19:11:25 +0100 + +fuse3 (3.12.0-1) unstable; urgency=medium + + * New upstream release. + * Update library symbols for this release. + * Update watch file. + * Update Lintian overrides. + * Update Standards-Version to 4.6.1 . + + -- Laszlo Boszormenyi (GCS) Sat, 22 Oct 2022 21:28:52 +0200 + +fuse3 (3.11.0-1) unstable; urgency=medium + + * New upstream release. + * Update Standards-Version to 4.6.0.1 . + + -- Laszlo Boszormenyi (GCS) Sat, 07 May 2022 16:30:30 +0200 + +fuse3 (3.10.5-1) unstable; urgency=medium + + * New upstream release. + + -- Laszlo Boszormenyi (GCS) Thu, 16 Sep 2021 17:41:27 +0200 + +fuse3 (3.10.4-1) unstable; urgency=medium + + * New upstream release. + + -- Laszlo Boszormenyi (GCS) Mon, 23 Aug 2021 22:05:34 +0200 + +fuse3 (3.10.3-2) unstable; urgency=medium + + * Do not try to alter cuse device permissions (closes: #947229, #989977). + + -- Laszlo Boszormenyi (GCS) Sun, 20 Jun 2021 15:45:33 +0200 + +fuse3 (3.10.3-1) unstable; urgency=medium + + * New upstream release: + - fix returning d_ino and d_type by readdir(3) in non-plus mode, + - remove unused fuse_worker bufsize, + - fix typos. + + -- Laszlo Boszormenyi (GCS) Wed, 21 Apr 2021 14:34:39 +0200 + +fuse3 (3.10.2-2) unstable; urgency=medium + + * Mark libfuse3-dev as Multi-Arch same. + + [ Matthias Klose ] + * Allow one to build without udeb package (closes: #983438). + + -- Laszlo Boszormenyi (GCS) Wed, 24 Feb 2021 23:28:30 +0100 + +fuse3 (3.10.2-1) unstable; urgency=medium + + * New upstream release. + + -- Laszlo Boszormenyi (GCS) Mon, 08 Feb 2021 21:21:32 +0100 + +fuse3 (3.10.1-3) unstable; urgency=medium + + * Update debhelper level to 13 . + + [ Stephen Kitt ] + * Ignore "-o nonempty" instead of treating it as an error; the default + behaviour in fuse3 is equivalent to "-o nonempty". This allows + software expecting fuse2 semantics to work with fusermount3 + (closes: #939767). + + -- Laszlo Boszormenyi (GCS) Fri, 29 Jan 2021 16:59:06 +0100 + +fuse3 (3.10.1-2) unstable; urgency=medium + + * Add upstream metadata. + * Update watch file. + * Update packaging bits. + * Update Standards-Version to 4.5.1 . + + [ Laurent Bigonville ] + * Fix FTBFS on kFreeBSD (closes: #980213). + + -- Laszlo Boszormenyi (GCS) Sat, 16 Jan 2021 10:34:25 +0100 + +fuse3 (3.10.1-1) unstable; urgency=medium + + * New upstream release. + * Backport upstream fix: + - add exfat to whitelist. + + -- Laszlo Boszormenyi (GCS) Fri, 01 Jan 2021 15:32:48 +0100 + +fuse3 (3.10.0-1) unstable; urgency=medium + + * New upstream release. + + -- Laszlo Boszormenyi (GCS) Sun, 11 Oct 2020 23:01:33 +0200 + +fuse3 (3.9.3-1) unstable; urgency=medium + + * New upstream release. + + -- Laszlo Boszormenyi (GCS) Thu, 20 Aug 2020 15:16:47 +0200 + +fuse3 (3.9.2-1) unstable; urgency=medium + + * New upstream release. + * Use udev for Linux builds, specify udevrulesdir otherwise + (closes: #956579). + + [ Laurent Bigonville ] + * Run tests form the correct directory and make them non fatal + (closes: #956592). + + -- Laszlo Boszormenyi (GCS) Sat, 13 Jun 2020 14:54:36 +0200 + +fuse3 (3.9.0-2) unstable; urgency=medium + + * Don't explicitly remove fuse.conf on purge (closes: #953223). + + -- Laszlo Boszormenyi (GCS) Sat, 07 Mar 2020 11:10:15 +0000 + +fuse3 (3.9.0-1) unstable; urgency=medium + + * New upstream release. + * Update Standards-Version to 4.5.0 . + + [ Hideki Yamane ] + * Add version for Provides: fuse (closes: #943896). + + -- Laszlo Boszormenyi (GCS) Thu, 13 Feb 2020 16:06:09 +0000 + +fuse3 (3.7.0-1) unstable; urgency=medium + + * New upstream release. + * Update library symbols for this release. + + -- Laszlo Boszormenyi (GCS) Sat, 28 Sep 2019 21:28:17 +0000 + +fuse3 (3.6.2-1) unstable; urgency=medium + + * New upstream release. + * Drop outdated udevadm commands from postinst (closes: #934293). + * Remove dh_makeshlibs override. + * Update Standards-Version to 4.4.0 . + + -- Laszlo Boszormenyi (GCS) Sun, 01 Sep 2019 06:15:20 +0000 + +fuse3 (3.4.1-1) unstable; urgency=medium + + * New upstream release. + * Update library symbols for this release. + * Update Standards-Version to 4.3.0 . + + [ Dmitry Smirnov ] + * Make "fuse3" to replace "fuse", instead of conflict (closes: #912528). + + -- Laszlo Boszormenyi (GCS) Tue, 25 Dec 2018 16:57:44 +0000 + +fuse3 (3.2.6-1) unstable; urgency=medium + + * New upstream release: + - fix CVE-2018-10906, restriction bypass of the allow_other option when + SELinux is active (closes: #911343). + * Honor nocheck in DEB_BUILD_OPTIONS (closes: #910029). + * Don't force xz compression for source and binaries (closes: #910030). + * Update copyright file. + + -- Laszlo Boszormenyi (GCS) Thu, 18 Oct 2018 21:36:00 +0000 + +fuse3 (3.2.4-1) unstable; urgency=medium + + * New major upstream release (closes: #904216). + * Drop own udev rules. + * Update watch file. + * Update copyright file. + * Update debhelper level to 11: + - remove dh-autoreconf build dependency, + - don't specify parallel to debhelper. + * Update Standards-Version to 4.1.5: + - remove fuse-dbg package and use the auto-generated one. + + -- Laszlo Boszormenyi (GCS) Sat, 21 Jul 2018 14:11:44 +0000 diff --git a/clean b/clean new file mode 100644 index 0000000..c612857 --- /dev/null +++ b/clean @@ -0,0 +1,2 @@ +config.rpath +util/mount_util.c diff --git a/control b/control new file mode 100644 index 0000000..12b3202 --- /dev/null +++ b/control @@ -0,0 +1,95 @@ +Source: fuse3 +Section: utils +Priority: optional +Maintainer: Laszlo Boszormenyi (GCS) +Build-Depends: + debhelper-compat (= 13), + pkgconf, + meson, + systemd-dev, + python3 , + python3-pytest +Standards-Version: 4.7.2 +Homepage: https://github.com/libfuse/libfuse/wiki +Rules-Requires-Root: binary-targets + +Package: fuse3 +Section: utils +Architecture: linux-any +Depends: + ${misc:Depends}, + ${shlibs:Depends}, + libfuse3-4 (= ${binary:Version}), + adduser, + mount (>= 2.19.1), + sed (>= 4) +Provides: fuse (= ${source:Version}) +Conflicts: fuse (<< ${source:Version}) +Description: Filesystem in Userspace (3.x version) + Filesystem in Userspace (FUSE) is a simple interface for userspace programs to + export a virtual filesystem to the Linux kernel. It also aims to provide a + secure method for non privileged users to create and mount their own filesystem + implementations. + +Package: libfuse3-4 +Section: libs +Architecture: linux-any kfreebsd-any +Multi-Arch: same +Pre-Depends: ${misc:Pre-Depends} +Depends: + ${misc:Depends}, + ${shlibs:Depends}, +Suggests: fuse3 +Description: Filesystem in Userspace (library) (3.x version) + Filesystem in Userspace (FUSE) is a simple interface for userspace programs to + export a virtual filesystem to the Linux kernel. It also aims to provide a + secure method for non privileged users to create and mount their own filesystem + implementations. + . + This package contains the shared library. + +Package: libfuse3-dev +Section: libdevel +Architecture: linux-any kfreebsd-any +Multi-Arch: same +Depends: + ${misc:Depends}, + libfuse3-4 (= ${binary:Version}), + libselinux-dev [linux-any], +Suggests: fuse +Description: Filesystem in Userspace (development) (3.x version) + Filesystem in Userspace (FUSE) is a simple interface for userspace programs to + export a virtual filesystem to the Linux kernel. It also aims to provide a + secure method for non privileged users to create and mount their own filesystem + implementations. + . + This package contains the development files. + +Package: fuse3-udeb +Package-Type: udeb +Architecture: linux-any +Section: debian-installer +Depends: + ${misc:Depends}, + ${shlibs:Depends}, + libfuse3-4-udeb (= ${binary:Version}), +Description: Filesystem in Userspace (3.x version) + +Package: libfuse3-4-udeb +Package-Type: udeb +Build-Profiles: +Architecture: linux-any kfreebsd-any +Section: debian-installer +Depends: + ${misc:Depends}, + ${shlibs:Depends}, +Description: Filesystem in Userspace (library) (3.x version) + +Package: fuse +Architecture: all +Section: oldlibs +Depends: + ${misc:Depends}, + fuse3, +Description: Filesystem in Userspace (transitional package) + This is a transitional package. It can safely be removed. diff --git a/copyright b/copyright new file mode 100644 index 0000000..8b62c67 --- /dev/null +++ b/copyright @@ -0,0 +1,87 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: fuse3 +Upstream-Contact: fuse-devel@lists.sourceforge.net +Source: https://sourceforge.net/projects/fuse/files/ + +Files: * +Copyright: 2016- Nikolaus Rath , + 2001-2013 Miklos Szeredi +License: GPL-2 + +Files: lib/* +Copyright: 2001-2013 Miklos Szeredi +License: LGPL-2.1 + +Files: example/passthrough.c example/passthrough_fh.c +License: GPL-2 +Copyright: Copyright (C) 2001-2007 Miklos Szeredi , + Copyright (C) 2011 Sebastian Pipping + +Files: example/cuse.c + example/cuse_client.c + example/ioctl.c + example/ioctl.h + example/ioctl_client.c + example/poll.c + example/poll_client.c + include/cuse_lowlevel.h + lib/cuse_lowlevel.c +License: GPL-2 +Copyright: Copyright (C) 2008-2009 SUSE Linux Products GmbH, + Copyright (C) 2008-2009 Tejun Heo + +Files: debian/* +Copyright: 2014- Laszlo Boszormenyi (GCS) , + 2011-2014 Daniel Baumann +License: GPL-2+ + +License: GPL-2 + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License 2 + along with this program. If not, see . + . + On Debian systems, the complete text of the GNU General + Public License can be found in `/usr/share/common-licenses/GPL-2'. + +License: GPL-2+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License 2 + along with this program. If not, see . + . + On Debian systems, the complete text of the GNU General + Public License can be found in `/usr/share/common-licenses/GPL-2'. + +License: LGPL-2.1 + This package is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + . + You should have received a copy of the GNU Lesser General Public + License 2.1 along with this program. + If not, see . + . + On Debian systems, the complete text of the GNU Lesser General + Public License can be found in `/usr/share/common-licenses/LGPL-2.1'. diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 0000000..4ac1685 --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,17 @@ +CFLAGS := -Wall $(shell pkg-config fuse3 --cflags) +LDFLAGS := $(shell pkg-config fuse3 --libs) + +targets = cuse cuse_client hello hello_ll \ + invalidate_path ioctl ioctl_client \ + notify_inval_entry notify_inval_inode notify_store_retrieve \ + null passthrough passthrough_fh passthrough_ll \ + poll poll_client printcap + +%: %.c + $(CC) $(CFLAGS) $< -o $@ $(LDFLAGS) + +all: $(targets) + +clean: + rm -f *.o + rm -f $(targets) diff --git a/fuse3-udeb.install b/fuse3-udeb.install new file mode 100644 index 0000000..e611e5c --- /dev/null +++ b/fuse3-udeb.install @@ -0,0 +1,2 @@ +usr/bin/fusermount3 +usr/sbin/mount.fuse3 diff --git a/fuse3.install b/fuse3.install new file mode 100644 index 0000000..277e341 --- /dev/null +++ b/fuse3.install @@ -0,0 +1,3 @@ +usr/bin/fusermount3 +usr/sbin/mount.fuse3 +etc/fuse.conf diff --git a/fuse3.links b/fuse3.links new file mode 100644 index 0000000..d7b2758 --- /dev/null +++ b/fuse3.links @@ -0,0 +1,4 @@ +/usr/bin/fusermount3 /usr/bin/fusermount +/usr/sbin/mount.fuse3 /usr/sbin/mount.fuse +/usr/share/man/man1/fusermount3.1.gz /usr/share/man/man1/fusermount.1.gz +/usr/share/man/man8/mount.fuse3.8.gz /usr/share/man/man8/mount.fuse.8.gz diff --git a/fuse3.manpages b/fuse3.manpages new file mode 100644 index 0000000..b06a58e --- /dev/null +++ b/fuse3.manpages @@ -0,0 +1,2 @@ +usr/share/man/man1/fusermount3.1 +usr/share/man/man8/mount.fuse3.8 diff --git a/fuse3.postinst b/fuse3.postinst new file mode 100644 index 0000000..4ac335c --- /dev/null +++ b/fuse3.postinst @@ -0,0 +1,52 @@ +#!/bin/sh + +set -e + +chrooted() { + if [ "$(stat -c %d/%i /)" = "$(stat -Lc %d/%i /proc/1/root 2>/dev/null)" ]; then + # the devicenumber/inode pair of / is the same as that of + # /sbin/init's root, so we're *not* in a chroot and hence + # return false. + return 1 + fi + return 0 +} + +# begin-remove-after: released:trixie +# protective diversion of files moved from / to /usr, to avoid file loss. +if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ]; then + for f in /bin/fusermount /sbin/mount.fuse; do + dpkg-divert --package #PACKAGE# --no-rename --divert "$f.usr-is-merged" --remove "$f" + done +fi +# end-remove-after + +case "${1}" in + configure) + if ! dpkg-statoverride --list /bin/fusermount3 > /dev/null 2>&1 && + ! dpkg-statoverride --list /usr/bin/fusermount3 > /dev/null 2>&1 + then + chmod 4755 /usr/bin/fusermount3 + fi + + modprobe fuse > /dev/null 2>&1 || true + + if [ -x "`which update-initramfs 2>/dev/null`" ] + then + update-initramfs -u + fi + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + + ;; + + *) + echo "postinst called with unknown argument \`${1}'" >&2 + exit 1 + ;; +esac + +#DEBHELPER# + +exit 0 diff --git a/fuse3.postrm b/fuse3.postrm new file mode 100644 index 0000000..c17995a --- /dev/null +++ b/fuse3.postrm @@ -0,0 +1,28 @@ +#!/bin/sh + +set -e + +case "${1}" in + remove) + if [ -x "`which update-initramfs 2>/dev/null`" ] + then + update-initramfs -u + fi + ;; + + purge) + ;; + + upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + + ;; + + *) + echo "postrm called with unknown argument \`${1}'" >&2 + exit 1 + ;; +esac + +#DEBHELPER# + +exit 0 diff --git a/fuse3.preinst b/fuse3.preinst new file mode 100644 index 0000000..d2341bb --- /dev/null +++ b/fuse3.preinst @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +# begin-remove-after: released:trixie +# protective diversion of files moved from / to /usr, to avoid file loss. +if [ "$1" = "upgrade" ] || [ "$1" = "install" ]; then + for f in /bin/fusermount /sbin/mount.fuse; do + dpkg-divert --package #PACKAGE# --no-rename --divert "$f.usr-is-merged" --add "$f" + done +fi +# end-remove-after + +#DEBHELPER# + +exit 0 diff --git a/libfuse3-4-udeb.install b/libfuse3-4-udeb.install new file mode 100644 index 0000000..3de3b10 --- /dev/null +++ b/libfuse3-4-udeb.install @@ -0,0 +1 @@ +usr/lib/*/*.so.* diff --git a/libfuse3-4.docs b/libfuse3-4.docs new file mode 100644 index 0000000..0135531 --- /dev/null +++ b/libfuse3-4.docs @@ -0,0 +1,3 @@ +README.md +doc/README.NFS +doc/*.txt diff --git a/libfuse3-4.install b/libfuse3-4.install new file mode 100644 index 0000000..3de3b10 --- /dev/null +++ b/libfuse3-4.install @@ -0,0 +1 @@ +usr/lib/*/*.so.* diff --git a/libfuse3-4.symbols b/libfuse3-4.symbols new file mode 100644 index 0000000..4494859 --- /dev/null +++ b/libfuse3-4.symbols @@ -0,0 +1,11 @@ +libfuse3.so.4 #PACKAGE# #MINVER# +* Build-Depends-Package: libfuse3-dev + (symver)FUSE_3.0 3.17.2 + (symver)FUSE_3.1 3.17.2 + (symver)FUSE_3.2 3.17.2 + (symver)FUSE_3.3 3.17.2 + (symver)FUSE_3.4 3.17.2 + (symver)FUSE_3.7 3.17.2 + (symver)FUSE_3.12 3.17.2 + (symver)FUSE_3.17 3.17.2 + (symver)FUSE_3.17.3 3.17.2 diff --git a/libfuse3-dev.examples b/libfuse3-dev.examples new file mode 100644 index 0000000..5dc4562 --- /dev/null +++ b/libfuse3-dev.examples @@ -0,0 +1,4 @@ +example/*.c +example/*.h + +debian/examples/* diff --git a/libfuse3-dev.install b/libfuse3-dev.install new file mode 100644 index 0000000..ef0894d --- /dev/null +++ b/libfuse3-dev.install @@ -0,0 +1,4 @@ +usr/include +usr/lib/*/pkgconfig +usr/lib/*/*.so +usr/lib/*/*.a diff --git a/local/fuse.conf b/local/fuse.conf new file mode 100644 index 0000000..ae194a0 --- /dev/null +++ b/local/fuse.conf @@ -0,0 +1,8 @@ +# /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE) + +# Set the maximum number of FUSE mounts allowed to non-root users. +# The default is 1000. +#mount_max = 1000 + +# Allow non-root users to specify the allow_other or allow_root mount options. +#user_allow_other diff --git a/local/fuse.hook b/local/fuse.hook new file mode 100644 index 0000000..e96afd9 --- /dev/null +++ b/local/fuse.hook @@ -0,0 +1,24 @@ +#!/bin/sh + +set -e + +PREREQ="" + +prereqs () { + echo "${PREREQ}" +} + +case "${1}" in + prereqs) + prereqs + exit 0 + ;; +esac + +. /usr/share/initramfs-tools/hook-functions + +copy_exec /usr/sbin/mount.fuse3 /usr/sbin + +manual_add_modules fuse + +exit 0 diff --git a/local/fuse.kmod b/local/fuse.kmod new file mode 100644 index 0000000..a517c48 --- /dev/null +++ b/local/fuse.kmod @@ -0,0 +1 @@ +fuse diff --git a/not-installed b/not-installed new file mode 100644 index 0000000..8d1cca1 --- /dev/null +++ b/not-installed @@ -0,0 +1,2 @@ +debian/tmp/etc/init.d/fuse3 +debian/tmp/usr/lib/udev/rules.d/99-fuse3.rules diff --git a/patches/Add-container_of-and-ROUND_UP-macros.patch b/patches/Add-container_of-and-ROUND_UP-macros.patch new file mode 100644 index 0000000..620ddec --- /dev/null +++ b/patches/Add-container_of-and-ROUND_UP-macros.patch @@ -0,0 +1,61 @@ +From d6a9799fc04e6ada5fd7fd7bbde14fb14981fc8b Mon Sep 17 00:00:00 2001 +From: Bernd Schubert +Date: Tue, 15 Apr 2025 22:03:09 +0200 +Subject: [PATCH] Add container_of and ROUND_UP macros + +Needed by follow up commits. container_of is actually +just moved/consolidated to util.h. + +Signed-off-by: Bernd Schubert +(cherry picked from commit c5a032b3410d7225ac0355355faa63565a209943) +--- + lib/fuse.c | 4 ---- + lib/fuse_lowlevel.c | 4 ---- + lib/util.h | 6 ++++++ + 3 files changed, 6 insertions(+), 8 deletions(-) + +diff --git a/lib/fuse.c b/lib/fuse.c +index c0d00edbc..4964de20f 100644 +--- a/lib/fuse.c ++++ b/lib/fuse.c +@@ -92,10 +92,6 @@ struct node_table { + size_t split; + }; + +-#define container_of(ptr, type, member) ({ \ +- const typeof( ((type *)0)->member ) *__mptr = (ptr); \ +- (type *)( (char *)__mptr - offsetof(type,member) );}) +- + #define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c +index 9ee88b160..cb046aae0 100644 +--- a/lib/fuse_lowlevel.c ++++ b/lib/fuse_lowlevel.c +@@ -44,10 +44,6 @@ + #define PARAM(inarg) (((char *)(inarg)) + sizeof(*(inarg))) + #define OFFSET_MAX 0x7fffffffffffffffLL + +-#define container_of(ptr, type, member) ({ \ +- const typeof( ((type *)0)->member ) *__mptr = (ptr); \ +- (type *)( (char *)__mptr - offsetof(type,member) );}) +- + struct fuse_pollhandle { + uint64_t kh; + struct fuse_session *se; +diff --git a/lib/util.h b/lib/util.h +index 508fafb12..ed03ad40e 100644 +--- a/lib/util.h ++++ b/lib/util.h +@@ -30,4 +30,10 @@ static inline uint64_t fuse_higher_32_bits(uint64_t nr) + #define FUSE_VAR_UNUSED(var) (__attribute__((unused)) var) + #endif + ++#define container_of(ptr, type, member) \ ++ ({ \ ++ unsigned long __mptr = (unsigned long)(ptr); \ ++ ((type *)(__mptr - offsetof(type, member))); \ ++ }) ++ + #endif diff --git a/patches/Fix-fuse_apply_conn_info_opts.patch b/patches/Fix-fuse_apply_conn_info_opts.patch new file mode 100644 index 0000000..58a9bfd --- /dev/null +++ b/patches/Fix-fuse_apply_conn_info_opts.patch @@ -0,0 +1,559 @@ +From 066e8111f0ff522e4682a31bd63b5a3532e8af86 Mon Sep 17 00:00:00 2001 +From: Bernd Schubert +Date: Sun, 18 May 2025 00:24:07 +0200 +Subject: [PATCH] conn->want conversion: Fix fuse_apply_conn_info_opts() + +fuse_apply_conn_info_opts() was applying to 'want_ext', +which would cause conflicts with 'want' if the application +applied its own flags to 'conn->want'. + +Solution is: + - to move fuse_{set,unset,get}_feature_flag and + convert_to_conn_want_ext() to fuse_lowlevel.c and + to define them as part of the public API, although + convert_to_conn_want_ext() should not be used - it is + currently needed to be a public function due as it needs + to be defined for the tests. + +Related to https://github.com/libfuse/libfuse/issues/1171 and +https://github.com/libfuse/libfuse/pull/1172. + +Closes: https://github.com/libfuse/libfuse/issues/1171 +Signed-off-by: Bernd Schubert +--- + include/fuse_common.h | 50 +++++++++++-------- + lib/fuse.c | 9 +--- + lib/fuse_i.h | 38 +++------------ + lib/fuse_lowlevel.c | 78 ++++++++++++++++++++++++++--- + lib/fuse_versionscript | 10 ++++ + lib/helper.c | 15 ++++-- + lib/util.c | 8 +++ + lib/util.h | 3 ++ + test/test_want_conversion.c | 97 ++++++++++++++++++++++--------------- + 9 files changed, 200 insertions(+), 108 deletions(-) + +diff --git a/include/fuse_common.h b/include/fuse_common.h +index 582505fa9..dd08f444a 100644 +--- a/include/fuse_common.h ++++ b/include/fuse_common.h +@@ -1096,28 +1096,40 @@ void fuse_loop_cfg_convert(struct fuse_loop_config *config, + struct fuse_loop_config_v1 *v1_conf); + #endif + ++/** ++ * Set a feature flag in the want_ext field of fuse_conn_info. ++ * ++ * @param conn connection information ++ * @param flag feature flag to be set ++ * @return true if the flag was set, false if the flag is not supported ++ */ ++bool fuse_set_feature_flag(struct fuse_conn_info *conn, uint64_t flag); + +-static inline bool fuse_set_feature_flag(struct fuse_conn_info *conn, +- uint64_t flag) +-{ +- if (conn->capable_ext & flag) { +- conn->want_ext |= flag; +- return true; +- } +- return false; +-} ++/** ++ * Unset a feature flag in the want_ext field of fuse_conn_info. ++ * ++ * @param conn connection information ++ * @param flag feature flag to be unset ++ */ ++void fuse_unset_feature_flag(struct fuse_conn_info *conn, uint64_t flag); ++ ++/** ++ * Get the value of a feature flag in the want_ext field of fuse_conn_info. ++ * ++ * @param conn connection information ++ * @param flag feature flag to be checked ++ * @return true if the flag is set, false otherwise ++ */ ++bool fuse_get_feature_flag(struct fuse_conn_info *conn, uint64_t flag); ++ ++/* ++ * DO NOT USE: Not part of public API, for internal test use only. ++ * The function signature or any use of it is not guaranteeed to ++ * remain stable. And neither are results of what this function does. ++ */ ++int fuse_convert_to_conn_want_ext(struct fuse_conn_info *conn); + +-static inline void fuse_unset_feature_flag(struct fuse_conn_info *conn, +- uint64_t flag) +-{ +- conn->want_ext &= ~flag; +-} + +-static inline bool fuse_get_feature_flag(struct fuse_conn_info *conn, +- uint64_t flag) +-{ +- return conn->capable_ext & flag ? true : false; +-} + + /* ----------------------------------------------------------- * + * Compatibility stuff * +diff --git a/lib/fuse.c b/lib/fuse.c +index 4964de20f..85914546e 100644 +--- a/lib/fuse.c ++++ b/lib/fuse.c +@@ -2611,15 +2611,8 @@ void fuse_fs_init(struct fuse_fs *fs, struct fuse_conn_info *conn, + fuse_unset_feature_flag(conn, FUSE_CAP_POSIX_LOCKS); + if (!fs->op.flock) + fuse_unset_feature_flag(conn, FUSE_CAP_FLOCK_LOCKS); +- if (fs->op.init) { +- uint64_t want_ext_default = conn->want_ext; +- uint32_t want_default = fuse_lower_32_bits(conn->want_ext); +- +- conn->want = want_default; ++ if (fs->op.init) + fs->user_data = fs->op.init(conn, cfg); +- +- convert_to_conn_want_ext(conn, want_ext_default, want_default); +- } + } + + static int fuse_init_intr_signal(int signum, int *installed); +diff --git a/lib/fuse_i.h b/lib/fuse_i.h +index bf5e2ca41..718fa142c 100644 +--- a/lib/fuse_i.h ++++ b/lib/fuse_i.h +@@ -85,6 +85,13 @@ struct fuse_session { + + /* true if reading requests from /dev/fuse are handled internally */ + bool buf_reallocable; ++ ++ /* ++ * conn->want and conn_want_ext options set by libfuse , needed ++ * to correctly convert want to want_ext ++ */ ++ uint32_t conn_want; ++ uint64_t conn_want_ext; + }; + + struct fuse_chan { +@@ -227,34 +234,3 @@ int fuse_loop_cfg_verify(struct fuse_loop_config *config); + /* room needed in buffer to accommodate header */ + #define FUSE_BUFFER_HEADER_SIZE 0x1000 + +-/** +- * Get the wanted capability flags, converting from old format if necessary +- */ +-static inline int convert_to_conn_want_ext(struct fuse_conn_info *conn, +- uint64_t want_ext_default, +- uint32_t want_default) +-{ +- /* +- * Convert want to want_ext if necessary. +- * For the high level interface this function might be called +- * twice, once from the high level interface and once from the +- * low level interface. Both, with different want_ext_default and +- * want_default values. In order to suppress a failure for the +- * second call, we check if the lower 32 bits of want_ext are +- * already set to the value of want. +- */ +- if (conn->want != want_default && +- fuse_lower_32_bits(conn->want_ext) != conn->want) { +- if (conn->want_ext != want_ext_default) +- return -EINVAL; +- +- /* high bits from want_ext, low bits from want */ +- conn->want_ext = fuse_higher_32_bits(conn->want_ext) | +- conn->want; +- } +- +- /* ensure there won't be a second conversion */ +- conn->want = fuse_lower_32_bits(conn->want_ext); +- +- return 0; +-} +diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c +index cb046aae0..1276a0fd9 100644 +--- a/lib/fuse_lowlevel.c ++++ b/lib/fuse_lowlevel.c +@@ -1994,6 +1994,77 @@ static bool want_flags_valid(uint64_t capable, uint64_t want) + return true; + } + ++/** ++ * Get the wanted capability flags, converting from old format if necessary ++ */ ++int fuse_convert_to_conn_want_ext(struct fuse_conn_info *conn) ++{ ++ struct fuse_session *se = container_of(conn, struct fuse_session, conn); ++ ++ /* ++ * Convert want to want_ext if necessary. ++ * For the high level interface this function might be called ++ * twice, once from the high level interface and once from the ++ * low level interface. Both, with different want_ext_default and ++ * want_default values. In order to suppress a failure for the ++ * second call, we check if the lower 32 bits of want_ext are ++ * already set to the value of want. ++ */ ++ if (conn->want != se->conn_want && ++ fuse_lower_32_bits(conn->want_ext) != conn->want) { ++ if (conn->want_ext != se->conn_want_ext) { ++ fuse_log(FUSE_LOG_ERR, ++ "%s: Both conn->want_ext and conn->want are set.\n" ++ "want=%x, want_ext=%lx, se->want=%lx se->want_ext=%lx\n", ++ __func__, conn->want, conn->want_ext, ++ se->conn_want, se->conn_want_ext); ++ return -EINVAL; ++ } ++ ++ /* high bits from want_ext, low bits from want */ ++ conn->want_ext = fuse_higher_32_bits(conn->want_ext) | ++ conn->want; ++ } ++ ++ /* ensure there won't be a second conversion */ ++ conn->want = fuse_lower_32_bits(conn->want_ext); ++ ++ return 0; ++} ++ ++bool fuse_set_feature_flag(struct fuse_conn_info *conn, ++ uint64_t flag) ++{ ++ struct fuse_session *se = container_of(conn, struct fuse_session, conn); ++ ++ if (conn->capable_ext & flag) { ++ conn->want_ext |= flag; ++ se->conn_want_ext |= flag; ++ conn->want |= flag; ++ se->conn_want |= flag; ++ return true; ++ } ++ return false; ++} ++ ++void fuse_unset_feature_flag(struct fuse_conn_info *conn, ++ uint64_t flag) ++{ ++ struct fuse_session *se = container_of(conn, struct fuse_session, conn); ++ ++ conn->want_ext &= ~flag; ++ se->conn_want_ext &= ~flag; ++ conn->want &= ~flag; ++ se->conn_want &= ~flag; ++} ++ ++bool fuse_get_feature_flag(struct fuse_conn_info *conn, ++ uint64_t flag) ++{ ++ return conn->capable_ext & flag ? true : false; ++} ++ ++ + /* Prevent bogus data races (bogus since "init" is called before + * multi-threading becomes relevant */ + static __attribute__((no_sanitize("thread"))) +@@ -2154,12 +2225,8 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) + + se->got_init = 1; + if (se->op.init) { +- uint64_t want_ext_default = se->conn.want_ext; +- uint32_t want_default = fuse_lower_32_bits(se->conn.want_ext); +- + // Apply the first 32 bits of capable_ext to capable + se->conn.capable = fuse_lower_32_bits(se->conn.capable_ext); +- se->conn.want = want_default; + + se->op.init(se->userdata, &se->conn); + +@@ -2168,8 +2235,7 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) + * se->conn.want_ext + * Userspace might still use conn.want - we need to convert it + */ +- convert_to_conn_want_ext(&se->conn, want_ext_default, +- want_default); ++ fuse_convert_to_conn_want_ext(&se->conn); + } + + if (!want_flags_valid(se->conn.capable_ext, se->conn.want_ext)) { +diff --git a/lib/fuse_versionscript b/lib/fuse_versionscript +index 6c5fc83eb..a2653fcdd 100644 +--- a/lib/fuse_versionscript ++++ b/lib/fuse_versionscript +@@ -202,6 +202,16 @@ FUSE_3.17 { + fuse_log_close_syslog; + } FUSE_3.12; + ++FUSE_3.17.3 { ++ global: ++ fuse_set_feature_flag; ++ fuse_unset_feature_flag; ++ fuse_get_feature_flag; ++ ++ # Not part of public API, for internal test use only ++ fuse_convert_to_conn_want_ext; ++} FUSE_3.17; ++ + # Local Variables: + # indent-tabs-mode: t + # End: +diff --git a/lib/helper.c b/lib/helper.c +index 59dd48881..aceff9fd5 100644 +--- a/lib/helper.c ++++ b/lib/helper.c +@@ -423,10 +423,17 @@ void fuse_apply_conn_info_opts(struct fuse_conn_info_opts *opts, + if(opts->set_max_readahead) + conn->max_readahead = opts->max_readahead; + +-#define LL_ENABLE(cond,cap) \ +- if (cond) conn->want_ext |= (cap) +-#define LL_DISABLE(cond,cap) \ +- if (cond) conn->want_ext &= ~(cap) ++#define LL_ENABLE(cond, cap) \ ++ do { \ ++ if (cond) \ ++ fuse_set_feature_flag(conn, cap); \ ++ } while (0) ++ ++#define LL_DISABLE(cond, cap) \ ++ do { \ ++ if (cond) \ ++ fuse_unset_feature_flag(conn, cap); \ ++ } while (0) + + LL_ENABLE(opts->splice_read, FUSE_CAP_SPLICE_READ); + LL_DISABLE(opts->no_splice_read, FUSE_CAP_SPLICE_READ); +diff --git a/lib/util.c b/lib/util.c +index a529d383c..956c3d2e9 100644 +--- a/lib/util.c ++++ b/lib/util.c +@@ -1,7 +1,14 @@ + #include + #include + ++#ifndef FUSE_USE_VERSION ++#define FUSE_USE_VERSION (FUSE_MAKE_VERSION(3, 18)) ++#endif ++ + #include "util.h" ++#include "fuse_log.h" ++#include "fuse_lowlevel.h" ++#include + + int libfuse_strtol(const char *str, long *res) + { +@@ -25,3 +32,4 @@ int libfuse_strtol(const char *str, long *res) + *res = val; + return 0; + } ++ +diff --git a/lib/util.h b/lib/util.h +index ed03ad40e..f24401a29 100644 +--- a/lib/util.h ++++ b/lib/util.h +@@ -2,12 +2,15 @@ + #define FUSE_UTIL_H_ + + #include ++#include + + #define ROUND_UP(val, round_to) (((val) + (round_to - 1)) & ~(round_to - 1)) + + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) + ++struct fuse_conn_info; ++ + int libfuse_strtol(const char *str, long *res); + + /** +diff --git a/test/test_want_conversion.c b/test/test_want_conversion.c +index bee23cc6e..db731edbf 100644 +--- a/test/test_want_conversion.c ++++ b/test/test_want_conversion.c +@@ -1,16 +1,22 @@ +-#include "util.h" + #define FUSE_USE_VERSION FUSE_MAKE_VERSION(3, 17) + ++#include "util.h" + #include "fuse_i.h" ++#include "fuse_lowlevel.h" + #include + #include + #include + #include ++#include + + static void print_conn_info(const char *prefix, struct fuse_conn_info *conn) + { +- printf("%s: want=0x%" PRIx32 " want_ext=0x%" PRIx64 "\n", prefix, +- conn->want, conn->want_ext); ++ struct fuse_session *se = container_of(conn, struct fuse_session, conn); ++ ++ printf("%s: want=0x%" PRIx32 " want_ext=0x%" PRIx64 ++ " want_default=0x%" PRIx32 " want_ext_default=0x%" PRIx64 "\n", ++ prefix, conn->want, conn->want_ext, se->conn_want, ++ se->conn_want_ext); + } + + static void application_init_old_style(struct fuse_conn_info *conn) +@@ -18,33 +24,31 @@ static void application_init_old_style(struct fuse_conn_info *conn) + /* Simulate application init the old style */ + conn->want |= FUSE_CAP_ASYNC_READ; + conn->want &= ~FUSE_CAP_SPLICE_READ; ++ ++ /* ++ * Also use new style API, as that might happen through ++ * fuse_apply_conn_info_opts() ++ */ ++ fuse_set_feature_flag(conn, FUSE_CAP_IOCTL_DIR); + } + + static void application_init_new_style(struct fuse_conn_info *conn) + { + /* Simulate application init the new style */ + fuse_set_feature_flag(conn, FUSE_CAP_ASYNC_READ); ++ fuse_set_feature_flag(conn, FUSE_CAP_IOCTL_DIR); + fuse_unset_feature_flag(conn, FUSE_CAP_SPLICE_READ); + } + + static void test_fuse_fs_init(struct fuse_conn_info *conn, bool new_style) + { +- uint64_t want_ext_default = conn->want_ext; +- uint32_t want_default = fuse_lower_32_bits(conn->want_ext); +- int rc; +- + /* High-level init */ + fuse_set_feature_flag(conn, FUSE_CAP_EXPORT_SUPPORT); + +- conn->want = want_default; +- + if (new_style) + application_init_new_style(conn); + else + application_init_old_style(conn); +- +- rc = convert_to_conn_want_ext(conn, want_ext_default, want_default); +- assert(rc == 0); + } + + static void test_do_init(struct fuse_conn_info *conn, bool new_style) +@@ -53,49 +57,71 @@ static void test_do_init(struct fuse_conn_info *conn, bool new_style) + conn->capable_ext = FUSE_CAP_SPLICE_READ | FUSE_CAP_SPLICE_WRITE | + FUSE_CAP_SPLICE_MOVE | FUSE_CAP_POSIX_LOCKS | + FUSE_CAP_FLOCK_LOCKS | FUSE_CAP_EXPORT_SUPPORT | +- FUSE_CAP_ASYNC_READ; ++ FUSE_CAP_ASYNC_READ | FUSE_CAP_IOCTL_DIR; + conn->capable = fuse_lower_32_bits(conn->capable_ext); +- conn->want_ext = conn->capable_ext; ++ ++ fuse_set_feature_flag(conn, FUSE_CAP_SPLICE_READ | ++ FUSE_CAP_SPLICE_WRITE | ++ FUSE_CAP_SPLICE_MOVE); + + print_conn_info("Initial state", conn); + +- uint64_t want_ext_default = conn->want_ext; +- uint32_t want_default = fuse_lower_32_bits(conn->want_ext); + int rc; + +- conn->want = want_default; +- conn->capable = fuse_lower_32_bits(conn->capable_ext); +- + test_fuse_fs_init(conn, new_style); ++ print_conn_info("After init", conn); + +- rc = convert_to_conn_want_ext(conn, want_ext_default, want_default); ++ rc = fuse_convert_to_conn_want_ext(conn); + assert(rc == 0); + + /* Verify all expected flags are set */ + assert(!(conn->want_ext & FUSE_CAP_SPLICE_READ)); + assert(conn->want_ext & FUSE_CAP_SPLICE_WRITE); + assert(conn->want_ext & FUSE_CAP_SPLICE_MOVE); +- assert(conn->want_ext & FUSE_CAP_POSIX_LOCKS); +- assert(conn->want_ext & FUSE_CAP_FLOCK_LOCKS); + assert(conn->want_ext & FUSE_CAP_EXPORT_SUPPORT); + assert(conn->want_ext & FUSE_CAP_ASYNC_READ); ++ assert(conn->want_ext & FUSE_CAP_IOCTL_DIR); ++ + /* Verify no other flags are set */ + assert(conn->want_ext == + (FUSE_CAP_SPLICE_WRITE | FUSE_CAP_SPLICE_MOVE | +- FUSE_CAP_POSIX_LOCKS | FUSE_CAP_FLOCK_LOCKS | +- FUSE_CAP_EXPORT_SUPPORT | FUSE_CAP_ASYNC_READ)); ++ FUSE_CAP_EXPORT_SUPPORT | FUSE_CAP_ASYNC_READ | ++ FUSE_CAP_IOCTL_DIR)); + + print_conn_info("After init", conn); + } + + static void test_want_conversion_basic(void) + { +- struct fuse_conn_info conn = { 0 }; ++ const struct fuse_lowlevel_ops ops = { 0 }; ++ struct fuse_args args = FUSE_ARGS_INIT(0, NULL); ++ struct fuse_session *se; ++ struct fuse_conn_info *conn; ++ ++ /* Add the program name to arg[0] */ ++ if (fuse_opt_add_arg(&args, "test_signals")) { ++ fprintf(stderr, "Failed to add argument\n"); ++ errx(1, "Failed to add argument"); ++ } ++ ++ ++ se = fuse_session_new(&args, &ops, sizeof(ops), NULL); ++ assert(se); ++ conn = &se->conn; ++ printf("\nTesting basic want conversion, old style:\n"); ++ test_do_init(conn, false); ++ fuse_session_destroy(se); ++ ++ se = fuse_session_new(&args, &ops, sizeof(ops), NULL); ++ assert(se); ++ conn = &se->conn; ++ printf("\nTesting basic want conversion, new style:\n"); ++ test_do_init(conn, true); ++ print_conn_info("After init", conn); ++ fuse_session_destroy(se); ++ ++ fuse_opt_free_args(&args); + +- printf("\nTesting basic want conversion:\n"); +- test_do_init(&conn, false); +- test_do_init(&conn, true); +- print_conn_info("After init", &conn); + } + + static void test_want_conversion_conflict(void) +@@ -115,16 +141,11 @@ static void test_want_conversion_conflict(void) + conn.want = fuse_lower_32_bits(conn.want_ext); + print_conn_info("Test conflict initial", &conn); + +- /* Initialize default values like in basic test */ +- uint64_t want_ext_default_ll = conn.want_ext; +- uint32_t want_default_ll = fuse_lower_32_bits(want_ext_default_ll); +- + /* Simulate application init modifying capabilities */ + conn.want_ext |= FUSE_CAP_ATOMIC_O_TRUNC; /* Add new capability */ + conn.want &= ~FUSE_CAP_SPLICE_READ; /* Remove a capability */ + +- rc = convert_to_conn_want_ext(&conn, want_ext_default_ll, +- want_default_ll); ++ rc = fuse_convert_to_conn_want_ext(&conn); + assert(rc == -EINVAL); + print_conn_info("Test conflict after", &conn); + +@@ -143,11 +164,7 @@ static void test_want_conversion_high_bits(void) + conn.want = fuse_lower_32_bits(conn.want_ext); + print_conn_info("Test high bits initial", &conn); + +- uint64_t want_ext_default_ll = conn.want_ext; +- uint32_t want_default_ll = fuse_lower_32_bits(want_ext_default_ll); +- +- rc = convert_to_conn_want_ext(&conn, want_ext_default_ll, +- want_default_ll); ++ rc = fuse_convert_to_conn_want_ext(&conn); + assert(rc == 0); + assert(conn.want_ext == ((1ULL << 33) | FUSE_CAP_ASYNC_READ)); + print_conn_info("Test high bits after", &conn); diff --git a/patches/Fix_meson_function_tests.patch b/patches/Fix_meson_function_tests.patch new file mode 100644 index 0000000..a1263c6 --- /dev/null +++ b/patches/Fix_meson_function_tests.patch @@ -0,0 +1,117 @@ +From 1df74208ea060b32e11b14e9b97049207ed03dd3 Mon Sep 17 00:00:00 2001 +From: Bernd Schubert +Date: Thu, 24 Apr 2025 16:49:08 +0200 +Subject: [PATCH] Fix meson function tests + +Several meson tests were incorrectly failing + +Checking for function "static_assert" : NO (cached) +Checking for function "pthread_setname_np" : NO (cached) +Check usable header "#include " : NO (cached) + +These functions get now tested with compilation tests +and get found on my system. + +Checking if "static_assert check" compiles: YES +Checking if "pthread_setname_np check" compiles: YES +Checking if "close_range check" compiles: YES + +Signed-off-by: Bernd Schubert +Signed-off-by: Giulio Benetti +--- + meson.build | 67 +++++++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 49 insertions(+), 18 deletions(-) + +diff --git a/meson.build b/meson.build +index ba551ed53..d1346d090 100644 +--- a/meson.build ++++ b/meson.build +@@ -59,6 +59,8 @@ include_default = ''' + #include + #include + #include ++#include /* For static_assert */ ++#include /* For pthread_setname_np */ + ''' + args_default = [ '-D_GNU_SOURCE' ] + +@@ -72,32 +74,61 @@ private_cfg.set_quoted('PACKAGE_VERSION', meson.project_version()) + # Test for presence of some functions + test_funcs = [ 'fork', 'fstatat', 'openat', 'readlinkat', 'pipe2', + 'splice', 'vmsplice', 'posix_fallocate', 'fdatasync', +- 'utimensat', 'copy_file_range', 'fallocate', 'static_assert', +- 'pthread_setname_np' ] ++ 'utimensat', 'copy_file_range', 'fallocate' ] + foreach func : test_funcs + private_cfg.set('HAVE_' + func.to_upper(), + cc.has_function(func, prefix: include_default, args: args_default)) + endforeach +-private_cfg.set('HAVE_SETXATTR', +- cc.has_function('setxattr', prefix: '#include ')) +-private_cfg.set('HAVE_ICONV', +- cc.has_function('iconv', prefix: '#include ')) +-private_cfg.set('HAVE_BACKTRACE', +- cc.has_function('backtrace', prefix: '#include ')) + +-# Test if headers exist +-private_cfg.set('HAVE_LINUX_CLOSE_RANGE_H', +- cc.check_header('#include ')) ++# Special case checks that need custom code ++special_funcs = { ++ 'static_assert': ''' ++ #include ++ static_assert(1, "test"); ++ int main(void) { return 0; } ++ ''', ++ 'pthread_setname_np': ''' ++ #include ++ int main(void) { ++ pthread_t thread = pthread_self(); ++ pthread_setname_np(thread, "test"); ++ return 0; ++ } ++ ''', ++ 'close_range': ''' ++ #include ++ #include ++ #include ++ int main(void) { ++ unsigned int flags = CLOSE_RANGE_UNSHARE; ++ return close_range(3, ~0U, flags); ++ } ++ ''' ++} ++ ++foreach name, code : special_funcs ++ private_cfg.set('HAVE_' + name.to_upper(), ++ cc.compiles(code, args: ['-Werror'] + args_default, ++ name: name + ' check')) ++endforeach ++ ++# Regular function checks ++private_cfg.set('HAVE_SETXATTR', ++ cc.has_function('setxattr', prefix: '#include ')) ++private_cfg.set('HAVE_ICONV', ++ cc.has_function('iconv', prefix: '#include ')) ++private_cfg.set('HAVE_BACKTRACE', ++ cc.has_function('backtrace', prefix: '#include ')) + +-# Test if structs have specific member ++# Struct member checks + private_cfg.set('HAVE_STRUCT_STAT_ST_ATIM', +- cc.has_member('struct stat', 'st_atim', +- prefix: include_default, +- args: args_default)) ++ cc.has_member('struct stat', 'st_atim', ++ prefix: include_default + '#include ', ++ args: args_default)) + private_cfg.set('HAVE_STRUCT_STAT_ST_ATIMESPEC', +- cc.has_member('struct stat', 'st_atimespec', +- prefix: include_default, +- args: args_default)) ++ cc.has_member('struct stat', 'st_atimespec', ++ prefix: include_default + '#include ', ++ args: args_default)) + + # + # Compiler configuration diff --git a/patches/Make_conn-want-want_ext_conversion_non_fatal.patch b/patches/Make_conn-want-want_ext_conversion_non_fatal.patch new file mode 100644 index 0000000..8e17ec2 --- /dev/null +++ b/patches/Make_conn-want-want_ext_conversion_non_fatal.patch @@ -0,0 +1,92 @@ +From 28a6e40302fbd3eeac1aee9434e1bcf69b1a8e25 Mon Sep 17 00:00:00 2001 +From: Bernd Schubert +Date: Sat, 17 May 2025 23:52:47 +0200 +Subject: [PATCH] Make conn->want/want_ext conversion non fatal + +there are too many issues with conn->want and conn->want_ext +conversion, for now just log a warning, but setting both +flags is now not fatal anymore. + +Signed-off-by: Bernd Schubert +--- + lib/fuse.c | 16 +--------------- + lib/fuse_i.h | 5 +---- + lib/fuse_lowlevel.c | 9 +-------- + 3 files changed, 3 insertions(+), 27 deletions(-) + +diff --git a/lib/fuse.c b/lib/fuse.c +index 49f57112a..c0d00edbc 100644 +--- a/lib/fuse.c ++++ b/lib/fuse.c +@@ -2618,25 +2618,11 @@ void fuse_fs_init(struct fuse_fs *fs, struct fuse_conn_info *conn, + if (fs->op.init) { + uint64_t want_ext_default = conn->want_ext; + uint32_t want_default = fuse_lower_32_bits(conn->want_ext); +- int rc; + + conn->want = want_default; + fs->user_data = fs->op.init(conn, cfg); + +- rc = convert_to_conn_want_ext(conn, want_ext_default, +- want_default); +- +- if (rc != 0) { +- /* +- * This is a grave developer error, but +- * we cannot return an error here, as the function +- * signature does not allow it. +- */ +- fuse_log( +- FUSE_LOG_ERR, +- "fuse: Aborting due to invalid conn want flags.\n"); +- _exit(EXIT_FAILURE); +- } ++ convert_to_conn_want_ext(conn, want_ext_default, want_default); + } + } + +diff --git a/lib/fuse_i.h b/lib/fuse_i.h +index 48b8294f3..bf5e2ca41 100644 +--- a/lib/fuse_i.h ++++ b/lib/fuse_i.h +@@ -245,11 +245,8 @@ static inline int convert_to_conn_want_ext(struct fuse_conn_info *conn, + */ + if (conn->want != want_default && + fuse_lower_32_bits(conn->want_ext) != conn->want) { +- if (conn->want_ext != want_ext_default) { +- fuse_log(FUSE_LOG_ERR, +- "fuse: both 'want' and 'want_ext' are set\n"); ++ if (conn->want_ext != want_ext_default) + return -EINVAL; +- } + + /* high bits from want_ext, low bits from want */ + conn->want_ext = fuse_higher_32_bits(conn->want_ext) | +diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c +index 9ebaaf08e..9ee88b160 100644 +--- a/lib/fuse_lowlevel.c ++++ b/lib/fuse_lowlevel.c +@@ -2160,7 +2160,6 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) + if (se->op.init) { + uint64_t want_ext_default = se->conn.want_ext; + uint32_t want_default = fuse_lower_32_bits(se->conn.want_ext); +- int rc; + + // Apply the first 32 bits of capable_ext to capable + se->conn.capable = fuse_lower_32_bits(se->conn.capable_ext); +@@ -2173,14 +2172,8 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) + * se->conn.want_ext + * Userspace might still use conn.want - we need to convert it + */ +- rc = convert_to_conn_want_ext(&se->conn, want_ext_default, ++ convert_to_conn_want_ext(&se->conn, want_ext_default, + want_default); +- if (rc != 0) { +- fuse_reply_err(req, EPROTO); +- se->error = -EPROTO; +- fuse_session_exit(se); +- return; +- } + } + + if (!want_flags_valid(se->conn.capable_ext, se->conn.want_ext)) { diff --git a/patches/meson.build-make-special_funcs-check-more-reliable.patch b/patches/meson.build-make-special_funcs-check-more-reliable.patch new file mode 100644 index 0000000..1ee84c7 --- /dev/null +++ b/patches/meson.build-make-special_funcs-check-more-reliable.patch @@ -0,0 +1,37 @@ +From 8e226c6af6f386a88ed53d0a0940ff6b869b372d Mon Sep 17 00:00:00 2001 +From: Giulio Benetti +Date: Fri, 25 Apr 2025 19:00:14 +0200 +Subject: [PATCH] meson.build: make special_funcs check more reliable + +Unfortunately while cross-compiling with build tools like Buildroot it +happens to have repeated flags or anything that could lead to a warning. +This way the check fails because of a warning not related to the special +function. So let's use cc.links() and increase minimum meson_version to +0.60 since cc.links() has been added during that version. + +Signed-off-by: Giulio Benetti +--- + meson.build | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/meson.build b/meson.build +index d1346d090..d3d236dc4 100644 +--- a/meson.build ++++ b/meson.build +@@ -1,6 +1,6 @@ + project('libfuse3', ['c'], + version: '3.17.2', +- meson_version: '>= 0.51.0', ++ meson_version: '>= 0.60.0', + default_options: [ + 'buildtype=debugoptimized', + 'c_std=gnu11', +@@ -108,7 +108,7 @@ special_funcs = { + + foreach name, code : special_funcs + private_cfg.set('HAVE_' + name.to_upper(), +- cc.compiles(code, args: ['-Werror'] + args_default, ++ cc.links(code, args: args_default, + name: name + ' check')) + endforeach + diff --git a/patches/series b/patches/series new file mode 100644 index 0000000..5adfbb0 --- /dev/null +++ b/patches/series @@ -0,0 +1,5 @@ +Fix_meson_function_tests.patch +meson.build-make-special_funcs-check-more-reliable.patch +Make_conn-want-want_ext_conversion_non_fatal.patch +Add-container_of-and-ROUND_UP-macros.patch +Fix-fuse_apply_conn_info_opts.patch diff --git a/rules b/rules new file mode 100755 index 0000000..fcac031 --- /dev/null +++ b/rules @@ -0,0 +1,69 @@ +#!/usr/bin/make -f +# -*- makefile -*- + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +SHELL := sh -e + +include /usr/share/dpkg/architecture.mk + +export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +ifneq (,$(filter $(DEB_HOST_ARCH), arc armel m68k mips mipsel powerpc sh3 sh4 sparc)) + export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed -latomic +endif + +ifeq (,$(filter noudeb, $(DEB_BUILD_PROFILES))) + with_udeb = yes +endif + +override_dh_auto_configure-arch: + dh_auto_configure -- -Ddefault_library=both -Duseroot=false \ + $(DEB_CONFIGURE_EXTRA_FLAGS) + +override_dh_auto_configure-indep: + @echo Do not configure indep + +override_dh_auto_build-indep: + @echo Do not build indep + +override_dh_auto_install-indep: + @echo Do not install indep + +override_dh_compress: + dh_compress -Xusr/share/doc/libfuse3-dev/examples -XREADME.md + +override_dh_fixperms-arch: + dh_fixperms --arch +ifeq ($(DEB_HOST_ARCH),linux) + chmod 0755 debian/fuse3/bin/fusermount3 +endif + +execute_after_dh_install: + # adding initramfs-tools integration + install -D -m 0755 debian/local/fuse.hook debian/fuse3/usr/share/initramfs-tools/hooks/fuse + +override_dh_auto_test-arch: +ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS))) +ifeq (,$(findstring $(DEB_BUILD_ARCH),powerpc ppc64 sparc64 s390x hppa)) + (cd obj-${DEB_HOST_GNU_TYPE}; python3 -m pytest test/) \ + || true +endif +endif + +override_dh_auto_test-indep: + @echo Do not test indep + +override_dh_missing: + dh_missing --fail-missing + +%: + dh ${@} --buildsystem=meson + +.PHONY: override_dh_auto_configure-arch override_dh_auto_configure-indep \ + override_dh_auto_build-indep override_dh_auto_install-indep \ + override_dh_compress override_dh_fixperms-arch \ + execute_after_dh_install \ + override_dh_auto_test-arch override_dh_auto_test-indep \ + override_dh_missing diff --git a/source/format b/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/upstream/metadata b/upstream/metadata new file mode 100644 index 0000000..0b26a50 --- /dev/null +++ b/upstream/metadata @@ -0,0 +1,6 @@ +--- +Archive: GitHub +Bug-Database: https://github.com/libfuse/libfuse/issues +Bug-Submit: https://github.com/libfuse/libfuse/issues/new +Repository: https://github.com/libfuse/libfuse.git +Repository-Browse: https://github.com/libfuse/libfuse diff --git a/upstream/signing-key.asc b/upstream/signing-key.asc new file mode 100644 index 0000000..c31f5c4 --- /dev/null +++ b/upstream/signing-key.asc @@ -0,0 +1,85 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQINBFMiefoBEADYa1ZUqR/3YDqaf2UGpd9kNfKAY3TAR+xTcTYBKWTkJEy4cX2b +ccSEOf7Ef1w0va+WgBwDUAllf+x21UFOWnPnqwb8LJxyg8dN3CRNWf9Z2vRXNOkv +nAd0hYnA6xsbSLDQV0wpJOTH1zyZejMMWLpZh5SKRxaJAtpsfZ32qppzJhn4jJb0 +v2fC+wJVkUy4mLe6yaHCrrHwlwldyzlwPBNwFfk31mVFYO+COSTGq+RXU2kCdujf +w648IBYltdWI3D1vTilJd0gt2EDmOqQizfFJLlBTdLieJdrXzL4WWuzvJpC1Yadk +mqMqnVkpcDxbxw0bK7G0faLigwWkshggaSns0vnpD05jQyMJUYdLwB9lh6u0B9AP +cCxmPLhgHDdgdlZ+1JHMdfY0gIMSIAP2zkQu4iaTv5Tuc5a03dXE7G6GwZ+A5Ysr +ovQCot2FY653A0swmAsaCy3A2OcVFXXgmZGLYh/06XA/+WhMSLVIaQ6eYTFgG9k8 +iopU6zw5p2vav1rOuirymLe3b/VNZhk6nOpewwLp+5c2Ylmj6zEHegFQ9pbmlFF/ +kubk9wGuS941G0/iLPyf3ePPhQ6hMY9L+7moW+Zlbqqg2XXa9S8C2rMwELDegpaw +YJyMIt25xAb94BGMkU/SxclzZ62ktGkYrA0ekiHkB6zzt8uhHrGDxWEucQARAQAB +tCFOaWtvbGF1cyBSYXRoIDxOaWtvbGF1c0ByYXRoLm9yZz6IagQQEQoAKgUCUyJ7 +rCMaaHR0cDovL3d3dy5yYXRoLm9yZy9ncGdwb2xpY3kuaHRtbAAKCRCprbf4rk5C +XNS7AJ9/Fdr8AzeAPKRoGN/ilFSb64kVggCeNE3F2CrZisHyjAlJ2sW/5iRS1MeJ +AUAEEAEKACoFAlMie5IjGmh0dHA6Ly93d3cucmF0aC5vcmcvZ3BncG9saWN5Lmh0 +bWwACgkQttywLM0aUrlgiQf/fskwiyKtKS2ikqsiw6rqo9RP3A6AGJ3LQivpekV3 +elKxeu22L99yjkCEKHtggMmVd+Q9z9Pmvmx1d4EcVRtj7N86CcrQnPFbvUaiZ22g +CDS61BCbnItzeo3nkOhbJtCU2AXHwBCx2c1uGNzR5qJoymXo92FIp7JxKJ3hHZDW +E2XnX41bNwzZtycfZuk5VB29MIiEIIGbR/Y8rq7KwWQdyQ8y5i6Jnq5hPqRVpvMa +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 +ol5xay+f7P0XVpxLkO+fCw== +=gOOn +-----END PGP PUBLIC KEY BLOCK----- diff --git a/watch b/watch new file mode 100644 index 0000000..8df1acc --- /dev/null +++ b/watch @@ -0,0 +1,6 @@ +version=4 +opts=uversionmangle=s/^(SNAPSHOT|RELEASE)\.//;s/(\d+)[_-](\d+)[_-](\d+)/\$1.\$2.\$3/;s/(\d+)[_-](\d+)/\$1.\$2/;s/(\d)[_\.\-\+]?((rc|pre|dev|beta|alpha|b|a)[\-\.]?\d*)$/$1~$2/;s/(\d)[_\.\-\+]?RC[\-\.]?(\d*)$/$1~rc$2/,\ +dversionmangle=s/\+(debian|dfsg|ds|deb)(\.?\d+)?$//i,\ +pgpsigurlmangle=s/$/.asc/ \ +https://github.com/libfuse/libfuse/tags \ +(?:|.*/)fuse-[vV]?(\d\S*)@ARCHIVE_EXT@ -- 2.30.2