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 <[email protected]>
---
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 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/[email protected]/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 <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/
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/[email protected]/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 <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/
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
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/[email protected]/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 <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/
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