CVE-2026-64322

udf: validate sparing table length as an entry count, not a byte count

State
Published
Severity
7.8 High
Published
Jul 25, 2026
Updated
Oct 19, 2026
Reserved
Jul 19, 2026

Read the record on cve.org

Description

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

udf: validate sparing table length as an entry count, not a byte count

udf_load_sparable_map() accepts a sparing table when

sizeof(*st) + le16_to_cpu(st->reallocationTableLen) > sb->s_blocksize

is false, i.e. it treats reallocationTableLen as a number of BYTES that must fit in the block. But the table is walked as an array of 8-byte sparingEntry elements:

for (i = 0; i < le16_to_cpu(st->reallocationTableLen); i++) { struct sparingEntry *entry = &st->mapEntry[i]; ... entry->origLocation ... }

in udf_get_pblock_spar15() and udf_relocate_blocks(). A reallocationTableLen of N therefore passes the check whenever sizeof(*st) + N <= blocksize, yet the consumers index sizeof(*st) + N * sizeof(struct sparingEntry) bytes -- up to ~8x the block. On a crafted UDF image this is an out-of-bounds read in udf_get_pblock_spar15(); udf_relocate_blocks() additionally feeds the same length to udf_update_tag(), whose crc_itu_t() reads far past the block, and its memmove() through st->mapEntry[] is an out-of-bounds write.

Validate reallocationTableLen as the entry count it is, with struct_size().

Scores

CVSSScoreVectorSource
3.17.8 HighCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HLinux

Weaknesses

Affected Products

ProductVersions
LinuxLinux
  • 1df2ae31c724e57be9d7ac00d78db8a5dabdd050 to before eeb0f3e193f8e523d03e4c9e084f6b4875f50e8eAffected
  • 1df2ae31c724e57be9d7ac00d78db8a5dabdd050 to before 0a9b79a951cfd70a9d31ca01ae2d08a20bb730e9Affected
  • 1df2ae31c724e57be9d7ac00d78db8a5dabdd050 to before 2d726135099313958f8975532a2e15322ff150ceAffected
  • 1df2ae31c724e57be9d7ac00d78db8a5dabdd050 to before 7285276aa50d2839afb5957ffd491ad282dc8f72Affected
  • 1df2ae31c724e57be9d7ac00d78db8a5dabdd050 to before 2a219acb2ce674d99bbd1b7b35ed8c384dac7200Affected
  • 1df2ae31c724e57be9d7ac00d78db8a5dabdd050 to before 04f4599a9efb90992d072a814960edf0cd62805dAffected
  • 1df2ae31c724e57be9d7ac00d78db8a5dabdd050 to before 7f7774b9da0ef17b87bfa238cf966ad0b3376150Affected
  • 1df2ae31c724e57be9d7ac00d78db8a5dabdd050 to before 3ec997bd5508e9b25210b5bbec89031629cdb093Affected
  • e240873cb4a9fd18de60a817100a96fe670d4359Affected
  • 9ae30e324a96d0328a575329d7a95a09b3318601Affected
  • b1c5701ad6b3e5d21d16f65475651cfaaa41e7aaAffected
  • a9f1af04f086656246f30354fb4564ce3b08c4a0Affected
  • 4836ee563d65bb492f907cbe267a5761b9693e4dAffected
  • 2.6.32.60 to before 2.6.33Affected
  • 2.6.34.14 to before 2.6.35Affected
  • 3.0.37 to before 3.1Affected
  • 3.2.23 to before 3.3Affected
  • 3.4.5 to before 3.5Affected
LinuxLinux
  • 3.5Affected
  • before 3.5Not affected
  • 5.10.261 through 5.10.*Not affected
  • 5.15.212 through 5.15.*Not affected
  • 6.1.178 through 6.1.*Not affected
  • 6.6.145 through 6.6.*Not affected
  • 6.12.96 through 6.12.*Not affected
  • 6.18.39 through 6.18.*Not affected
  • 7.1.4 through 7.1.*Not affected
  • 7.2 and laterNot affected

References

Every record here comes from the CVE Program’s CVE List. © 1999–2026 The MITRE Corporation. CVE is a registered trademark of The MITRE Corporation. The records are reproduced under the CVE Program terms of use.