summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAtul Gopinathan <atulgopinathan@gmail.com>2021-05-03 13:56:54 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-05-26 12:06:55 +0200
commit9285808072d4aeabdf710187acae5e09e71157e4 (patch)
treed13bfbf6004e97e86fb9457dd05cbcd119600e28
parent3d2a4fb91122e1a728ef9af16af6c37dbd36c997 (diff)
downloadlinux-stable-9285808072d4aeabdf710187acae5e09e71157e4.tar.gz
linux-stable-9285808072d4aeabdf710187acae5e09e71157e4.tar.bz2
linux-stable-9285808072d4aeabdf710187acae5e09e71157e4.zip
cdrom: gdrom: deallocate struct gdrom_unit fields in remove_gdrom
commit d03d1021da6fe7f46efe9f2a7335564e7c9db5ab upstream. The fields, "toc" and "cd_info", of "struct gdrom_unit gd" are allocated in "probe_gdrom()". Prevent a memory leak by making sure "gd.cd_info" is deallocated in the "remove_gdrom()" function. Also prevent double free of the field "gd.toc" by moving it from the module's exit function to "remove_gdrom()". This is because, in "probe_gdrom()", the function makes sure to deallocate "gd.toc" in case of any errors, so the exit function invoked later would again free "gd.toc". The patch also maintains consistency by deallocating the above mentioned fields in "remove_gdrom()" along with another memory allocated field "gd.disk". Suggested-by: Jens Axboe <axboe@kernel.dk> Cc: Peter Rosin <peda@axentia.se> Cc: stable <stable@vger.kernel.org> Signed-off-by: Atul Gopinathan <atulgopinathan@gmail.com> Link: https://lore.kernel.org/r/20210503115736.2104747-28-gregkh@linuxfoundation.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/cdrom/gdrom.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c
index 466fc3eee8bb..8284705213bf 100644
--- a/drivers/cdrom/gdrom.c
+++ b/drivers/cdrom/gdrom.c
@@ -831,6 +831,8 @@ static int remove_gdrom(struct platform_device *devptr)
if (gdrom_major)
unregister_blkdev(gdrom_major, GDROM_DEV_NAME);
unregister_cdrom(gd.cd_info);
+ kfree(gd.cd_info);
+ kfree(gd.toc);
return 0;
}
@@ -862,7 +864,6 @@ static void __exit exit_gdrom(void)
{
platform_device_unregister(pd);
platform_driver_unregister(&gdrom_driver);
- kfree(gd.toc);
}
module_init(init_gdrom);