On Tue, Jul 05, 2022 at 03:06:49PM -0300, Jason Gunthorpe wrote: > On Tue, Jul 05, 2022 at 12:05:28PM +0300, Dan Carpenter wrote: > > The casting on this makes the integer overflow check slightly wrong. > > "len" is an unsigned long. "*pos" and "requested_length" are signed > > long longs. Imagine "len" is ULONG_MAX and "*pos" is 2. > > "ULONG_MAX + 2 = 1". > > I wonder if this can happen, len is a kernel controlled value bounded > by a memory allocation.. > Oh. Smatch uses a model which says that all read/writes come from vfs_write(). The problem with tracking kernel read/writes is that recursion is tricky. So Smatch just deletes those from the DB. > > Fixes: b0eed085903e ("hisi_acc_vfio_pci: Add support for VFIO live migration") > > Signed-off-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> > > --- > > This code was copy and pasted from drivers/vfio/pci/mlx5/main.c, so it > should be fixed too Sure. I created a static checker warning for this type of thing but it didn't catch the issue in drivers/vfio/pci/mlx5/main.c because Smatch says that the bug is impossible. Which is true. Smatch doesn't really parse rw_verify_area() accurately. I just hard coded that function as accepting values 0-1000000000 for both *ppos and count. regards, dan carpenter