drivers/misc/ti-st/st_kim.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
In kim_probe, it called st_core_init and bound &st_gdata->work_write_wakeup
with work_fn_write_wakeup.
When it calls st_tty_wakeup, it will finally call schedule_work to start
the work.
When we call kim_remove to remove the driver, there
may be a sequence as follows:
Fix it by finishing the work before cleanup in kim_remove
CPU0 CPU1
|work_fn_write_wakeup
kim_remove |
st_core_exit |
kfree(st_gdata)|
|st_tx_wakeup
|//use st_gdata
Fixes: b05b7c7cc032 ("ti-st: use worker instead of calling st_int_write in wake up")
Signed-off-by: Zheng Wang <zyytlz.wz@163.com>
---
drivers/misc/ti-st/st_kim.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c
index f2f6cab97c08..160258a78c7b 100644
--- a/drivers/misc/ti-st/st_kim.c
+++ b/drivers/misc/ti-st/st_kim.c
@@ -785,9 +785,12 @@ static int kim_remove(struct platform_device *pdev)
/* free the GPIOs requested */
struct ti_st_plat_data *pdata = pdev->dev.platform_data;
struct kim_data_s *kim_gdata;
+ struct st_data_s *st_gdata = kim_gdata->core_data;
kim_gdata = platform_get_drvdata(pdev);
+ cancel_work_sync(&st_gdata->work_write_wakeup);
+
/*
* Free the Bluetooth/FM/GPIO
* nShutdown gpio from the system
@@ -800,7 +803,7 @@ static int kim_remove(struct platform_device *pdev)
pr_info("sysfs entries removed");
kim_gdata->kim_pdev = NULL;
- st_core_exit(kim_gdata->core_data);
+ st_core_exit(st_gdata);
kfree(kim_gdata);
kim_gdata = NULL;
--
2.25.1
Hi Zheng, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on char-misc/char-misc-testing] [also build test WARNING on char-misc/char-misc-next char-misc/char-misc-linus soc/for-next v6.3-rc2 next-20230317] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Zheng-Wang/misc-ti-st-st_kim-Fix-use-after-free-bug-in-kim_remove-due-to-race-condition/20230318-161853 patch link: https://lore.kernel.org/r/20230318081743.797531-1-zyytlz.wz%40163.com patch subject: [PATCH RESEND] misc: ti-st: st_kim: Fix use after free bug in kim_remove due to race condition config: m68k-allmodconfig (https://download.01.org/0day-ci/archive/20230318/202303181850.RI6iAAhO-lkp@intel.com/config) compiler: m68k-linux-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/ecbe190b970112b4b10e2a1766da933168ae5fdd git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Zheng-Wang/misc-ti-st-st_kim-Fix-use-after-free-bug-in-kim_remove-due-to-race-condition/20230318-161853 git checkout ecbe190b970112b4b10e2a1766da933168ae5fdd # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202303181850.RI6iAAhO-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/misc/ti-st/st_kim.c: In function 'kim_remove': >> drivers/misc/ti-st/st_kim.c:788:27: warning: 'kim_gdata' is used uninitialized [-Wuninitialized] 788 | struct st_data_s *st_gdata = kim_gdata->core_data; | ^~~~~~~~ drivers/misc/ti-st/st_kim.c:787:34: note: 'kim_gdata' was declared here 787 | struct kim_data_s *kim_gdata; | ^~~~~~~~~ vim +/kim_gdata +788 drivers/misc/ti-st/st_kim.c 782 783 static int kim_remove(struct platform_device *pdev) 784 { 785 /* free the GPIOs requested */ 786 struct ti_st_plat_data *pdata = pdev->dev.platform_data; 787 struct kim_data_s *kim_gdata; > 788 struct st_data_s *st_gdata = kim_gdata->core_data; 789 790 kim_gdata = platform_get_drvdata(pdev); 791 792 cancel_work_sync(&st_gdata->work_write_wakeup); 793 794 /* 795 * Free the Bluetooth/FM/GPIO 796 * nShutdown gpio from the system 797 */ 798 gpio_free(pdata->nshutdown_gpio); 799 pr_info("nshutdown GPIO Freed"); 800 801 debugfs_remove_recursive(kim_debugfs_dir); 802 sysfs_remove_group(&pdev->dev.kobj, &uim_attr_grp); 803 pr_info("sysfs entries removed"); 804 805 kim_gdata->kim_pdev = NULL; 806 st_core_exit(st_gdata); 807 808 kfree(kim_gdata); 809 kim_gdata = NULL; 810 return 0; 811 } 812 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests
Hi Zheng, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on char-misc/char-misc-testing] [also build test WARNING on char-misc/char-misc-next char-misc/char-misc-linus soc/for-next linus/master v6.3-rc2 next-20230317] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Zheng-Wang/misc-ti-st-st_kim-Fix-use-after-free-bug-in-kim_remove-due-to-race-condition/20230318-161853 patch link: https://lore.kernel.org/r/20230318081743.797531-1-zyytlz.wz%40163.com patch subject: [PATCH RESEND] misc: ti-st: st_kim: Fix use after free bug in kim_remove due to race condition config: i386-randconfig-a005 (https://download.01.org/0day-ci/archive/20230318/202303181753.kJU7eetL-lkp@intel.com/config) compiler: gcc-11 (Debian 11.3.0-8) 11.3.0 reproduce (this is a W=1 build): # https://github.com/intel-lab-lkp/linux/commit/ecbe190b970112b4b10e2a1766da933168ae5fdd git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Zheng-Wang/misc-ti-st-st_kim-Fix-use-after-free-bug-in-kim_remove-due-to-race-condition/20230318-161853 git checkout ecbe190b970112b4b10e2a1766da933168ae5fdd # save the config file mkdir build_dir && cp config build_dir/.config make W=1 O=build_dir ARCH=i386 olddefconfig make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/misc/ti-st/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202303181753.kJU7eetL-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/misc/ti-st/st_kim.c: In function 'kim_remove': >> drivers/misc/ti-st/st_kim.c:788:27: warning: 'kim_gdata' is used uninitialized [-Wuninitialized] 788 | struct st_data_s *st_gdata = kim_gdata->core_data; | ^~~~~~~~ vim +/kim_gdata +788 drivers/misc/ti-st/st_kim.c 782 783 static int kim_remove(struct platform_device *pdev) 784 { 785 /* free the GPIOs requested */ 786 struct ti_st_plat_data *pdata = pdev->dev.platform_data; 787 struct kim_data_s *kim_gdata; > 788 struct st_data_s *st_gdata = kim_gdata->core_data; 789 790 kim_gdata = platform_get_drvdata(pdev); 791 792 cancel_work_sync(&st_gdata->work_write_wakeup); 793 794 /* 795 * Free the Bluetooth/FM/GPIO 796 * nShutdown gpio from the system 797 */ 798 gpio_free(pdata->nshutdown_gpio); 799 pr_info("nshutdown GPIO Freed"); 800 801 debugfs_remove_recursive(kim_debugfs_dir); 802 sysfs_remove_group(&pdev->dev.kobj, &uim_attr_grp); 803 pr_info("sysfs entries removed"); 804 805 kim_gdata->kim_pdev = NULL; 806 st_core_exit(st_gdata); 807 808 kfree(kim_gdata); 809 kim_gdata = NULL; 810 return 0; 811 } 812 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests
Hi Zheng, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on char-misc/char-misc-testing] [also build test WARNING on char-misc/char-misc-next char-misc/char-misc-linus soc/for-next linus/master v6.3-rc2 next-20230317] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Zheng-Wang/misc-ti-st-st_kim-Fix-use-after-free-bug-in-kim_remove-due-to-race-condition/20230318-161853 patch link: https://lore.kernel.org/r/20230318081743.797531-1-zyytlz.wz%40163.com patch subject: [PATCH RESEND] misc: ti-st: st_kim: Fix use after free bug in kim_remove due to race condition config: i386-randconfig-a004 (https://download.01.org/0day-ci/archive/20230318/202303181724.0bgWKpe9-lkp@intel.com/config) compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/ecbe190b970112b4b10e2a1766da933168ae5fdd git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Zheng-Wang/misc-ti-st-st_kim-Fix-use-after-free-bug-in-kim_remove-due-to-race-condition/20230318-161853 git checkout ecbe190b970112b4b10e2a1766da933168ae5fdd # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/misc/ti-st/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202303181724.0bgWKpe9-lkp@intel.com/ All warnings (new ones prefixed by >>): >> drivers/misc/ti-st/st_kim.c:788:31: warning: variable 'kim_gdata' is uninitialized when used here [-Wuninitialized] struct st_data_s *st_gdata = kim_gdata->core_data; ^~~~~~~~~ drivers/misc/ti-st/st_kim.c:787:30: note: initialize the variable 'kim_gdata' to silence this warning struct kim_data_s *kim_gdata; ^ = NULL 1 warning generated. vim +/kim_gdata +788 drivers/misc/ti-st/st_kim.c 782 783 static int kim_remove(struct platform_device *pdev) 784 { 785 /* free the GPIOs requested */ 786 struct ti_st_plat_data *pdata = pdev->dev.platform_data; 787 struct kim_data_s *kim_gdata; > 788 struct st_data_s *st_gdata = kim_gdata->core_data; 789 790 kim_gdata = platform_get_drvdata(pdev); 791 792 cancel_work_sync(&st_gdata->work_write_wakeup); 793 794 /* 795 * Free the Bluetooth/FM/GPIO 796 * nShutdown gpio from the system 797 */ 798 gpio_free(pdata->nshutdown_gpio); 799 pr_info("nshutdown GPIO Freed"); 800 801 debugfs_remove_recursive(kim_debugfs_dir); 802 sysfs_remove_group(&pdev->dev.kobj, &uim_attr_grp); 803 pr_info("sysfs entries removed"); 804 805 kim_gdata->kim_pdev = NULL; 806 st_core_exit(st_gdata); 807 808 kfree(kim_gdata); 809 kim_gdata = NULL; 810 return 0; 811 } 812 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests
© 2016 - 2023 Red Hat, Inc.