Message ID | 20221101065156.41584-2-yuancan@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/vkms: Fix some memory related bug | expand |
On 11/01, Yuan Can wrote: > A memory leak was reported after the vkms module install failed. > > unreferenced object 0xffff88810bc28520 (size 16): > comm "modprobe", pid 9662, jiffies 4298009455 (age 42.590s) > hex dump (first 16 bytes): > 01 01 00 64 81 88 ff ff 00 00 dc 0a 81 88 ff ff ...d............ > backtrace: > [<00000000e7561ff8>] kmalloc_trace+0x27/0x60 > [<000000000b1954a0>] 0xffffffffc45200a9 > [<00000000abbf1da0>] do_one_initcall+0xd0/0x4f0 > [<000000001505ee87>] do_init_module+0x1a4/0x680 > [<00000000958079ad>] load_module+0x6249/0x7110 > [<00000000117e4696>] __do_sys_finit_module+0x140/0x200 > [<00000000f74b12d2>] do_syscall_64+0x35/0x80 > [<000000008fc6fcde>] entry_SYSCALL_64_after_hwframe+0x46/0xb0 > > The reason is that the vkms_init() returns without checking the return > value of vkms_create(), and if the vkms_create() failed, the config > allocated at the beginning of vkms_init() is leaked. > > vkms_init() > config = kmalloc(...) # config allocated > ... > return vkms_create() # vkms_create failed and config is leaked > > Fix this problem by checking return value of vkms_create() and free the > config if error happened. > > Fixes: 2df7af93fdad ("drm/vkms: Add vkms_config type") > Signed-off-by: Yuan Can <yuancan@huawei.com> > --- > drivers/gpu/drm/vkms/vkms_drv.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c > index 0ffe5f0e33f7..dfe983eaa07f 100644 > --- a/drivers/gpu/drm/vkms/vkms_drv.c > +++ b/drivers/gpu/drm/vkms/vkms_drv.c > @@ -218,6 +218,7 @@ static int vkms_create(struct vkms_config *config) > > static int __init vkms_init(void) > { > + int ret; > struct vkms_config *config; > > config = kmalloc(sizeof(*config), GFP_KERNEL); > @@ -230,7 +231,11 @@ static int __init vkms_init(void) > config->writeback = enable_writeback; > config->overlay = enable_overlay; > > - return vkms_create(config); > + ret = vkms_create(config); > + if (ret) > + kfree(config); > + > + return ret; Good catch. Thanks, Reviewed-by: Melissa Wen <mwen@igalia.com> > } > > static void vkms_destroy(struct vkms_config *config) > -- > 2.17.1 >
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c index 0ffe5f0e33f7..dfe983eaa07f 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -218,6 +218,7 @@ static int vkms_create(struct vkms_config *config) static int __init vkms_init(void) { + int ret; struct vkms_config *config; config = kmalloc(sizeof(*config), GFP_KERNEL); @@ -230,7 +231,11 @@ static int __init vkms_init(void) config->writeback = enable_writeback; config->overlay = enable_overlay; - return vkms_create(config); + ret = vkms_create(config); + if (ret) + kfree(config); + + return ret; } static void vkms_destroy(struct vkms_config *config)
A memory leak was reported after the vkms module install failed. unreferenced object 0xffff88810bc28520 (size 16): comm "modprobe", pid 9662, jiffies 4298009455 (age 42.590s) hex dump (first 16 bytes): 01 01 00 64 81 88 ff ff 00 00 dc 0a 81 88 ff ff ...d............ backtrace: [<00000000e7561ff8>] kmalloc_trace+0x27/0x60 [<000000000b1954a0>] 0xffffffffc45200a9 [<00000000abbf1da0>] do_one_initcall+0xd0/0x4f0 [<000000001505ee87>] do_init_module+0x1a4/0x680 [<00000000958079ad>] load_module+0x6249/0x7110 [<00000000117e4696>] __do_sys_finit_module+0x140/0x200 [<00000000f74b12d2>] do_syscall_64+0x35/0x80 [<000000008fc6fcde>] entry_SYSCALL_64_after_hwframe+0x46/0xb0 The reason is that the vkms_init() returns without checking the return value of vkms_create(), and if the vkms_create() failed, the config allocated at the beginning of vkms_init() is leaked. vkms_init() config = kmalloc(...) # config allocated ... return vkms_create() # vkms_create failed and config is leaked Fix this problem by checking return value of vkms_create() and free the config if error happened. Fixes: 2df7af93fdad ("drm/vkms: Add vkms_config type") Signed-off-by: Yuan Can <yuancan@huawei.com> --- drivers/gpu/drm/vkms/vkms_drv.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)