mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
PCI/sysfs: Reject unaligned resource I/O port accesses
pci_resource_io() validates that off+count stays within the BAR's range but never checks that the resulting port is aligned to the access size. A pwrite64()/pread64() on a resourceN file with an odd offset and count=2 or count=4 reaches outw()/outl() with a misaligned address. On arm64 this becomes a store/load to a Device-memory mapping (PCI_IOBASE + port), which architecturally requires natural alignment, causing an alignment fault and kernel oops. Reject misaligned accesses before they reach the low-level accessor. Reported-by: syzbot+7134530b25073b4ef373@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=7134530b25073b4ef373 Signed-off-by: Deepanshu Kartikey <kartikey406@gmail.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Tested-by: Rihyeon Kim <rihyeon8648@gmail.com> Acked-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com> Link: https://patch.msgid.link/20260809045946.15638-1-kartikey406@gmail.com
This commit is contained in:
parent
af5ca2d751
commit
c6479aac4f
|
|
@ -1212,6 +1212,9 @@ static ssize_t pci_resource_io(struct file *filp, struct kobject *kobj,
|
|||
if (port + count - 1 > pci_resource_end(pdev, bar))
|
||||
return -EINVAL;
|
||||
|
||||
if (!IS_ALIGNED(port, count))
|
||||
return -EINVAL;
|
||||
|
||||
switch (count) {
|
||||
case 1:
|
||||
if (write)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user