]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: fix leaf leak in an error path in btrfs_del_items()
authorFilipe Manana <fdmanana@suse.com>
Thu, 13 Nov 2025 12:52:45 +0000 (12:52 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Dec 2025 13:03:16 +0000 (14:03 +0100)
[ Upstream commit e7dd1182fcedee7c6097c9f49eba8de94a4364e3 ]

If the call to btrfs_del_leaf() fails we return without decrementing the
extra ref we took on the leaf, therefore leaking it. Fix this by ensuring
we drop the ref count before returning the error.

Fixes: 751a27615dda ("btrfs: do not BUG_ON() on tree mod log failures at btrfs_del_ptr()")
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/ctree.c

index 561658aca018b4b94f1c6ef97490a729b8899f01..6e053caa6e101b8dd50fab18e109d40263620708 100644 (file)
@@ -4566,9 +4566,9 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
                        if (btrfs_header_nritems(leaf) == 0) {
                                path->slots[1] = slot;
                                ret = btrfs_del_leaf(trans, root, path, leaf);
+                               free_extent_buffer(leaf);
                                if (ret < 0)
                                        return ret;
-                               free_extent_buffer(leaf);
                                ret = 0;
                        } else {
                                /* if we're still in the path, make sure