On Tue, 2026-05-05 at 19:28 +0100, Sam Kent wrote:
> Add selftest-ko-filter recipe and a PackageTests.test_kmodule_prefilter
> oe-selftest that builds it to verify process_split_and_strip_files()
> handles .ko.xz/.ko.gz alongside a real .ko without corrupting them.
> Regression test for YOCTO #2348.
> 
> AI-Generated: Uses Claude Sonnet 4.6
> 
> Signed-off-by: Sam Kent <[email protected]>
> ---
>  .../selftest-ko-filter/files/module.c         |  3 ++
>  .../selftest-ko-filter/selftest-ko-filter.bb  | 29 +++++++++++++++++++
>  meta/lib/oeqa/selftest/cases/package.py       | 22 ++++++++++++++
>  3 files changed, 54 insertions(+)
>  create mode 100644 
> meta-selftest/recipes-test/selftest-ko-filter/files/module.c
>  create mode 100644 
> meta-selftest/recipes-test/selftest-ko-filter/selftest-ko-filter.bb
> 
> diff --git a/meta-selftest/recipes-test/selftest-ko-filter/files/module.c 
> b/meta-selftest/recipes-test/selftest-ko-filter/files/module.c
> new file mode 100644
> index 0000000..f6d50ba
> --- /dev/null
> +++ b/meta-selftest/recipes-test/selftest-ko-filter/files/module.c
> @@ -0,0 +1,3 @@
> +/* SPDX-License-Identifier: MIT */
> +/* Minimal relocatable object used as a .ko stand-in for pre-filter testing. 
> */
> +int selftest_ko_filter_marker = 42;
> diff --git 
> a/meta-selftest/recipes-test/selftest-ko-filter/selftest-ko-filter.bb 
> b/meta-selftest/recipes-test/selftest-ko-filter/selftest-ko-filter.bb
> new file mode 100644
> index 0000000..1b8cc73
> --- /dev/null
> +++ b/meta-selftest/recipes-test/selftest-ko-filter/selftest-ko-filter.bb
> @@ -0,0 +1,29 @@
> +#
> +# Copyright OpenEmbedded Contributors
> +#
> +# SPDX-License-Identifier: MIT
> +#
> +SUMMARY = "Test fixture for the kernel-module file pre-filter in package.py"
> +LICENSE = "MIT"
> +LIC_FILES_CHKSUM = 
> "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
> +
> +SRC_URI = "file://module.c"
> +S = "${UNPACKDIR}"
> +
> +MODDIR = "${libdir}/selftest-ko-filter"
> +
> +do_compile () {
> +    ${CC} ${CFLAGS} -c module.c -o module.ko
> +}
> +
> +do_install () {
> +    install -d ${D}${MODDIR}
> +    install -m 0644 module.ko ${D}${MODDIR}/
> +
> +    # Fake compressed modules — the pre-filter must not pass these to strip.
> +    # Use octal escapes: dash (the OE recipe shell) does not support \xHH in 
> printf.
> +    printf '\375\067\172\130\132\000' > ${D}${MODDIR}/module.ko.xz
> +    printf '\037\213'                 > ${D}${MODDIR}/module.ko.gz

Hi Sam,

Why are you writing bytes via printf here instead of using gzip and xz
to compess module.ko? You don't necessarily need to change this, but
please explain it in the commit message or comment.

> +}
> +
> +FILES:${PN} = "${MODDIR}/*"
> diff --git a/meta/lib/oeqa/selftest/cases/package.py 
> b/meta/lib/oeqa/selftest/cases/package.py
> index 38ed717..d33424b 100644
> --- a/meta/lib/oeqa/selftest/cases/package.py
> +++ b/meta/lib/oeqa/selftest/cases/package.py
> @@ -185,6 +185,28 @@ class PackageTests(OESelftestTestCase):
>                  if not gdbtest(qemu, binary):
>                      self.fail('GDB %s failed' % binary)
>  
> +    def test_kmodule_prefilter(self):
> +        # Regression test for YOCTO #2348: process_split_and_strip_files() 
> must
> +        # use f.endswith(".ko") so that compressed modules (.ko.xz, .ko.gz) 
> are
> +        # not fed to is_elf() / strip.
> +        bitbake("selftest-ko-filter -c package")
> +
> +        pkgdest = get_bb_var('PKGDEST', 'selftest-ko-filter')
> +        libdir  = get_bb_var('libdir',  'selftest-ko-filter')
> +        moddir  = pkgdest + "/selftest-ko-filter" + libdir + 
> "/selftest-ko-filter"
> +
> +        self.assertTrue(os.path.exists(moddir + "/module.ko"),
> +                        "module.ko missing from PKGDEST")
> +
> +        for fname, magic in [("module.ko.xz", b"\xfd\x37\x7a\x58\x5a\x00"),
> +                             ("module.ko.gz", b"\x1f\x8b")]:

I find it very confusing that we have octal escapes in do_install() and
hex escapes here. If we have to use octal escapes due to dash
limitations, let's also use octal escapes here.

> +            path = moddir + "/" + fname
> +            self.assertTrue(os.path.exists(path),
> +                            "%s missing from PKGDEST" % fname)
> +            with open(path, "rb") as f:
> +                self.assertEqual(f.read(len(magic)), magic,
> +                                 "%s header corrupted in PKGDEST" % fname)
> +
>      def test_preserve_ownership(self):
>          features = 'IMAGE_INSTALL:append = " selftest-chown"\n'
>          self.write_config(features)

Best regards,

-- 
Paul Barker

Attachment: signature.asc
Description: This is a digitally signed message part

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#238130): 
https://lists.openembedded.org/g/openembedded-core/message/238130
Mute This Topic: https://lists.openembedded.org/mt/119166634/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to