mirror of
https://github.com/torvalds/linux.git
synced 2026-09-14 16:10:02 +02:00
The variable-sized buffer buf in struct btrfs_ioctl_search_args_v2 is
declared as __u64[], but it holds a packed byte stream of search results,
where all offsets into the buffer are in bytes.
Declaring buf as __u64[] makes it easy for user space to write incorrect
pointer arithmetic: adding a byte offset directly to a __u64 pointer
scales the offset by 8, landing at byte position offset*8 instead of
offset.
This recently caused an infinite loop in btrfs-progs: the accessor read
all-zero data from misaddressed items, which fed zeroed search keys back
into the ioctl loop and spun forever. The issue was worked around at the
time by disabling TREE_SEARCH_V2 entirely in btrfs-progs (d73e69824854:
"btrfs-progs: temporarily disable usage of v2 of search tree ioctl").
The kernel side already treats buf as a byte buffer, so change the
declaration to __u8[] to match the actual semantics and prevent similar
misuse in user space. The change is ABI compatible: both the structure size
and alignment are unchanged.
Fixes:
|
||
|---|---|---|
| .. | ||
| asm-generic | ||
| cxl | ||
| drm | ||
| fwctl | ||
| linux | ||
| misc | ||
| mtd | ||
| rdma | ||
| regulator | ||
| scsi | ||
| sound | ||
| video | ||
| xen | ||
| Kbuild | ||