Subject: CVE-2024-41078: btrfs: qgroup: fix quota root leak after quota disable failure

From: Greg Kroah-Hartman <[email-masked]>

Description
===========

In the Linux kernel, the following vulnerability has been resolved:

btrfs: qgroup: fix quota root leak after quota disable failure

If during the quota disable we fail when cleaning the quota tree or when
deleting the root from the root tree, we jump to the 'out' label without
ever dropping the reference on the quota root, resulting in a leak of the
root since fs_info->quota_root is no longer pointing to the root (we have
set it to NULL just before those steps).

Fix this by always doing a btrfs_put_root() call under the 'out' label.
This is a problem that exists since qgroups were first added in 2012 by
commit bed92eae26cc ("Btrfs: qgroup implementation and prototypes"), but
back then we missed a kfree on the quota root and free_extent_buffer()
calls on its root and commit root nodes, since back then roots were not
yet reference counted.

The Linux kernel CVE team has assigned CVE-2024-41078 to this issue.

Affected and fixed versions
===========================

	Fixed in 5.10.223 with commit 94818bdb00ef
	Fixed in 5.15.164 with commit 8a69529f2259
	Fixed in 6.1.101 with commit 5ef3961682e5
	Fixed in 6.6.42 with commit f88aeff5a173
	Fixed in 6.9.11 with commit 7dd6a5b96157
	Fixed in 6.10 with commit a7e4c6a3031c

Please see https://www.kernel.org for a full list of currently supported
kernel versions by the kernel community.

Unaffected versions might change over time as fixes are backported to
older supported kernel versions.  The official CVE entry at
	https://cve.org/CVERecord/?id=CVE-2024-41078
will be updated if fixes are backported, please check that for the most
up to date information about this issue.

Affected files
==============

The file(s) affected by this issue are:
	fs/btrfs/qgroup.c

Mitigation
==========

The Linux kernel CVE team recommends that you update to the latest
stable kernel version for this, and many other bugfixes.  Individual
changes are never tested alone, but rather are part of a larger kernel
release.  Cherry-picking individual commits is not recommended or
supported by the Linux kernel community at all.  If however, updating to
the latest release is impossible, the individual changes to resolve this
issue can be found at these commits:
	https://git.kernel.org/stable/c/94818bdb00ef34a996a06aa63d11f591074cb757
	https://git.kernel.org/stable/c/8a69529f22590b67bb018de9acbcf94abc8603cf
	https://git.kernel.org/stable/c/5ef3961682e5310f2221bae99bcf9f5d0f4b0d51
	https://git.kernel.org/stable/c/f88aeff5a173e8ba3133314eb4b964236ef3589d
	https://git.kernel.org/stable/c/7dd6a5b96157a21245566b21fd58276a214357ff
	https://git.kernel.org/stable/c/a7e4c6a3031c74078dba7fa36239d0f4fe476c53