]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
binfmt_misc: restore write access when removing an entry
authorChristian Brauner <brauner@kernel.org>
Fri, 10 Jul 2026 09:33:02 +0000 (11:33 +0200)
committerChristian Brauner <brauner@kernel.org>
Tue, 28 Jul 2026 13:50:26 +0000 (15:50 +0200)
Registering an entry with the MISC_FMT_OPEN_FILE flag opens the
interpreter via open_exec() which denies write access to it for as
long as the entry exists. Removing the entry closes the interpreter
file via filp_close() but never restores write access, leaving the
inode's i_writecount permanently negative. Opening the interpreter
for writing keeps failing with ETXTBSY long after the entry is gone
until the inode is evicted from the inode cache.

Commit 90f601b497d7 ("binfmt_misc: restore write access before
closing files opened by open_exec()") fixed the same imbalance in the
error path of bm_register_write() but the actual removal path has
been leaking the write denial since the introduction of the flag.

Restore write access in put_binfmt_handler() before closing the
interpreter file.

Link: https://patch.msgid.link/20260710-work-binfmt_misc-locking-v3-1-a162f7cb58d6@kernel.org
Fixes: 948b701a607f ("binfmt_misc: add persistent opened binary handler for containers")
Cc: stable@vger.kernel.org
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
fs/binfmt_misc.c

index 47aeb2b68d3e5eb534552546cf1f50749f21b3e1..adab06d18550998bca4372251ab23dd900ddb378 100644 (file)
@@ -162,8 +162,10 @@ static Node *get_binfmt_handler(struct binfmt_misc *misc,
 static void put_binfmt_handler(Node *e)
 {
        if (refcount_dec_and_test(&e->users)) {
-               if (e->flags & MISC_FMT_OPEN_FILE)
+               if (e->flags & MISC_FMT_OPEN_FILE) {
+                       exe_file_allow_write_access(e->interp_file);
                        filp_close(e->interp_file, NULL);
+               }
                kfree(e);
        }
 }