In the Linux kernel, the following vulnerability has been resolved:
mm: filemap: fix nr_pages calculation overflow in filemap_map_pages()
When running stress-ng on my Arm64 machine with v7.0-rc3 kernel, I encountered some very strange crash issues showing up as "Bad page state":
" [ 734.496287] BUG: Bad page state in process stress-ng-env pfn:415735fb [ 734.496427] page: refcount:0 mapcount:1 mapping:0000000000000000 index:0x4cf316 pfn:0x415735fb [ 734.496434] flags: 0x57fffe000000800(owner_2|node=1|zone=2|lastcpupid=0x3ffff) [ 734.496439] raw: 057fffe000000800 0000000000000000 dead000000000122 0000000000000000 [ 734.496440] raw: 00000000004cf316 0000000000000000 0000000000000000 0000000000000000 [ 734.496442] page dumped because: nonzero mapcount "
After analyzing this page’s state, it is hard to understand why the mapcount is not 0 while the refcount is 0, since this page is not where the issue first occurred. By enabling the CONFIG_DEBUG_VM config, I can reproduce the crash as well and captured the first warning where the issue appears:
" [ 734.469226] page: refcount:33 mapcount:0 mapping:00000000bef2d187 index:0x81a0 pfn:0x415735c0 [ 734.469304] head: order:5 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0 [ 734.469315] memcg:ffff000807a8ec00 [ 734.469320] aops:ext4_da_aops ino:100b6f dentry name(?):"stress-ng-mmaptorture-9397-0-2736200540" [ 734.469335] flags: 0x57fffe400000069(locked|uptodate|lru|head|node=1|zone=2|lastcpupid=0x3ffff) ...... [ 734.469364] page dumped because: VM_WARN_ON_FOLIO((_Generic((page + nr_pages - 1), const struct page *: (const struct folio *)_compound_head(page + nr_pages - 1), struct page *: (struct folio *)_compound_head(page + nr_pages - 1))) != folio) [ 734.469390] ------------[ cut here ]------------ [ 734.469393] WARNING: ./include/linux/rmap.h:351 at folio_add_file_rmap_ptes+0x3b8/0x468, CPU#90: stress-ng-mlock/9430 [ 734.469551] folio_add_file_rmap_ptes+0x3b8/0x468 (P) [ 734.469555] set_pte_range+0xd8/0x2f8 [ 734.469566] filemap_map_folio_range+0x190/0x400 [ 734.469579] filemap_map_pages+0x348/0x638 [ 734.469583] do_fault_around+0x140/0x198 ...... [ 734.469640] el0t_64_sync+0x184/0x188 "
The code that triggers the warning is: "VM_WARN_ON_FOLIO(page_folio(page + nr_pages - 1) != folio, folio)", which indicates that set_pte_range() tried to map beyond the large folio’s size.
By adding more debug information, I found that 'nr_pages' had overflowed in filemap_map_pages(), causing set_pte_range() to establish mappings for a range exceeding the folio size, potentially corrupting fields of pages that do not belong to this folio (e.g., page->_mapcount).
After above analysis, I think the possible race is as follows:
CPU 0 CPU 1 filemap_map_pages() ext4_setattr() //get and lock folio with old inode->i_size next_uptodate_folio()
....... //shrink the inode->i_size i_size_write(inode, attr->ia_size);
//calculate the end_pgoff with the new inode->i_size file_end = DIV_ROUND_UP(i_size_read(mapping->host), PAGE_SIZE) - 1; end_pgoff = min(end_pgoff, file_end);
...... //nr_pages can be overflowed, cause xas.xa_index > end_pgoff end = folio_next_index(folio) - 1; nr_pages = min(end, end_pgoff) - xas.xa_index + 1;
...... //map large folio filemap_map_folio_range() ...... //truncate folios truncate_pagecache(inode, inode->i_size);
To fix this issue, move the 'end_pgoff' calculation before next_uptodate_folio(), so the retrieved folio stays consistent with the file end to avoid ---truncated---
CVSS Details
- CVSS 3.1 Base Score: 7.8
- CVSS 3.1 Vector: (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
Covered by Rapid7
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Debian | — | Upgrade linux | Jul 23, 2026 | Jul 23, 2026 |
| Redhat_linux | — | No solution exists | Jul 17, 2026 | Apr 24, 2026 |
| Ubuntu | — | Upgrade linux-image-6.8.0-1059-nvidia-lowlatency-64kUpgrade linux-image-nvidia-64kUpgrade linux-image-aws-6.8Upgrade linux-image-aws-64k-6.8Upgrade linux-image-oem-22.04cUpgrade linux-image-azure-fde-6.8Upgrade linux-image-oem-22.04dUpgrade linux-image-6.8.0-1062-azure-fdeUpgrade linux-image-6.8.0-1064-gcpUpgrade linux-image-6.8.0-136-lowlatency-64kUpgrade linux-image-6.8.0-1058-oracleUpgrade linux-image-gcp-64kUpgrade linux-image-azure-fipsUpgrade linux-image-6.8.0-1030-nvidia-tegraUpgrade linux-image-azure-fips-6.8Upgrade linux-image-intel-iot-realtimeUpgrade linux-image-azureUpgrade linux-image-aws-fips-6.8Upgrade linux-image-generic-hwe-22.04Upgrade linux-image-gke-64kUpgrade linux-image-6.8.0-1059-gke-64kUpgrade linux-image-realtime-6.8.1Upgrade linux-image-gcp-fipsUpgrade linux-image-gcp-fips-6.8Upgrade linux-image-virtual-hwe-22.04Upgrade linux-image-gcp-lts-24.04Upgrade linux-image-xilinxUpgrade linux-image-6.8.0-1061-ibmUpgrade linux-image-virtual-6.8Upgrade linux-image-6.8.0-1063-azure-fipsUpgrade linux-image-oem-20.04cUpgrade linux-image-oem-20.04dUpgrade linux-image-oem-22.04bUpgrade linux-image-aws-lts-24.04Upgrade linux-image-raspi-realtimeUpgrade linux-image-6.8.0-1061-aws-64kUpgrade linux-image-gke-6.8Upgrade linux-image-nvidia-6.8Upgrade linux-image-azure-fdeUpgrade linux-image-6.8.0-136-generic-64kUpgrade linux-image-ibm-lts-24.04Upgrade linux-image-6.8.0-136-genericUpgrade linux-image-generic-64k-6.8Upgrade linux-image-nvidia-tegra-rt-6.8Upgrade linux-image-realtimeUpgrade linux-image-lowlatency-64k-hwe-22.04Upgrade linux-image-xilinx-6.8Upgrade linux-image-generic-64kUpgrade linux-image-realtime-hwe-22.04Upgrade linux-image-raspiUpgrade linux-image-intel-iotgUpgrade linux-image-gcpUpgrade linux-image-nvidia-hwe-22.04Upgrade linux-image-nvidia-lowlatency-64k-6.8Upgrade linux-image-nvidia-tegraUpgrade linux-image-raspi-6.8Upgrade linux-image-gcp-64k-6.8Upgrade linux-image-gke-64k-6.8Upgrade linux-image-azure-6.8Upgrade linux-image-kvmUpgrade linux-image-6.8.0-1059-nvidiaUpgrade linux-image-6.8.0-1061-aws-fipsUpgrade linux-image-6.8.0-1063-azureUpgrade linux-image-laptop-23.10Upgrade linux-image-oracle-64k-lts-24.04Upgrade linux-image-6.8.0-1030-nvidia-tegra-rtUpgrade linux-image-oracle-6.8Upgrade linux-image-fips-6.8Upgrade linux-image-oracle-64kUpgrade linux-image-6.8.0-136-lowlatencyUpgrade linux-image-lowlatency-6.8Upgrade linux-image-gcp-64k-lts-24.04Upgrade linux-image-fipsUpgrade linux-image-virtualUpgrade linux-image-6.8.0-1064-gcp-fipsUpgrade linux-image-nvidia-64k-hwe-22.04Upgrade linux-image-6.8.0-2050-raspi-realtimeUpgrade linux-image-generic-lpaeUpgrade linux-image-nvidia-lowlatencyUpgrade linux-image-nvidiaUpgrade linux-image-oracle-lts-24.04Upgrade linux-image-lowlatency-hwe-22.04Upgrade linux-image-genericUpgrade linux-image-nvidia-tegra-rtUpgrade linux-image-oem-22.04Upgrade linux-image-nvidia-lowlatency-6.8Upgrade linux-image-aws-fipsUpgrade linux-image-6.8.0-1059-nvidia-64kUpgrade linux-image-6.8.0-1058-oracle-64kUpgrade linux-image-oracle-64k-6.8Upgrade linux-image-nvidia-tegra-6.8Upgrade linux-image-nvidia-lowlatency-64kUpgrade linux-image-generic-64k-hwe-22.04Upgrade linux-image-azure-lts-24.04Upgrade linux-image-lowlatency-64k-6.8Upgrade linux-image-ibm-classicUpgrade linux-image-6.8.0-1046-gkeopUpgrade linux-image-oem-20.04Upgrade linux-image-generic-6.8Upgrade linux-image-ibm-6.8Upgrade linux-image-oracleUpgrade linux-image-awsUpgrade linux-image-6.8.0-1059-nvidia-lowlatencyUpgrade linux-image-gcp-6.8Upgrade linux-image-azure-fde-lts-24.04Upgrade linux-image-aws-64kUpgrade linux-image-6.8.0-1064-gcp-64kUpgrade linux-image-6.8.0-1061-raspiUpgrade linux-image-6.8.0-1059-gkeUpgrade linux-image-gkeop-6.8Upgrade linux-image-gkeopUpgrade linux-image-xilinx-zynqmpUpgrade linux-image-raspi-realtime-6.8Upgrade linux-image-6.8.0-1061-awsUpgrade linux-image-gkeUpgrade linux-image-6.8.0-1033-xilinxUpgrade linux-image-lowlatency-64kUpgrade linux-image-lowlatencyUpgrade linux-image-oem-22.04aUpgrade linux-image-6.8.0-136-fipsUpgrade linux-image-oem-20.04bUpgrade linux-image-aws-64k-lts-24.04Upgrade linux-image-6.8.1-1056-realtimeUpgrade linux-image-nvidia-64k-6.8Upgrade linux-image-ibm | May 25, 2026 | Apr 24, 2026 |
| Vmware Photon_os | — | Use 'tdnf update' to upgrade all packages to the latest version. | Jun 4, 2026 | Apr 24, 2026 |
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