diff mbox series

[meta-filesystems,4/5] unionfs-fuse: add ptest support

Message ID 20251226191001.2920748-4-skandigraun@gmail.com
State Under Review
Headers show
Series [meta-oe,1/5] redis: ignore CVE-2025-46686 | expand

Commit Message

Gyorgy Sarvari Dec. 26, 2025, 7:10 p.m. UTC
It takes about a second to execute.

Added two patches:
- One adapts the testuite to ptest, to test the installed binary instead of
  testing the one from the build folder.
- Another that fixes a bug in unionfsctl, which made the test fail. This
  patch is submitted upstream.

Sample output:

root@qemux86-64:~# ptest-runner
START: ptest-runner
2025-12-26T19:03
BEGIN: /usr/lib/unionfs-fuse/ptest
ptestuser:!:20448:0:99999:7:::
PASS: test_all.IOCTL_TestCase.test_debug
PASS: test_all.IOCTL_TestCase.test_wrong_args
PASS: test_all.UnionFS_Help.test_help
[...many lines...]
PASS: test_all.UnionFS_RW_RW_PreserveBranch_TestCase.test_permissions_after_creating_directories
PASS: test_all.UnionFS_Sync.test_sync
PASS: test_all.UnionFS_Version.test_help

============================================================================
Testsuite summary
DURATION: 0
END: /usr/lib/unionfs-fuse/ptest
2025-12-26T19:03
STOP: ptest-runner
TOTAL: 1 FAIL: 0

Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
---
 .../ptest-packagelists-meta-filesystems.inc   |  1 +
 .../files/0001-adapt-tests-to-ptest.patch     | 43 ++++++++++++++
 .../files/0001-fix-debug-ioctl-call.patch     | 58 +++++++++++++++++++
 .../unionfs-fuse/files/run-ptest              |  9 +++
 .../unionfs-fuse/unionfs-fuse_3.7.bb          | 13 ++++-
 5 files changed, 122 insertions(+), 2 deletions(-)
 create mode 100644 meta-filesystems/recipes-filesystems/unionfs-fuse/files/0001-adapt-tests-to-ptest.patch
 create mode 100644 meta-filesystems/recipes-filesystems/unionfs-fuse/files/0001-fix-debug-ioctl-call.patch
 create mode 100644 meta-filesystems/recipes-filesystems/unionfs-fuse/files/run-ptest
diff mbox series

Patch

diff --git a/meta-filesystems/conf/include/ptest-packagelists-meta-filesystems.inc b/meta-filesystems/conf/include/ptest-packagelists-meta-filesystems.inc
index 875a2f139a..3dc6986d6f 100644
--- a/meta-filesystems/conf/include/ptest-packagelists-meta-filesystems.inc
+++ b/meta-filesystems/conf/include/ptest-packagelists-meta-filesystems.inc
@@ -8,6 +8,7 @@ 
 
 PTESTS_FAST_META_FILESYSTEMS = "\
     e2tools \
+    unionfs-fuse \
 "
 
 PTESTS_SLOW_META_FILESYSTEMS = "\
diff --git a/meta-filesystems/recipes-filesystems/unionfs-fuse/files/0001-adapt-tests-to-ptest.patch b/meta-filesystems/recipes-filesystems/unionfs-fuse/files/0001-adapt-tests-to-ptest.patch
new file mode 100644
index 0000000000..1361501d4e
--- /dev/null
+++ b/meta-filesystems/recipes-filesystems/unionfs-fuse/files/0001-adapt-tests-to-ptest.patch
@@ -0,0 +1,43 @@ 
+From 8de40703857e63483a5c1b83ee7a5b6323c0b7d3 Mon Sep 17 00:00:00 2001
+From: Gyorgy Sarvari <skandigraun@gmail.com>
+Date: Fri, 26 Dec 2025 19:50:20 +0100
+Subject: [PATCH] adapt tests to ptest
+
+The tests are expected to be executed after compilation, and
+they look for the tested binaries in the build folder. However
+for ptests we want to test the already installed binaries,
+so change the tests to use them.
+
+Also, adapt the fusermount executable name to what's installed
+in the ptest images.
+
+Upstream-Status: Inappropriate [oe-specific]
+Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
+---
+ test_all.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/test_all.py b/test_all.py
+index 6ead5b4..bb167a9 100755
+--- a/test_all.py
++++ b/test_all.py
+@@ -41,8 +41,8 @@ def get_osxfuse_unionfs_mounts():
+ 
+ class Common:
+ 	def setUp(self):
+-		self.unionfs_path = os.path.abspath('src/unionfs')
+-		self.unionfsctl_path = os.path.abspath('src/unionfsctl')
++		self.unionfs_path = 'unionfs'
++		self.unionfsctl_path = 'unionfsctl'
+ 
+ 		self.tmpdir = tempfile.mkdtemp()
+ 		self.original_cwd = os.getcwd()
+@@ -81,7 +81,7 @@ class Common:
+ 			if platform.system() == 'Darwin':
+ 				call('umount %s' % self.mount_device)
+ 			else:
+-				call('fusermount -u union')
++				call('fusermount3 -u union')
+ 
+ 		os.chdir(self.original_cwd)
+ 		shutil.rmtree(self.tmpdir)
diff --git a/meta-filesystems/recipes-filesystems/unionfs-fuse/files/0001-fix-debug-ioctl-call.patch b/meta-filesystems/recipes-filesystems/unionfs-fuse/files/0001-fix-debug-ioctl-call.patch
new file mode 100644
index 0000000000..a29128d22a
--- /dev/null
+++ b/meta-filesystems/recipes-filesystems/unionfs-fuse/files/0001-fix-debug-ioctl-call.patch
@@ -0,0 +1,58 @@ 
+From bf552c479a0c0b0ef2d52d8456030c56b8cc6dbb Mon Sep 17 00:00:00 2001
+From: Gyorgy Sarvari <skandigraun@gmail.com>
+Date: Fri, 26 Dec 2025 19:33:54 +0100
+Subject: [PATCH] fix debug ioctl call
+
+When calling the ioctl to set a debug file, the ioctl expects to receive a datatype
+that is specified in the ioctl definition: char[PATHLEN_MAX]
+
+However when passing the pointer from getopts, this is only true if the passed path
+has the maximal allowed length. Since usually this path is shorter than the max,
+the kernel is trying to read over the end of the argument, and returns "EFAULT/Bad address".
+
+To solve this, copy the argument to a buffer that has the exact size of what the ioctl
+expects, and pass this buffer to the ioctl.
+
+Upstream-Status: Submitted [https://github.com/rpodgorny/unionfs-fuse/pull/164]
+Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
+---
+ src/unionfsctl.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/src/unionfsctl.c b/src/unionfsctl.c
+index 74c4d33..efed505 100644
+--- a/src/unionfsctl.c
++++ b/src/unionfsctl.c
+@@ -44,25 +44,28 @@ int main(int argc, char **argv) {
+ 
+ 	int opt;
+ 	const char* argument_param;
++	char debug_file[PATHLEN_MAX];
+ 	int debug_on_off;
+ 	int ioctl_res;
+ 	while ((opt = getopt(argc, argv, "d:p:")) != -1) {
+ 		switch (opt) {
+ 		case 'p':
+-			argument_param = optarg;
+-			if (strlen(argument_param) < 1) {
++			if (strlen(optarg) < 1) {
+ 				fprintf(stderr,
+ 					"Not a valid debug path given!\n");
+ 				print_help(progname);
+ 				exit(1);
+ 			}
+ 
+-			if (strlen(argument_param) > PATHLEN_MAX) {
++			if (strlen(optarg) > PATHLEN_MAX) {
+ 				fprintf(stderr, "Debug path too long!\n");
+ 				exit(1);
+ 			}
+ 
+-			ioctl_res = ioctl(fd, UNIONFS_SET_DEBUG_FILE, argument_param);
++			memset(debug_file, 0, PATHLEN_MAX);
++			strncpy(debug_file, optarg, PATHLEN_MAX - 1);
++
++			ioctl_res = ioctl(fd, UNIONFS_SET_DEBUG_FILE, debug_file);
+ 			if (ioctl_res == -1) {
+ 				fprintf(stderr, "debug-file ioctl failed: %s\n",
+ 					strerror(errno) );
diff --git a/meta-filesystems/recipes-filesystems/unionfs-fuse/files/run-ptest b/meta-filesystems/recipes-filesystems/unionfs-fuse/files/run-ptest
new file mode 100644
index 0000000000..a92ef0a8f7
--- /dev/null
+++ b/meta-filesystems/recipes-filesystems/unionfs-fuse/files/run-ptest
@@ -0,0 +1,9 @@ 
+#!/bin/sh
+# not all tests can run with root, so create a test user
+# if it doesn't exist yet
+
+if ! grep ptestuser /etc/shadow; then
+    useradd ptestuser
+fi
+
+su ptestuser -c "python3 -m putao.unittest"
diff --git a/meta-filesystems/recipes-filesystems/unionfs-fuse/unionfs-fuse_3.7.bb b/meta-filesystems/recipes-filesystems/unionfs-fuse/unionfs-fuse_3.7.bb
index 5ba202b90c..b5c5bb847c 100644
--- a/meta-filesystems/recipes-filesystems/unionfs-fuse/unionfs-fuse_3.7.bb
+++ b/meta-filesystems/recipes-filesystems/unionfs-fuse/unionfs-fuse_3.7.bb
@@ -6,11 +6,20 @@  LIC_FILES_CHKSUM = "file://src/unionfs.c;beginline=3;endline=8;md5=30fa8de70fd8a
                     file://LICENSE;md5=0e75c95b3e0e1c01489b39e7fadd3e2d \
 "
 
-SRC_URI = "git://github.com/rpodgorny/${BPN}.git;branch=master;protocol=https;tag=v${PV}"
+SRC_URI = "git://github.com/rpodgorny/${BPN}.git;branch=master;protocol=https;tag=v${PV} \
+           file://run-ptest \
+           file://0001-fix-debug-ioctl-call.patch \
+           file://0001-adapt-tests-to-ptest.patch \
+"
+
 SRCREV = "3fcbd11f78b9a9e02ea0e861d741840fe45dc9c8"
 
 DEPENDS = "fuse3"
 RDEPENDS:${PN} = "bash"
+RDEPENDS:${PN}-ptest += "python3-core python3-unittest python3-unittest-automake-output"
 
+inherit cmake pkgconfig ptest
 
-inherit cmake pkgconfig
+do_install_ptest(){
+    install ${S}/test_all.py ${D}${PTEST_PATH}
+}