On Mon, 2018-08-13 at 20:02 +0800, Zhang Yi wrote:
> This patch prevents a user mapping an illegal vma range that is larger
> than a dax device physical resource.
> 
> When qemu maps the dax device for virtual nvdimm's backend device, the
> v-nvdimm label area is defined at the end of mapped range. By using an
> illegal size that exceeds the range of the device dax, it will trigger a
> fault with qemu.
> 
> Signed-off-by: Zhang Yi <[email protected]>
> ---
>  drivers/dax/device.c | 29 +++++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
> 

Looks good to me:
Reviewed-by: Vishal Verma <[email protected]>

> diff --git a/drivers/dax/device.c b/drivers/dax/device.c
> index 108c37f..6fe8c30 100644
> --- a/drivers/dax/device.c
> +++ b/drivers/dax/device.c
> @@ -177,6 +177,33 @@ static const struct attribute_group 
> *dax_attribute_groups[] = {
>       NULL,
>  };
>  
> +static int check_vma_range(struct dev_dax *dev_dax, struct vm_area_struct 
> *vma,
> +             const char *func)
> +{
> +     struct device *dev = &dev_dax->dev;
> +     struct resource *res;
> +     unsigned long size;
> +     int ret, i;
> +
> +     if (!dax_alive(dev_dax->dax_dev))
> +             return -ENXIO;
> +
> +     size = vma->vm_end - vma->vm_start + (vma->vm_pgoff << PAGE_SHIFT);
> +     ret = -EINVAL;
> +     for (i = 0; i < dev_dax->num_resources; i++) {
> +             res = &dev_dax->res[i];
> +             if (size > resource_size(res)) {
> +                     dev_info_ratelimited(dev,
> +                             "%s: %s: fail, vma range overflow\n",
> +                             current->comm, func);
> +                     ret = -EINVAL;
> +                     continue;
> +             } else
> +                     return 0;
> +     }
> +     return ret;
> +}
> +
>  static int check_vma(struct dev_dax *dev_dax, struct vm_area_struct *vma,
>               const char *func)
>  {
> @@ -469,6 +496,8 @@ static int dax_mmap(struct file *filp, struct 
> vm_area_struct *vma)
>        */
>       id = dax_read_lock();
>       rc = check_vma(dev_dax, vma, __func__);
> +     if (!rc)
> +             rc = check_vma_range(dev_dax, vma, __func__);
>       dax_read_unlock(id);
>       if (rc)
>               return rc;
_______________________________________________
Linux-nvdimm mailing list
[email protected]
https://lists.01.org/mailman/listinfo/linux-nvdimm

Reply via email to