<div dir="ltr"><a class="gmail_plusreply" id="plusReplyChip-0" href="mailto:jannh@google.com" tabindex="-1">+Jann Horn</a> for his thoughts<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Apr 11, 2024 at 12:25 PM Christian König <<a href="mailto:christian.koenig@amd.com">christian.koenig@amd.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Am 11.04.24 um 05:28 schrieb xinhui pan:<br>
> Ensure there is no address overlapping.<br>
><br>
> Reported-by: Vlad Stolyarov <<a href="mailto:hexed@google.com" target="_blank">hexed@google.com</a>><br>
> Signed-off-by: xinhui pan <<a href="mailto:xinhui.pan@amd.com" target="_blank">xinhui.pan@amd.com</a>><br>
> ---<br>
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 6 ++++++<br>
>   1 file changed, 6 insertions(+)<br>
><br>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c<br>
> index 8af3f0fd3073..f1315a854192 100644<br>
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c<br>
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c<br>
> @@ -1852,6 +1852,12 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,<br>
>       LIST_HEAD(removed);<br>
>       uint64_t eaddr;<br>
>   <br>
> +     /* validate the parameters */<br>
> +     if (saddr & ~PAGE_MASK || size & ~PAGE_MASK)<br>
> +             return -EINVAL;<br>
<br>
Well as general rule: *never* use PAGE_MASK and other PAGE_* macros <br>
here. This is GPUVM and not related to the CPUVM space.<br>
<br>
> +     if (saddr + size <= saddr)<br>
> +             return -EINVAL;<br>
> +<br>
<br>
Mhm, so basically size is not checked for a wraparound?<br>
<br>
>       eaddr = saddr + size - 1;<br>
>       saddr /= AMDGPU_GPU_PAGE_SIZE;<br>
>       eaddr /= AMDGPU_GPU_PAGE_SIZE;<br>
<br>
If that's the case then I would rather check for saddr < eaddr here.<br>
<br>
But that actually shouldn't matter since this code here:<br>
<br>
         /* Now gather all removed mappings */<br>
         tmp = amdgpu_vm_it_iter_first(&vm->va, saddr, eaddr);<br>
         while (tmp) {<br>
<br>
Then shouldn't return anything, so the operation is basically a NO-OP then.<br>
<br>
Regards,<br>
Christian.<br>
</blockquote></div>