Potential NULL pointer dereference in radeon_ttm_tt_populate

Shaobo He shaobo at cs.utah.edu
Tue Mar 19 20:01:58 UTC 2019


 > See here:
 > #if IS_ENABLED(CONFIG_AGP)
 >          if (rdev->flags & RADEON_IS_AGP) {
 >                  return ttm_agp_tt_populate(ttm, ctx);
 >          }
 > #endif
 >

This code appears to be after the potential location of NULL pointer dereference 
that I pointed out. Please see,

```
	if (slave && ttm->sg) {
		drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
					   gtt->ttm.dma_address,ttm->num_pages);
		ttm->state = tt_unbound;
		return 0;
	}
```
The argument expression `gtt->ttm.dma_address` is the potentially offending code 
if `gtt` is NULL.

Shaobo
On 3/19/19 12:28 PM, Christian König wrote:
>> ... or the backend methods is not `radeon_backend_func`.
> That's the case when it is an AGP backend.
> 
>> Moreover, could you point out the check of such case before the offending code?
> 
> See here:
> #if IS_ENABLED(CONFIG_AGP)
>          if (rdev->flags & RADEON_IS_AGP) {
>                  return ttm_agp_tt_populate(ttm, ctx);
>          }
> #endif
> 
> 
>> Meaning the check of whether `ttm` is an AGP ttm?
> Well exactly that's the point, we never check that the ttm structure is an AGP ttm.
> 
> We check if the device is an AGP device and if that's the case then the ttm 
> structure must be an AGP structure as well.
> 
> Regards,
> Christian.
> 
> 
> Am 19.03.19 um 17:46 schrieb Shaobo He:
>> Hi Christian,
>>
>> Thank you very much for your reply. I'm a little confused here so I really 
>> appreciate if you could clarify it more.
>>
>> For example, I don't understand why the condition of function 
>> `radeon_ttm_tt_to_gtt` returning NULL is the argument being an AGP ttm. Based 
>> on its definition, it returns NULL when the argument is NULL or the backend 
>> methods is not `radeon_backend_func`. Is there any correlation that I missed 
>> here?
>>
>> Moreover, could you point out the check of such case before the offending 
>> code? Meaning the check of whether `ttm` is an AGP ttm?
>>
>> Best,
>> Shaobo
>> On 2019/3/19 3:16, Christian König wrote:
>>> Hi Shaobo,
>>>
>>> that question came up a couple of times now. And the answer is: No, there 
>>> can't be a NULL pointer dereference.
>>>
>>> The function radeon_ttm_tt_to_gtt returns NULL only when it is an AGP ttm 
>>> structure, and that case is checked right before the offending code.
>>>
>>> Unfortunately I don't see how an automated code checker should ever be able 
>>> to figure that out by itself.
>>>
>>> Regards,
>>> Christian.
>>>
>>> Am 18.03.19 um 21:58 schrieb Shaobo He:
>>>> Hello everyone,
>>>>
>>>> My name is Shaobo He and I am a graduate student at University of Utah. I am 
>>>> using a static analysis tool to search for null pointer dereferences and 
>>>> came across a potentially invalid memory access in the file 
>>>> drivers/gpu/drm/radeon/radeon_ttm.c: in function `radeon_ttm_tt_populate`, 
>>>> function `radeon_ttm_tt_to_gtt` can return a NULL pointer which is 
>>>> dereferenced by the call to `drm_prime_sg_to_page_addr_arrays`.
>>>>
>>>> Please let me know if it makes sense. I am looking forward to your reply.
>>>>
>>>> Best,
>>>> Shaobo
>>>> _______________________________________________
>>>> amd-gfx mailing list
>>>> amd-gfx at lists.freedesktop.org
>>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list