[PATCH] drm: Don't free a struct never allocated by drm_gem_fb_init()
Andrzej Pietrasiewicz
andrzej.p at collabora.com
Thu Apr 16 11:35:50 UTC 2020
W dniu 15.04.2020 o 20:33, Daniel Vetter pisze:
> On Wed, Apr 15, 2020 at 7:19 PM Andrzej Pietrasiewicz
> <andrzej.p at collabora.com> wrote:
>>
>> drm_gem_fb_init() is passed the fb and never allocates it, so it should be
>> not the one freeing it. As it is now the second call to kfree() is possible
>> with the same fb. Coverity reported the following:
>>
>> *** CID 1492613: Memory - corruptions (USE_AFTER_FREE)
>> /drivers/gpu/drm/drm_gem_framebuffer_helper.c: 230 in drm_gem_fb_create_with_funcs()
>> 224 fb = kzalloc(sizeof(*fb), GFP_KERNEL);
>> 225 if (!fb)
>> 226 return ERR_PTR(-ENOMEM);
>> 227
>> 228 ret = drm_gem_fb_init_with_funcs(dev, fb, file, mode_cmd, funcs);
>> 229 if (ret) {
>> vvv CID 1492613: Memory - corruptions (USE_AFTER_FREE)
>> vvv Calling "kfree" frees pointer "fb" which has already been freed. [Note: The source code implementation of the function has been overridden by a user model.]
>> 230 kfree(fb);
>> 231 return ERR_PTR(ret);
>> 232 }
>> 233
>> 234 return fb;
>> 235 }
>>
>> drm_gem_fb_init_with_funcs() calls drm_gem_fb_init()
>> drm_gem_fb_init() calls kfree(fb)
>>
>> Reported-by: coverity-bot <keescook+coverity-bot at chromium.org>
>> Addresses-Coverity-ID: 1492613 ("Memory - corruptions")
>> Fixes: f2b816d78a94 ("drm/core: Allow drivers allocate a subclass of struct drm_framebuffer")
>> Signed-off-by: Andrzej Pietrasiewicz <andrzej.p at collabora.com>
>
> Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
>
>> ---
>> drivers/gpu/drm/drm_gem_framebuffer_helper.c | 4 +---
>> 1 file changed, 1 insertion(+), 3 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_gem_framebuffer_helper.c b/drivers/gpu/drm/drm_gem_framebuffer_helper.c
>> index cac15294aef6..ccc2c71fa491 100644
>> --- a/drivers/gpu/drm/drm_gem_framebuffer_helper.c
>> +++ b/drivers/gpu/drm/drm_gem_framebuffer_helper.c
>> @@ -76,10 +76,8 @@ drm_gem_fb_init(struct drm_device *dev,
>> fb->obj[i] = obj[i];
>>
>> ret = drm_framebuffer_init(dev, fb, funcs);
>> - if (ret) {
>> + if (ret)
>> drm_err(dev, "Failed to init framebuffer: %d\n", ret);
>> - kfree(fb);
>> - }
>>
>> return ret;
>> }
>> --
>> 2.17.1
>>
>
>
More information about the dri-devel
mailing list