staging: rtl8192u: rework init and exit function
authorTong Zhang <ztong0001@gmail.com>
Thu, 24 Feb 2022 06:40:31 +0000 (22:40 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 Feb 2022 09:08:32 +0000 (10:08 +0100)
The init and exit functions are not releasing resource properly. An error
can be observed when we load/unload/load r8192u_usb module due to this
issue. This patch rework init and exit functions to do proper resource
release on init error and module unload.
The __exit attribute is stripped from some functions since they are now
being used by module init functions.

[  493.068012] proc_dir_entry 'net/ieee80211' already registered
[  493.271973]  proc_mkdir+0x18/0x20
[  493.272136]  ieee80211_debug_init+0x28/0xde8 [r8192u_usb]
[  493.272404]  rtl8192_usb_module_init+0x10/0x161 [r8192u_usb]

[   13.910616] proc_dir_entry 'net/rtl819xU' already registered
[   13.918931]  proc_mkdir+0x18/0x20
[   13.919098]  rtl8192_usb_module_init+0x142/0x16d [r8192u_usb]

Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Tong Zhang <ztong0001@gmail.com>
Link: https://lore.kernel.org/r/20220224064033.1530924-3-ztong0001@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8192u/ieee80211/ieee80211_crypt.c
drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c
drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c
drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_wep.c
drivers/staging/rtl8192u/ieee80211/ieee80211_module.c
drivers/staging/rtl8192u/r8192U_core.c

index 01012dddcd73f8f8002f08637b36232dfbdbddda..840db6250b87f813a7d2a8d01cb0f98e5876557c 100644 (file)
@@ -214,7 +214,7 @@ out:
        return ret;
 }
 
-void __exit ieee80211_crypto_deinit(void)
+void ieee80211_crypto_deinit(void)
 {
        struct list_head *ptr, *n;
 
index ccff385cf1f8f74ebd8ad1379b577db9e3307136..101c28265e9137eb7d1e156942f856fc287be539 100644 (file)
@@ -415,7 +415,7 @@ int __init ieee80211_crypto_ccmp_init(void)
        return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp);
 }
 
-void __exit ieee80211_crypto_ccmp_exit(void)
+void ieee80211_crypto_ccmp_exit(void)
 {
        ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp);
 }
index e8fa1d385f24e81e5a0d45743a9a5eab8d391729..689d8843f538d24c9ea914455c8477eaee7f601a 100644 (file)
@@ -712,7 +712,7 @@ int __init ieee80211_crypto_tkip_init(void)
        return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip);
 }
 
-void __exit ieee80211_crypto_tkip_exit(void)
+void ieee80211_crypto_tkip_exit(void)
 {
        ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip);
 }
index a41b6510481bc2c8238a93e316f7baef9be3e157..8a51ea1dd6e55b7ac4e337d519418188385e88ec 100644 (file)
@@ -240,7 +240,7 @@ int __init ieee80211_crypto_wep_init(void)
        return ieee80211_register_crypto_ops(&ieee80211_crypt_wep);
 }
 
-void __exit ieee80211_crypto_wep_exit(void)
+void ieee80211_crypto_wep_exit(void)
 {
        ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep);
 }
index c52540b734fd48dbba77927960c372a3c5224528..b94fe9b449b6cef8ff37564d65d67d721bd26628 100644 (file)
@@ -276,7 +276,7 @@ int __init ieee80211_debug_init(void)
        return 0;
 }
 
-void __exit ieee80211_debug_exit(void)
+void ieee80211_debug_exit(void)
 {
        if (ieee80211_proc) {
                remove_proc_entry("debug_level", ieee80211_proc);
index 364e1ca94f7014fd699873b8fdacf0c9dfd7538a..ce807c9d42194d08b396b4103c173107e1f5d189 100644 (file)
@@ -4783,49 +4783,70 @@ static int __init rtl8192_usb_module_init(void)
 {
        int ret;
 
-#ifdef CONFIG_IEEE80211_DEBUG
+       pr_info("\nLinux kernel driver for RTL8192 based WLAN cards\n");
+       pr_info("Copyright (c) 2007-2008, Realsil Wlan\n");
+       RT_TRACE(COMP_INIT, "Initializing module");
+       RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
+
        ret = ieee80211_debug_init();
        if (ret) {
                pr_err("ieee80211_debug_init() failed %d\n", ret);
                return ret;
        }
-#endif
+
        ret = ieee80211_crypto_init();
        if (ret) {
                pr_err("ieee80211_crypto_init() failed %d\n", ret);
-               return ret;
+               goto debug_exit;
        }
 
        ret = ieee80211_crypto_tkip_init();
        if (ret) {
                pr_err("ieee80211_crypto_tkip_init() failed %d\n", ret);
-               return ret;
+               goto crypto_exit;
        }
 
        ret = ieee80211_crypto_ccmp_init();
        if (ret) {
                pr_err("ieee80211_crypto_ccmp_init() failed %d\n", ret);
-               return ret;
+               goto crypto_tkip_exit;
        }
 
        ret = ieee80211_crypto_wep_init();
        if (ret) {
                pr_err("ieee80211_crypto_wep_init() failed %d\n", ret);
-               return ret;
+               goto crypto_ccmp_exit;
        }
 
-       pr_info("\nLinux kernel driver for RTL8192 based WLAN cards\n");
-       pr_info("Copyright (c) 2007-2008, Realsil Wlan\n");
-       RT_TRACE(COMP_INIT, "Initializing module");
-       RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
        rtl8192_proc_module_init();
-       return usb_register(&rtl8192_usb_driver);
+       ret = usb_register(&rtl8192_usb_driver);
+       if (ret)
+               goto rtl8192_proc_module_exit;
+       return ret;
+
+rtl8192_proc_module_exit:
+       remove_proc_entry(RTL819XU_MODULE_NAME, init_net.proc_net);
+       ieee80211_crypto_wep_exit();
+crypto_ccmp_exit:
+       ieee80211_crypto_ccmp_exit();
+crypto_tkip_exit:
+       ieee80211_crypto_tkip_exit();
+crypto_exit:
+       ieee80211_crypto_deinit();
+debug_exit:
+       ieee80211_debug_exit();
+       return ret;
 }
 
 static void __exit rtl8192_usb_module_exit(void)
 {
        usb_deregister(&rtl8192_usb_driver);
-
+       remove_proc_entry(RTL819XU_MODULE_NAME, init_net.proc_net);
+       ieee80211_crypto_wep_exit();
+       ieee80211_crypto_ccmp_exit();
+       ieee80211_crypto_tkip_exit();
+       ieee80211_crypto_deinit();
+       ieee80211_debug_exit();
        RT_TRACE(COMP_DOWN, "Exiting");
 }