In the Linux kernel, the following vulnerability has been resolved:
mm/filemap: make MAX_PAGECACHE_ORDER acceptable to xarray
Patch series "mm/filemap: Limit page cache size to that supported by xarray", v2.
Currently, xarray can't support arbitrary page cache size. More details can be found from the WARN_ON() statement in xas_split_alloc(). In our test whose code is attached below, we hit the WARN_ON() on ARM64 system where the base page size is 64KB and huge page size is 512MB. The issue was reported long time ago and some discussions on it can be found here [1].
[1] https://www.spinics.net/lists/linux-xfs/msg75404.html
In order to fix the issue, we need to adjust MAX_PAGECACHE_ORDER to one supported by xarray and avoid PMD-sized page cache if needed. The code changes are suggested by David Hildenbrand.
PATCH[1] adjusts MAX_PAGECACHE_ORDER to that supported by xarray PATCH[2-3] avoids PMD-sized page cache in the synchronous readahead path PATCH[4] avoids PMD-sized page cache for shmem files if needed
Test program ============ # cat test.c #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #include <errno.h> #include <sys/syscall.h> #include <sys/mman.h>
#define TEST_XFS_FILENAME "/tmp/data" #define TEST_SHMEM_FILENAME "/dev/shm/data" #define TEST_MEM_SIZE 0x20000000
int main(int argc, char **argv) { const char *filename; int fd = 0; void *buf = (void *)-1, *p; int pgsize = getpagesize(); int ret;
if (pgsize != 0x10000) { fprintf(stderr, "64KB base page size is required\n"); return -EPERM; }
system("echo force > /sys/kernel/mm/transparent_hugepage/shmem_enabled"); system("rm -fr /tmp/data"); system("rm -fr /dev/shm/data"); system("echo 1 > /proc/sys/vm/drop_caches");
/* Open xfs or shmem file */ filename = TEST_XFS_FILENAME; if (argc > 1 && !strcmp(argv[1], "shmem")) filename = TEST_SHMEM_FILENAME;
fd = open(filename, O_CREAT | O_RDWR | O_TRUNC); if (fd < 0) { fprintf(stderr, "Unable to open <%s>\n", filename); return -EIO; }
/* Extend file size */ ret = ftruncate(fd, TEST_MEM_SIZE); if (ret) { fprintf(stderr, "Error %d to ftruncate()\n", ret); goto cleanup; }
/* Create VMA */ buf = mmap(NULL, TEST_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (buf == (void *)-1) { fprintf(stderr, "Unable to mmap <%s>\n", filename); goto cleanup; }
fprintf(stdout, "mapped buffer at 0x%p\n", buf); ret = madvise(buf, TEST_MEM_SIZE, MADV_HUGEPAGE); if (ret) { fprintf(stderr, "Unable to madvise(MADV_HUGEPAGE)\n"); goto cleanup; }
/* Populate VMA */ ret = madvise(buf, TEST_MEM_SIZE, MADV_POPULATE_WRITE); if (ret) { fprintf(stderr, "Error %d to madvise(MADV_POPULATE_WRITE)\n", ret); goto cleanup; }
/* Punch the file to enforce xarray split */ ret = fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE, TEST_MEM_SIZE - pgsize, pgsize); if (ret) fprintf(stderr, "Error %d to fallocate()\n", ret);
cleanup: if (buf != (void *)-1) munmap(buf, TEST_MEM_SIZE); if (fd > 0) close(fd);
return 0; }
# gcc test.c -o test # cat /proc/1/smaps | grep KernelPageSize | head -n 1 KernelPageSize: 64 kB # ./test shmem : ------------[ cut here ]------------ WARNING: CPU: 17 PID: 5253 at lib/xarray.c:1025 xas_split_alloc+0xf8/0x128 Modules linked in: nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib \ nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct \ nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 \ ip_set nf_tables rfkill nfnetlink vfat fat virtio_balloon \ drm fuse xfs libcrc32c crct10dif_ce ghash_ce sha2_ce sha256_arm64 \ virtio_net sha1_ce net_failover failover virtio_console virtio_blk \ dimlib virtio_mmio CPU: 17 PID: 5253 Comm: test Kdump: loaded Tainted: G W 6.10.0-rc5-gavin+ #12 Hardware name: QEMU KVM Virtual Machine, BIOS edk2-20240524-1.el9 05/24/2024 pstate: 83400005 (Nzcv daif +PAN -UAO +TC ---truncated---
CVSS Details
- CVSS 3.1 Base Score: 5.5
- CVSS 3.1 Vector: (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H)
Covered by Rapid7
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Debian | — | Upgrade linuxNo solution exists | May 15, 2025 | Aug 7, 2024 |
| Redhat_linux | — | No solution existsUpgrade kernel-rtUpgrade kernel | Sep 19, 2024 | Aug 7, 2024 |
| Suse | — | Upgrade kernel-rt_debug-livepatch-develUpgrade reiserfs-kmp-defaultUpgrade dtb-renesasUpgrade kernel-rt-optionalUpgrade kernel-rt_debugUpgrade ocfs2-kmp-defaultUpgrade dlm-kmp-defaultUpgrade cluster-md-kmp-rtUpgrade dtb-allwinnerUpgrade kernel-azure-extraUpgrade kernel-defaultUpgrade dtb-marvellUpgrade dtb-nvidiaUpgrade dtb-xilinxUpgrade kernel-develUpgrade dtb-alteraUpgrade kernel-rt-extraUpgrade cluster-md-kmp-64kbUpgrade kernel-source-vanillaUpgrade kernel-kvmsmall-livepatch-develUpgrade dtb-sprdUpgrade kernel-obs-buildUpgrade kselftests-kmp-azureUpgrade kernel-devel-rtUpgrade kernel-debug-develUpgrade kernel-64kb-optionalUpgrade dtb-appleUpgrade kernel-64kb-develUpgrade kernel-64kb-extraUpgrade ocfs2-kmp-azureUpgrade kernel-default-livepatch-develUpgrade kernel-rt_debug-develUpgrade dlm-kmp-rtUpgrade kernel-docsUpgrade ocfs2-kmp-64kbUpgrade kernel-azureUpgrade kernel-debug-vdsoUpgrade dtb-mediatekUpgrade kernel-debugUpgrade kernel-source-rtUpgrade dtb-hisiliconUpgrade kselftests-kmp-rtUpgrade kernel-default-baseUpgrade kernel-rt-develUpgrade kernel-azure-optionalUpgrade dtb-amdUpgrade dtb-socionextUpgrade kernel-default-optionalUpgrade gfs2-kmp-azureUpgrade reiserfs-kmp-rtUpgrade gfs2-kmp-defaultUpgrade dtb-caviumUpgrade dtb-lgUpgrade cluster-md-kmp-azureUpgrade kernel-symsUpgrade kselftests-kmp-64kbUpgrade kernel-64kbUpgrade kernel-default-extraUpgrade kernel-default-base-rebuildUpgrade kernel-azure-develUpgrade kernel-azure-livepatch-develUpgrade dtb-rockchipUpgrade cluster-md-kmp-defaultUpgrade kernel-syms-rtUpgrade kernel-rtUpgrade kernel-devel-azureUpgrade kernel-default-develUpgrade kernel-sourceUpgrade dtb-exynosUpgrade gfs2-kmp-64kbUpgrade kselftests-kmp-defaultUpgrade dtb-qcomUpgrade kernel-obs-qaUpgrade kernel-kvmsmall-vdsoUpgrade kernel-default-vdsoUpgrade kernel-debug-livepatch-develUpgrade dtb-freescaleUpgrade dtb-broadcomUpgrade kernel-rt_debug-vdsoUpgrade dtb-amazonUpgrade reiserfs-kmp-64kbUpgrade dtb-armUpgrade dlm-kmp-azureUpgrade ocfs2-kmp-rtUpgrade kernel-syms-azureUpgrade kernel-source-azureUpgrade kernel-docs-htmlUpgrade kernel-azure-vdsoUpgrade dtb-amlogicUpgrade dtb-apmUpgrade kernel-kvmsmall-develUpgrade kernel-macrosUpgrade reiserfs-kmp-azureUpgrade kernel-rt-livepatch-develUpgrade kernel-default-livepatchUpgrade kernel-kvmsmallUpgrade dlm-kmp-64kbUpgrade kernel-64kb-livepatch-develUpgrade gfs2-kmp-rtUpgrade kernel-rt-vdsoUpgrade kernel-zfcpdump | Dec 5, 2025 | Oct 8, 2024 |
| Ubuntu | — | Upgrade linux-image-oem-22.04bUpgrade linux-image-6.8.0-1015-oracleUpgrade linux-image-lowlatency-hwe-22.04Upgrade linux-image-nvidia-lowlatency-64kUpgrade linux-image-kvmUpgrade linux-image-generic-hwe-22.04Upgrade linux-image-generic-64k-hwe-22.04Upgrade linux-image-6.8.0-1015-oracle-64kUpgrade linux-image-6.8.0-1018-awsUpgrade linux-image-6.8.0-1017-nvidia-lowlatency-64kUpgrade linux-image-ibm-lts-24.04Upgrade linux-image-nvidia-6.8Upgrade linux-image-6.8.0-48-genericUpgrade linux-image-6.8.0-1016-oemUpgrade linux-image-nvidia-64k-6.8Upgrade linux-image-gcpUpgrade linux-image-6.8.0-1017-azure-fdeUpgrade linux-image-6.8.0-1017-nvidia-lowlatencyUpgrade linux-image-nvidia-hwe-22.04Upgrade linux-image-oem-22.04dUpgrade linux-image-6.8.0-1014-raspiUpgrade linux-image-virtual-hwe-24.04Upgrade linux-image-virtualUpgrade linux-image-generic-hwe-24.04Upgrade linux-image-6.8.0-1013-gkeUpgrade linux-image-awsUpgrade linux-image-oem-24.04Upgrade linux-image-generic-64k-hwe-24.04Upgrade linux-image-gkeUpgrade linux-image-oracleUpgrade linux-image-6.8.0-48-generic-64kUpgrade linux-image-lowlatency-64k-hwe-24.04Upgrade linux-image-generic-lpaeUpgrade linux-image-azureUpgrade linux-image-nvidiaUpgrade linux-image-6.8.0-1017-nvidia-64kUpgrade linux-image-6.8.0-1017-nvidiaUpgrade linux-image-virtual-hwe-22.04Upgrade linux-image-lowlatency-64k-hwe-22.04Upgrade linux-image-6.8.0-1016-gcpUpgrade linux-image-nvidia-64k-hwe-22.04Upgrade linux-image-gkeopUpgrade linux-image-6.8.0-1016-azureUpgrade linux-image-generic-64kUpgrade linux-image-lowlatencyUpgrade linux-image-6.8.0-1014-ibmUpgrade linux-image-6.8.0-48-lowlatency-64kUpgrade linux-image-oem-22.04Upgrade linux-image-6.8.0-1017-azureUpgrade linux-image-6.8.0-1017-gcpUpgrade linux-image-oem-22.04cUpgrade linux-image-oem-22.04aUpgrade linux-image-nvidia-64kUpgrade linux-image-lowlatency-hwe-24.04Upgrade linux-image-oem-24.04aUpgrade linux-image-genericUpgrade linux-image-azure-fdeUpgrade linux-image-lowlatency-64kUpgrade linux-image-nvidia-lowlatencyUpgrade linux-image-gkeop-6.8Upgrade linux-image-6.8.0-1016-azure-fdeUpgrade linux-image-6.8.0-48-lowlatencyUpgrade linux-image-ibm-classicUpgrade linux-image-ibmUpgrade linux-image-oracle-64kUpgrade linux-image-6.8.0-1002-gkeopUpgrade linux-image-raspi | Nov 4, 2024 | Aug 7, 2024 |
Prioritise with Active Threat Intelligence
With curated Threat Intelligence, you can see which vulnerabilities truly put you at risk, prioritize what matters most, and act before attackers do.
Explore Intelligence Hub