On Mon, Jul 10, 2023 at 07:31:25PM -0700, Yi Liu wrote:

> @@ -1311,29 +1296,17 @@ static int vfio_pci_ioctl_get_pci_hot_reset_info(
>       ret = vfio_pci_for_each_slot_or_bus(vdev->pdev, vfio_pci_fill_devs,
>                                           &fill, slot);
>       mutex_unlock(&vdev->vdev.dev_set->lock);
> +     if (ret)
> +             return ret;
>  
> -     /*
> -      * If a device was removed between counting and filling, we may come up
> -      * short of fill.max.  If a device was added, we'll have a return of
> -      * -EAGAIN above.
> -      */
> -     if (!ret) {
> -             hdr.count = fill.cur;
> -             hdr.flags = fill.flags;
> -     }
> -
> -reset_info_exit:
> +     hdr.count = fill.count;
> +     hdr.flags = fill.flags;
>       if (copy_to_user(arg, &hdr, minsz))
> -             ret = -EFAULT;
> -
> -     if (!ret) {
> -             if (copy_to_user(&arg->devices, devices,
> -                              hdr.count * sizeof(*devices)))
> -                     ret = -EFAULT;
> -     }
> +             return -EFAULT;
>  
> -     kfree(devices);
> -     return ret;
> +     if (fill.count != fill.devices - arg->devices)
> +             return -ENOSPC;

This should be > right? The previous code returned ENOSPC only if
their were more devices than requested, not less.

Jason

Reply via email to