]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: fix invalid leaf access in btrfs_quota_enable() if ref key not found
authorFilipe Manana <fdmanana@suse.com>
Wed, 4 Feb 2026 17:15:53 +0000 (17:15 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 26 Feb 2026 23:01:37 +0000 (15:01 -0800)
[ Upstream commit ecb7c2484cfc83a93658907580035a8adf1e0a92 ]

If btrfs_search_slot_for_read() returns 1, it means we did not find any
key greater than or equals to the key we asked for, meaning we have
reached the end of the tree and therefore the path is not valid. If
this happens we need to break out of the loop and stop, instead of
continuing and accessing an invalid path.

Fixes: 5223cc60b40a ("btrfs: drop the path before adding qgroup items when enabling qgroups")
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/qgroup.c

index c634e011405148f4ccfd2d7e7405da50c43ec4a5..bed9d1c11c67a0aaf10cdbc8c459d46d40dd338b 100644 (file)
@@ -1137,11 +1137,14 @@ int btrfs_quota_enable(struct btrfs_fs_info *fs_info,
                        }
                        if (ret > 0) {
                                /*
-                                * Shouldn't happen, but in case it does we
-                                * don't need to do the btrfs_next_item, just
-                                * continue.
+                                * Shouldn't happen because the key should still
+                                * be there (return 0), but in case it does it
+                                * means we have reached the end of the tree -
+                                * there are no more leaves with items that have
+                                * a key greater than or equals to @found_key,
+                                * so just stop the search loop.
                                 */
-                               continue;
+                               break;
                        }
                }
                ret = btrfs_next_item(tree_root, path);