[ I fixed a Smatch bug and now it started warning about this code -dan ]

Hello Johannes Berg,

This is a semi-automatic email about new static checker warnings.

The patch 531682159092: "mac80211: fix VLAN handling with TXQs" from 
Jun 22, 2017, leads to the following Smatch complaint:

    net/mac80211/tx.c:3529 ieee80211_tx_dequeue()
     error: we previously assumed 'skb' could be null (see line 3511)

net/mac80211/tx.c
  3500                                             tx.key, skb);
  3501          } else {
  3502                  if (invoke_tx_handlers_late(&tx))
  3503                          goto begin;
  3504  
  3505                  skb = __skb_dequeue(&tx.skbs);
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The NULL skb would have to come from here.

  3506  
  3507                  if (!skb_queue_empty(&tx.skbs))
  3508                          skb_queue_splice_tail(&tx.skbs, &txqi->frags);
  3509          }
  3510  
  3511          if (skb && skb_has_frag_list(skb) &&
                    ^^^
Old code checks

  3512              !ieee80211_hw_check(&local->hw, TX_FRAG_LIST)) {
  3513                  if (skb_linearize(skb)) {
  3514                          ieee80211_free_txskb(&local->hw, skb);
  3515                          goto begin;
  3516                  }
  3517          }
  3518  
  3519          switch (tx.sdata->vif.type) {
  3520          case NL80211_IFTYPE_MONITOR:
  3521                  if (tx.sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) {
  3522                          vif = &tx.sdata->vif;
  3523                          break;
  3524                  }
  3525                  tx.sdata = rcu_dereference(local->monitor_sdata);
  3526                  if (tx.sdata) {
  3527                          vif = &tx.sdata->vif;
  3528                          info->hw_queue =
  3529                                  
vif->hw_queue[skb_get_queue_mapping(skb)];
                                                                            ^^^
Patch adds unchecked dereference (might be a false positive).

  3530                  } else if (ieee80211_hw_check(&local->hw, 
QUEUE_CONTROL)) {
  3531                          ieee80211_free_txskb(&local->hw, skb);

regards,
dan carpenter

Reply via email to