Skip to contentSkip to conversation

carl9170: explain why sta cannot be NULL for ampdus

PATCH New Christian Lamparter 1 participant 1 message Dec 3, 2012 CARL9170 Linux community wireless driver

lore
Share & tools
lore

Christian Lamparter

author maintainer
#0 lore raw

PATCH 1/1 carl9170: explain why sta cannot be NULL for ampdus

Dan Carpenter reported that smatch detected a potential problem with the code [1]:
drivers/net/wireless/ath/carl9170/tx.c:1488 carl9170_op_tx()
error: we previously assumed 'sta' could be null (see line 1482)

drivers/net/wireless/ath/carl9170/tx.c

  1482  if (sta) {
           ^^^^^ New check.
  [...]
  1485  }
  1487  if (info->flags & IEEE80211_TX_CTL_AMPDU) {
  1488    run = carl9170_tx_ampdu_queue(ar, sta, skb);
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Old dereference of "sta" inside the call to carl9170_tx_ampdu_queue().

A range of solutions have been discussed in [2] and we agreed on the following: "

Quoted 4 lines

we might as well add a comment to carl9170_tx_ampdu_queue and explain the situation [in a way that's obvious to a human reader]. This way we can save the "if"... which is a small win since carl9170_op_tx is sort of a hot-path.

Putting a comment there is fine. Without the comment it's easy for a human reader to get confused why the check is there. So long as humans can read the code, that's all that matters."

[1] <http://www.spinics.net/lists/linux-wireless/msg94526.html>
[2] <http://www.spinics.net/lists/linux-kernel-janitors/msg14953.html>

---
 drivers/net/wireless/ath/carl9170/tx.c |    7 +++++++
 1 file changed, 7 insertions(+)
drivers/net/wireless/ath/carl9170/tx.c +7 -0
index 6a86814..45c696b 100644
@@ -1485,6 +1485,13 @@ void carl9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
 	}
 
 	if (info->flags & IEEE80211_TX_CTL_AMPDU) {
+		/* to static code analyzers and reviewers:
+		 * mac80211 guarantees that a valid "sta"
+		 * reference is present, if a frame is to
+		 * be part of an ampdu. Hence any extra
+		 * sta == NULL checks are redundant in this
+		 * special case.
+		 */
 		run = carl9170_tx_ampdu_queue(ar, sta, skb);
 		if (run)
 			carl9170_tx_ampdu(ar);
Signature · 1 line
1.7.10.4