<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="/source/rss.xsl.xml"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
    <title>Changes in interp_bind.bpf.c</title>
    <description></description>
    <language>en</language>
    <copyright>Copyright 2015</copyright>
    <generator>Java</generator><item>
        <title>b9cba7ebfe539f3e4bbdd03a1e0efa3b30b3f592 - Merge tag &apos;vfs-7.3-rc1.binfmt&apos; of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs</title>
        <link>http://kernelsources.org:8080/source/history/linux/tools/testing/selftests/exec/interp_bind.bpf.c#b9cba7ebfe539f3e4bbdd03a1e0efa3b30b3f592</link>
        <description>Merge tag &apos;vfs-7.3-rc1.binfmt&apos; of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfsPull binfmt updates from Christian Brauner: &quot;This contains a bunch of work for binfmt_misc. It fixes a bunch of  old bugs, reworks the locking, and then extends the format registry  so a binary type can be matched programmatically and its interpreter  computed per exec instead of being a fixed string recorded at  registration time.  This allows nixos and other to e.g., implement relocatable binaries  meaning the interpreter/dynamic loader can be determined  programatically, say found relative to the binary. The mechanism is  flexible and can support other policies:   - Handler lookup is now an rcu walk. An exec that matches no     binfmt_misc entry should now never write to a shared cacheline   - remove the VERBOSE_STATUS and USE_DEBUG compile time toggles   - convert the entry file to a seq_file which simplifies things quite     a bit and kills a lot of custom logic   - make flags proper enums   - rename struct Node to binfmt_misc_entry   - allow entries to be removed with unlink(2)   - Add the ability to attach bpf programs to binfmt_misc entries so     it&apos;s possible to dynamically choose the execution environment such     as the loader or interpreter on a per binary basis.     A handler is an instance of a binfmt_misc_ops struct_ops with a     -&gt;match() and a -&gt;load() program. match() decides from the entry     lookup walk whether the handler applies under the same     registration-order. It can read file content as needed not only the     prefetched 256 bytes in bprm-&gt;buf.     load() then selects the interpreter and stages it through the new     bpf_binprm_set_interp(), bpf_binprm_set_interp_arg() and     bpf_binprm_set_flags() kfuncs.     Handlers are published in a registry keyed by the registering     task&apos;s user namespace and activated through the existing text     interface with a new &apos;B&apos; type carrying the handler name:	echo &apos;:origin:B::::nix:&apos; &gt; /proc/sys/fs/binfmt_misc/register     The permission and namespacing model is unchanged. Activating a     handler requires the same write access to an instance as any other     registration. A container mounting its own instance escapes the     host&apos;s entries exactly as before. The computed interpreter is     opened with open_exec() under the caller&apos;s credentials and goes     through full LSM vetting as the next binprm level. A program can     only ever redirect the caller to something the caller could exec     anyway.   - Two dispatch modes are added. So far the chosen interpreter owns     the whole process identity (argv[0], /proc/pid/cmdline,     /proc/self/exe all name interpreter information). So relocatable     find the dynamic linker instead. Also a binary passed to execveat()     as an inaccessible O_CLOEXEC fd cannot run at all and gdb trips     because AT_ENTRY and AT_PHDR do not match the exe file. So PIE     symbols are unrelocated.     This adds transparent dispatch which allows the interpreter to load     the binary through AT_EXECFD and leaves the argument vector exactly     as the caller built it and labels mm-&gt;exe_file and comm with the     binary. It also raises the AT_FLAGS_TRANSPARENT_INTERP aux vector     bit. The interpreter keeps control of mapping the binary.     The second mode is loader substitution. This allows a binary to be     executed natively and only the interpreter to be changed.   - Last, interpreters can be bound at registration time. Each     interpreter is opened by its own write with the credentials the     entry file was opened with. The program picks one per exec with     bpf_binprm_select_interp().     Ucounts are used to properly account for pre-opened interpreters     via /proc/sys/user/max_binfmt_misc_interpreters&quot;* tag &apos;vfs-7.3-rc1.binfmt&apos; of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: (63 commits)  binfmt_misc: document the pre-opened interpreter limit  selftests/exec: test the pre-opened interpreter limit  binfmt_misc: correctly account pre-opened interpreters  binfmt_misc: document interpreters bound by a &apos;B&apos; entry  selftests/exec: test interpreters bound to a &apos;B&apos; entry  binfmt_misc: let a &apos;B&apos; entry bind its interpreters  binfmt_misc: carry pre-opened interpreters in struct binfmt_misc_interp  selftests/exec: share the bpf handler preconditions  binfmt_misc: document registering an entry disabled  selftests/exec: test registering an entry disabled  selftests/exec: let binfmt_flag_supported() return a bool  selftests/exec: check that a binfmt_misc instance cannot be pinned  binfmt_misc: let a register string create an entry disabled  binfmt_misc: document loader substitution  selftests/exec: test binfmt_misc loader substitution  binfmt_misc: let a bpf handler request loader substitution  binfmt_misc: add the &apos;L&apos; loader substitution flag  binfmt_elf_fdpic: consume a stashed PT_INTERP substitute  binfmt_elf: consume a stashed PT_INTERP substitute  exec: carry a PT_INTERP substitute in struct linux_binprm  ...

            List of files:
            /linux/tools/testing/selftests/exec/interp_bind.bpf.c</description>
        <pubDate>Mon, 17 Aug 2026 17:35:25 +0200</pubDate>
        <dc:creator>Linus Torvalds &lt;torvalds@linux-foundation.org&gt;</dc:creator>
    </item>
<item>
        <title>e98067e72ff81b054bda8135e1c348d13f54e553 - Merge patch series &quot;binfmt_misc: bind interpreters to a bpf-backed entry&quot;</title>
        <link>http://kernelsources.org:8080/source/history/linux/tools/testing/selftests/exec/interp_bind.bpf.c#e98067e72ff81b054bda8135e1c348d13f54e553</link>
        <description>Merge patch series &quot;binfmt_misc: bind interpreters to a bpf-backed entry&quot;Christian Brauner &lt;brauner@kernel.org&gt; says:binfmt_misc: bind interpreters to a bpf-backed entryA &apos;B&apos; entry&apos;s load program hands the kernel an absolute path andopen_exec() resolves it at exec time in the mount namespace of whoeverruns the binary. So the handler names an interpreter but never gets tosay which file that is. Whoever controls the filesystem view of the execdoes.Static entries have had the answer for a while. &apos;F&apos; opens the file atregistration and every exec runs a clone of it. I can&apos;t just reuse it asit stands. It pre-opens the one interpreter named in the register stringand a &apos;B&apos; entry has no fixed interpreter. The program picks per exec,and a qemu-user shaped handler wants one per guest architecture. So itmay want a whole set of them and that doesn&apos;t fit in a register string.An entry is matchable the moment it is registered, so everything itneeds has to fit in that one write. Patch 1 adds a &apos;D&apos; flag that createsthe entry disabled and splits a registration into create and activate:    echo &apos;:qemu:B::::qemu_user:D&apos; &gt; register    echo &apos;+aarch64 /usr/bin/qemu-aarch64&apos; &gt; qemu    echo &apos;+arm /usr/bin/qemu-arm&apos; &gt; qemu    echo 1 &gt; qemuEach path is opened by its write, with the credentials the entry file wasopened with. Same open_exec() call, same place as &apos;F&apos;. The program picksone per exec with bpf_binprm_select_interp() and gets a clone of thefile. Nothing is resolved again, in any namespace.A &apos;D&apos; entry simply isn&apos;t hashed until that first &apos;1&apos;, so the rcuinsertion that publishes the entry also publishes its interpreters andthe exec side needs no barriers. Reading the entry file doesn&apos;t take anylocks either. Bindings are rcu-published and the open file already pinseverything the read looks at. We use paths, not fds which makes theconfig remain nice and static and can be shipped via /etc/binfmt.d.* patches from https://patch.msgid.link/20260730-work-binfmt_misc-preopen-v1-0-4a0b0da71f16@kernel.org:  binfmt_misc: document interpreters bound by a &apos;B&apos; entry  selftests/exec: test interpreters bound to a &apos;B&apos; entry  binfmt_misc: let a &apos;B&apos; entry bind its interpreters  binfmt_misc: carry pre-opened interpreters in struct binfmt_misc_interp  selftests/exec: share the bpf handler preconditions  binfmt_misc: document registering an entry disabled  selftests/exec: test registering an entry disabled  selftests/exec: let binfmt_flag_supported() return a bool  binfmt_misc: let a register string create an entry disabledLink: https://patch.msgid.link/20260730-work-binfmt_misc-preopen-v1-0-4a0b0da71f16@kernel.orgSigned-off-by: Christian Brauner (Amutable) &lt;brauner@kernel.org&gt;

            List of files:
            /linux/tools/testing/selftests/exec/interp_bind.bpf.c</description>
        <pubDate>Fri, 31 Jul 2026 10:38:25 +0200</pubDate>
        <dc:creator>Christian Brauner &lt;brauner@kernel.org&gt;</dc:creator>
    </item>
<item>
        <title>7404b1472b111b62f061fc5e9244aacaa862a1e4 - selftests/exec: test interpreters bound to a &apos;B&apos; entry</title>
        <link>http://kernelsources.org:8080/source/history/linux/tools/testing/selftests/exec/interp_bind.bpf.c#7404b1472b111b62f061fc5e9244aacaa862a1e4</link>
        <description>selftests/exec: test interpreters bound to a &apos;B&apos; entryOne handler, one entry registered disabled, an interpreter per guestarchitecture bound to a file one write at a time. The load program picksone by name per exec:- an aarch64 binary runs the interpreter bound as &quot;first&quot; and a riscv one  the interpreter bound as &quot;second&quot;, from a single entry and a single  handler- unlinking a bound interpreter and putting a different binary in its  place changes nothing, which is what the binding exists for- the entry reports what it bound, under the names it bound them as- a name the entry did not bind fails the exec with -ENOENT rather than  falling back to anything- activating the entry refuses further binding with -EBUSY, a later  disable does not undo that, and an entry registered without &apos;D&apos; never  accepted a &apos;+&apos; write to begin with- a name binds one interpreter, and control characters are refused- the command has to end at the write, bytes past an embedded nul are  refused- an entry binds at most 100 interpreters, the next one is refused with  -ENOSPCThe test interpreter prints its argv[0], which is the path the kernel ranthat copy under, so one binary installed at two paths tells the harnesswhich of them the program picked.Link: https://patch.msgid.link/20260730-work-binfmt_misc-preopen-v1-8-4a0b0da71f16@kernel.orgSigned-off-by: Christian Brauner (Amutable) &lt;brauner@kernel.org&gt;

            List of files:
            /linux/tools/testing/selftests/exec/interp_bind.bpf.c</description>
        <pubDate>Thu, 30 Jul 2026 15:34:10 +0200</pubDate>
        <dc:creator>Christian Brauner &lt;brauner@kernel.org&gt;</dc:creator>
    </item>
</channel>
</rss>
