On Thu, 8 Jan 2026, Ziming Du wrote: > From: Yongqiang Liu > > When the value of *ppos over the INT_MAX, the pos is over set to a > negative value which will be passed to get_user() or > pci_user_write_config_dword(). Unexpected behavior such as a soft lockup > will happen as follows: > > watchdog: BUG: soft lockup - CPU#0 stuck for 130s! [syz.3.109:3444] > RIP: 0010:_raw_spin_unlock_irq+0x17/0x30 > Call Trace: > > pci_user_write_config_dword+0x126/0x1f0 > proc_bus_pci_write+0x273/0x470 > proc_reg_write+0x1b6/0x280 > do_iter_write+0x48e/0x790 > vfs_writev+0x125/0x4a0 > __x64_sys_pwritev+0x1e2/0x2a0 > do_syscall_64+0x59/0x110 > entry_SYSCALL_64_after_hwframe+0x78/0xe2 > > Fix this by using unsigned int for the pos. > > Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") > Signed-off-by: Yongqiang Liu > Signed-off-by: Ziming Du > --- > drivers/pci/proc.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c > index 9348a0fb8084..2d51b26edbe7 100644 > --- a/drivers/pci/proc.c > +++ b/drivers/pci/proc.c > @@ -113,10 +113,14 @@ static ssize_t proc_bus_pci_write(struct file *file, const char __user *buf, > { > struct inode *ino = file_inode(file); > struct pci_dev *dev = pde_data(ino); > - int pos = *ppos; > + int pos; > int size = dev->cfg_size; > int cnt, ret; > > + if (*ppos > INT_MAX) > + return -EINVAL; > + pos = *ppos; > + > ret = security_locked_down(LOCKDOWN_PCI_ACCESS); > if (ret) > return ret; > Reviewed-by: Ilpo Järvinen With the note that proc_bus_pci_read() and proc_bus_pci_write() diverge in handling > INT_MAX values and that feels unjustified (but there's not this same problem on the read side I guess so if the read side is made the same as the write side, it would be better to do that in another patch). -- i.