{"id":"CVE-2026-99180","state":"PUBLISHED","title":"unicode: free the map after a grace period","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nunicode: free the map after a grace period\n\ngeneric_ci_d_hash() and generic_ci_d_compare() read sb->s_encoding and\ndereference the unicode map while a pathwalk in rcu mode holds nothing\nbut rcu_read_lock(). The filesystems that use them, ext4, f2fs and\ntmpfs, drop the map with utf8_unload() from ->put_super(), which runs\nwhen the last reference to the mount goes away. A lookup that is still\ninside such a filesystem at that point reads a freed map.\n\nWith a pathwalk held up in utf8_casefold_hash() while the last reference\nto a casefolded tmpfs goes away:\n\n  BUG: KASAN: slab-use-after-free in utf8nlookup+0x74c/0x950\n  Read of size 8 at addr ff110001030fe658 by task walker/98\n  Call Trace:\n   <TASK>\n   utf8nlookup+0x74c/0x950\n   utf8byte+0x160/0x1560\n   utf8_casefold_hash+0x167/0x230\n   generic_ci_d_hash+0xdd/0x1c0\n   link_path_walk+0x11ad/0x1d30\n   path_lookupat+0x63/0xb00\n   filename_lookup+0x1f1/0x5b0\n   vfs_statx+0xd7/0x3b0\n  [...]\n  Allocated by task 94:\n   __kmalloc_cache_noprof+0x249/0x560\n   utf8_load+0x4e/0x570\n   shmem_parse_opt_casefold.isra.0+0x92/0x270\n  [...]\n  Freed by task 97:\n   kfree+0x1db/0x5b0\n   shmem_put_super+0x72/0x170\n   generic_shutdown_super+0x14c/0x530\n   kill_anon_super+0x3a/0x60\n   deactivate_locked_super+0x9c/0xf0\n   cleanup_mnt+0x9f/0x130\n\nSo far that has been hard to hit. umount(2) waits for a grace period\nin namespace_unlock() before it drops the mount, so only a mount whose\nlast reference goes away elsewhere, like the close of a file or a chdir\nout of a lazily unmounted directory, can race a walker. So it is\nreachable.\n\nDelay the free until a grace period has passed. The map and the data\ntable it holds a reference to then outlive any pathwalk that found the\nsuperblock before the mount went away. The reference on the data table\nmodule is dropped from the rcu callback as well. utf8-core is built in\nwhenever CONFIG_UNICODE is set, so there is no module exit that would\nhave to wait for the callbacks.\n\nOverlayfs points the s_encoding of an overlay at the map of its first\nlayer without taking a reference of its own. That stays correct. The\nlayer is held by the overlay, so its map is dropped only after the\noverlay is gone.","publishedAt":"2026-10-28T10:35:33.578Z","updatedAt":"2026-10-30T12:42:43.546Z","severity":null,"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"092e14e1479a39157ca01668d43e4649793f39ed","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"6472455f2b015cad43adb790cb63fe1d3cff2f57","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"f96c2731a105d6663c606388f5dc21781e00ade5","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"5d7687b0b71601cc32f1bfd62f56cf5eea3e5a07","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"69a0d6b31d05e856c7335509222f25321e3c69ca","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"2b54d3c971a1e5df3c9b0bcc10311ae6c29e79d8","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"6560c3d9a6925e3747d9ad8463e16010c31ba715","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"a96c5299bd7305eb984377681eb3222a57376405","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/unicode/utf8-core.c","include/linux/unicode.h"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"5.2","status":"affected"},{"version":"0","status":"unaffected","lessThan":"5.2","versionType":"semver"},{"version":"5.10.273","status":"unaffected","lessThanOrEqual":"5.10.*","versionType":"semver"},{"version":"5.15.224","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"6.1.191","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.161","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.115","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.59","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.13","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/unicode/utf8-core.c","include/linux/unicode.h"]}],"references":["https://git.kernel.org/stable/c/092e14e1479a39157ca01668d43e4649793f39ed","https://git.kernel.org/stable/c/6472455f2b015cad43adb790cb63fe1d3cff2f57","https://git.kernel.org/stable/c/f96c2731a105d6663c606388f5dc21781e00ade5","https://git.kernel.org/stable/c/5d7687b0b71601cc32f1bfd62f56cf5eea3e5a07","https://git.kernel.org/stable/c/69a0d6b31d05e856c7335509222f25321e3c69ca","https://git.kernel.org/stable/c/2b54d3c971a1e5df3c9b0bcc10311ae6c29e79d8","https://git.kernel.org/stable/c/6560c3d9a6925e3747d9ad8463e16010c31ba715","https://git.kernel.org/stable/c/a96c5299bd7305eb984377681eb3222a57376405"],"weaknesses":[],"ingestedAt":"2026-10-30T13:02:04.640Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/99xxx/CVE-2026-99180.json","commit":"cb14bf1b43b0c9f05f7f40eae2246263fd430780","baselineCommit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-99180","state":"PUBLISHED","datePublished":"2026-10-28T10:35:33.578Z","dateUpdated":"2026-10-30T12:42:43.546Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2026-09-25T10:25:14.399Z"},"containers":{"cna":{"title":"unicode: free the map after a grace period","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nunicode: free the map after a grace period\n\ngeneric_ci_d_hash() and generic_ci_d_compare() read sb->s_encoding and\ndereference the unicode map while a pathwalk in rcu mode holds nothing\nbut rcu_read_lock(). The filesystems that use them, ext4, f2fs and\ntmpfs, drop the map with utf8_unload() from ->put_super(), which runs\nwhen the last reference to the mount goes away. A lookup that is still\ninside such a filesystem at that point reads a freed map.\n\nWith a pathwalk held up in utf8_casefold_hash() while the last reference\nto a casefolded tmpfs goes away:\n\n  BUG: KASAN: slab-use-after-free in utf8nlookup+0x74c/0x950\n  Read of size 8 at addr ff110001030fe658 by task walker/98\n  Call Trace:\n   <TASK>\n   utf8nlookup+0x74c/0x950\n   utf8byte+0x160/0x1560\n   utf8_casefold_hash+0x167/0x230\n   generic_ci_d_hash+0xdd/0x1c0\n   link_path_walk+0x11ad/0x1d30\n   path_lookupat+0x63/0xb00\n   filename_lookup+0x1f1/0x5b0\n   vfs_statx+0xd7/0x3b0\n  [...]\n  Allocated by task 94:\n   __kmalloc_cache_noprof+0x249/0x560\n   utf8_load+0x4e/0x570\n   shmem_parse_opt_casefold.isra.0+0x92/0x270\n  [...]\n  Freed by task 97:\n   kfree+0x1db/0x5b0\n   shmem_put_super+0x72/0x170\n   generic_shutdown_super+0x14c/0x530\n   kill_anon_super+0x3a/0x60\n   deactivate_locked_super+0x9c/0xf0\n   cleanup_mnt+0x9f/0x130\n\nSo far that has been hard to hit. umount(2) waits for a grace period\nin namespace_unlock() before it drops the mount, so only a mount whose\nlast reference goes away elsewhere, like the close of a file or a chdir\nout of a lazily unmounted directory, can race a walker. So it is\nreachable.\n\nDelay the free until a grace period has passed. The map and the data\ntable it holds a reference to then outlive any pathwalk that found the\nsuperblock before the mount went away. The reference on the data table\nmodule is dropped from the rcu callback as well. utf8-core is built in\nwhenever CONFIG_UNICODE is set, so there is no module exit that would\nhave to wait for the callbacks.\n\nOverlayfs points the s_encoding of an overlay at the map of its first\nlayer without taking a reference of its own. That stays correct. The\nlayer is held by the overlay, so its map is dropped only after the\noverlay is gone."}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"092e14e1479a39157ca01668d43e4649793f39ed","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"6472455f2b015cad43adb790cb63fe1d3cff2f57","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"f96c2731a105d6663c606388f5dc21781e00ade5","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"5d7687b0b71601cc32f1bfd62f56cf5eea3e5a07","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"69a0d6b31d05e856c7335509222f25321e3c69ca","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"2b54d3c971a1e5df3c9b0bcc10311ae6c29e79d8","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"6560c3d9a6925e3747d9ad8463e16010c31ba715","versionType":"git"},{"version":"b886ee3e778ec2ad43e276fd378ab492cf6819b7","status":"affected","lessThan":"a96c5299bd7305eb984377681eb3222a57376405","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/unicode/utf8-core.c","include/linux/unicode.h"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"5.2","status":"affected"},{"version":"0","status":"unaffected","lessThan":"5.2","versionType":"semver"},{"version":"5.10.273","status":"unaffected","lessThanOrEqual":"5.10.*","versionType":"semver"},{"version":"5.15.224","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"6.1.191","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.161","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.115","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.59","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.13","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["fs/unicode/utf8-core.c","include/linux/unicode.h"]}],"references":[{"url":"https://git.kernel.org/stable/c/092e14e1479a39157ca01668d43e4649793f39ed"},{"url":"https://git.kernel.org/stable/c/6472455f2b015cad43adb790cb63fe1d3cff2f57"},{"url":"https://git.kernel.org/stable/c/f96c2731a105d6663c606388f5dc21781e00ade5"},{"url":"https://git.kernel.org/stable/c/5d7687b0b71601cc32f1bfd62f56cf5eea3e5a07"},{"url":"https://git.kernel.org/stable/c/69a0d6b31d05e856c7335509222f25321e3c69ca"},{"url":"https://git.kernel.org/stable/c/2b54d3c971a1e5df3c9b0bcc10311ae6c29e79d8"},{"url":"https://git.kernel.org/stable/c/6560c3d9a6925e3747d9ad8463e16010c31ba715"},{"url":"https://git.kernel.org/stable/c/a96c5299bd7305eb984377681eb3222a57376405"}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-10-30T12:42:43.546Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.2","versionEndExcluding":"5.10.273"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.2","versionEndExcluding":"5.15.224"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.2","versionEndExcluding":"6.1.191"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.2","versionEndExcluding":"6.6.161"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.2","versionEndExcluding":"6.12.115"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.2","versionEndExcluding":"6.18.59"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.2","versionEndExcluding":"7.2.13"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"5.2","versionEndExcluding":"7.3"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}}}}}