Search Linux Wireless

RE: [bug report] iwlwifi: integrate with iwlmei

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dan,

> Hello Emmanuel Grumbach,
> 
> The patch 6d19a5eba5cd: "iwlwifi: integrate with iwlmei" from Nov 12, 2021,
> leads to the following Smatch static checker warning:
> 
> 	drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c:2640
> iwl_mvm_start_ap_ibss()
> 	error: NULL dereference inside function
> '__iwl_mvm_mac_set_key()'

Where in __iwl_mvm_mac_set_key() ?
This function should be able to cope with with a NULL sta I think.
I don't really see how this could be related to my patch since iwlmei is not related to AP mode at all.

I also moved to that commit, but the line numbers don't match, so I am a bit confused.

> 
> drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
>     2559 static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw,
>     2560                                  struct ieee80211_vif *vif)
>     2561 {
>     2562         struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
>     2563         struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
>     2564         int ret, i;
>     2565
>     2566         mutex_lock(&mvm->mutex);
>     2567
>     2568         /* Send the beacon template */
>     2569         ret = iwl_mvm_mac_ctxt_beacon_changed(mvm, vif);
>     2570         if (ret)
>     2571                 goto out_unlock;
>     2572
>     2573         /*
>     2574          * Re-calculate the tsf id, as the leader-follower relations depend
> on
>     2575          * the beacon interval, which was not known when the AP
> interface
>     2576          * was added.
>     2577          */
>     2578         if (vif->type == NL80211_IFTYPE_AP)
>     2579                 iwl_mvm_mac_ctxt_recalc_tsf_id(mvm, vif);
>     2580
>     2581         mvmvif->ap_assoc_sta_count = 0;
>     2582
>     2583         /* Add the mac context */
>     2584         ret = iwl_mvm_mac_ctxt_add(mvm, vif);
>     2585         if (ret)
>     2586                 goto out_unlock;
>     2587
>     2588         /* Perform the binding */
>     2589         ret = iwl_mvm_binding_add_vif(mvm, vif);
>     2590         if (ret)
>     2591                 goto out_remove;
>     2592
>     2593         /*
>     2594          * This is not very nice, but the simplest:
>     2595          * For older FWs adding the mcast sta before the bcast station
> may
>     2596          * cause assert 0x2b00.
>     2597          * This is fixed in later FW so make the order of removal depend
> on
>     2598          * the TLV
>     2599          */
>     2600         if (fw_has_api(&mvm->fw->ucode_capa,
> IWL_UCODE_TLV_API_STA_TYPE)) {
>     2601                 ret = iwl_mvm_add_mcast_sta(mvm, vif);
>     2602                 if (ret)
>     2603                         goto out_unbind;
>     2604                 /*
>     2605                  * Send the bcast station. At this stage the TBTT and DTIM
> time
>     2606                  * events are added and applied to the scheduler
>     2607                  */
>     2608                 ret = iwl_mvm_send_add_bcast_sta(mvm, vif);
>     2609                 if (ret) {
>     2610                         iwl_mvm_rm_mcast_sta(mvm, vif);
>     2611                         goto out_unbind;
>     2612                 }
>     2613         } else {
>     2614                 /*
>     2615                  * Send the bcast station. At this stage the TBTT and DTIM
> time
>     2616                  * events are added and applied to the scheduler
>     2617                  */
>     2618                 ret = iwl_mvm_send_add_bcast_sta(mvm, vif);
>     2619                 if (ret)
>     2620                         goto out_unbind;
>     2621                 ret = iwl_mvm_add_mcast_sta(mvm, vif);
>     2622                 if (ret) {
>     2623                         iwl_mvm_send_rm_bcast_sta(mvm, vif);
>     2624                         goto out_unbind;
>     2625                 }
>     2626         }
>     2627
>     2628         /* must be set before quota calculations */
>     2629         mvmvif->ap_ibss_active = true;
>     2630
>     2631         /* send all the early keys to the device now */
>     2632         for (i = 0; i < ARRAY_SIZE(mvmvif->ap_early_keys); i++) {
>     2633                 struct ieee80211_key_conf *key = mvmvif->ap_early_keys[i];
>     2634
>     2635                 if (!key)
>     2636                         continue;
>     2637
>     2638                 mvmvif->ap_early_keys[i] = NULL;
>     2639
> --> 2640                 ret = __iwl_mvm_mac_set_key(hw, SET_KEY, vif, NULL,
> key);
>                                                                        ^^^^ This passes a NULL "sta" and now it
> will always crash.  (Possibly it used to sometimes crash before your patch but
> the static checker does not mind about that.  :P).

This existed long before my patch


> 
>     2641                 if (ret)
>     2642                         goto out_quota_failed;
>     2643         }
>     2644
>     2645         if (vif->type == NL80211_IFTYPE_AP && !vif->p2p) {
>     2646                 iwl_mvm_vif_set_low_latency(mvmvif, true,
>     2647                                             LOW_LATENCY_VIF_TYPE);
>     2648                 iwl_mvm_send_low_latency_cmd(mvm, true, mvmvif->id);
>     2649         }
>     2650
>     2651         /* power updated needs to be done before quotas */
>     2652         iwl_mvm_power_update_mac(mvm);
>     2653
>     2654         ret = iwl_mvm_update_quotas(mvm, false, NULL);
>     2655         if (ret)
>     2656                 goto out_quota_failed;
>     2657
>     2658         /* Need to update the P2P Device MAC (only GO, IBSS is single
> vif) */
>     2659         if (vif->p2p && mvm->p2p_device_vif)
>     2660                 iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif,
> false, NULL);
>     2661
>     2662         iwl_mvm_bt_coex_vif_change(mvm);
>     2663
>     2664         /* we don't support TDLS during DCM */
>     2665         if (iwl_mvm_phy_ctx_count(mvm) > 1)
>     2666                 iwl_mvm_teardown_tdls_peers(mvm);
>     2667
>     2668         iwl_mvm_ftm_restart_responder(mvm, vif);
>     2669
>     2670         goto out_unlock;
>     2671
>     2672 out_quota_failed:
>     2673         iwl_mvm_power_update_mac(mvm);
>     2674         mvmvif->ap_ibss_active = false;
>     2675         iwl_mvm_send_rm_bcast_sta(mvm, vif);
>     2676         iwl_mvm_rm_mcast_sta(mvm, vif);
>     2677 out_unbind:
>     2678         iwl_mvm_binding_remove_vif(mvm, vif);
>     2679 out_remove:
>     2680         iwl_mvm_mac_ctxt_remove(mvm, vif);
>     2681 out_unlock:
>     2682         mutex_unlock(&mvm->mutex);
>     2683         return ret;
>     2684 }
> 
> regards,
> dan carpenter




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux