]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iwlwifi: Add missing check for alloc_ordered_workqueue
authorJiasheng Jiang <jiasheng@iscas.ac.cn>
Tue, 10 Jan 2023 01:48:48 +0000 (09:48 +0800)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 25 Jun 2025 07:57:34 +0000 (10:57 +0300)
Add check for the return value of alloc_ordered_workqueue since it may
return NULL pointer.

Fixes: b481de9ca074 ("[IWLWIFI]: add iwlwifi wireless drivers")
Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn>
Link: https://patch.msgid.link/20230110014848.28226-1-jiasheng@iscas.ac.cn
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
drivers/net/wireless/intel/iwlwifi/dvm/main.c

index 1d619384c629dd76468a6f6fa6aced8d8dcfbb33..a940c23007ecdf96e18ba5a377724ffbaab0bddf 100644 (file)
@@ -1048,9 +1048,11 @@ static void iwl_bg_restart(struct work_struct *data)
  *
  *****************************************************************************/
 
-static void iwl_setup_deferred_work(struct iwl_priv *priv)
+static int iwl_setup_deferred_work(struct iwl_priv *priv)
 {
        priv->workqueue = alloc_ordered_workqueue(DRV_NAME, 0);
+       if (!priv->workqueue)
+               return -ENOMEM;
 
        INIT_WORK(&priv->restart, iwl_bg_restart);
        INIT_WORK(&priv->beacon_update, iwl_bg_beacon_update);
@@ -1067,6 +1069,8 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)
        timer_setup(&priv->statistics_periodic, iwl_bg_statistics_periodic, 0);
 
        timer_setup(&priv->ucode_trace, iwl_bg_ucode_trace, 0);
+
+       return 0;
 }
 
 void iwl_cancel_deferred_work(struct iwl_priv *priv)
@@ -1461,7 +1465,9 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
        /********************
         * 6. Setup services
         ********************/
-       iwl_setup_deferred_work(priv);
+       if (iwl_setup_deferred_work(priv))
+               goto out_uninit_drv;
+
        iwl_setup_rx_handlers(priv);
 
        iwl_power_initialize(priv);
@@ -1500,6 +1506,7 @@ out_destroy_workqueue:
        iwl_cancel_deferred_work(priv);
        destroy_workqueue(priv->workqueue);
        priv->workqueue = NULL;
+out_uninit_drv:
        iwl_uninit_drv(priv);
 out_free_eeprom_blob:
        kfree(priv->eeprom_blob);