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 +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 +--- + 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 +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 +--- + 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} +}