Subject: CVE-2024-35797: mm: cachestat: fix two shmem bugs

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

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

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

mm: cachestat: fix two shmem bugs

When cachestat on shmem races with swapping and invalidation, there
are two possible bugs:

1) A swapin error can have resulted in a poisoned swap entry in the
   shmem inode's xarray. Calling get_shadow_from_swap_cache() on it
   will result in an out-of-bounds access to swapper_spaces[].

   Validate the entry with non_swap_entry() before going further.

2) When we find a valid swap entry in the shmem's inode, the shadow
   entry in the swapcache might not exist yet: swap IO is still in
   progress and we're before __remove_mapping; swapin, invalidation,
   or swapoff have removed the shadow from swapcache after we saw the
   shmem swap entry.

   This will send a NULL to workingset_test_recent(). The latter
   purely operates on pointer bits, so it won't crash - node 0, memcg
   ID 0, eviction timestamp 0, etc. are all valid inputs - but it's a
   bogus test. In theory that could result in a false "recently
   evicted" count.

   Such a false positive wouldn't be the end of the world. But for
   code clarity and (future) robustness, be explicit about this case.

   Bail on get_shadow_from_swap_cache() returning NULL.

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

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

	Issue introduced in 6.5 with commit cf264e1329fb and fixed in 6.6.24 with commit b79f9e1ff27c
	Issue introduced in 6.5 with commit cf264e1329fb and fixed in 6.7.12 with commit d962f6c58345
	Issue introduced in 6.5 with commit cf264e1329fb and fixed in 6.8.3 with commit 24a0e73d5444
	Issue introduced in 6.5 with commit cf264e1329fb and fixed in 6.9 with commit d5d39c707a4c

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-35797
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:
	mm/filemap.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/b79f9e1ff27c994a4c452235ba09e672ec698e23
	https://git.kernel.org/stable/c/d962f6c583458037dc7e529659b2b02b9dd3d94b
	https://git.kernel.org/stable/c/24a0e73d544439bb9329fbbafac44299e548a677
	https://git.kernel.org/stable/c/d5d39c707a4cf0bcc84680178677b97aa2cb2627