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@xxxxxxxxxx> > --- > 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@xxxxxxxxxx> > } > > static void vkms_destroy(struct vkms_config *config) > -- > 2.17.1 >
Attachment:
signature.asc
Description: PGP signature