Subject: CVE-2024-26590: erofs: fix inconsistent per-file compression format

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

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

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

erofs: fix inconsistent per-file compression format

EROFS can select compression algorithms on a per-file basis, and each
per-file compression algorithm needs to be marked in the on-disk
superblock for initialization.

However, syzkaller can generate inconsistent crafted images that use
an unsupported algorithmtype for specific inodes, e.g. use MicroLZMA
algorithmtype even it's not set in `sbi->available_compr_algs`.  This
can lead to an unexpected "BUG: kernel NULL pointer dereference" if
the corresponding decompressor isn't built-in.

Fix this by checking against `sbi->available_compr_algs` for each
m_algorithmformat request.  Incorrect !erofs_sb_has_compr_cfgs preset
bitmap is now fixed together since it was harmless previously.

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

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

	Issue introduced in 5.16 with commit 8f89926290c4 and fixed in 6.1.80 with commit 47467e04816c
	Issue introduced in 5.16 with commit 8f89926290c4 and fixed in 6.6.14 with commit 823ba1d21060
	Issue introduced in 5.16 with commit 8f89926290c4 and fixed in 6.7.2 with commit eed24b816e50
	Issue introduced in 5.16 with commit 8f89926290c4 and fixed in 6.8 with commit 118a8cf504d7

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-26590
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/erofs/decompressor.c
	fs/erofs/zmap.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/47467e04816cb297905c0f09bc2d11ef865942d9
	https://git.kernel.org/stable/c/823ba1d2106019ddf195287ba53057aee33cf724
	https://git.kernel.org/stable/c/eed24b816e50c6cd18cbee0ff0d7218c8fced199
	https://git.kernel.org/stable/c/118a8cf504d7dfa519562d000f423ee3ca75d2c4