Skip to content

Commit 74b1ec9

Browse files
Daniil Dulovjmberg-intel
authored andcommitted
wifi: zd1211rw: Fix potential NULL pointer dereference in zd_mac_tx_to_dev()
There is a potential NULL pointer dereference in zd_mac_tx_to_dev(). For example, the following is possible: T0 T1 zd_mac_tx_to_dev() /* len == skb_queue_len(q) */ while (len > ZD_MAC_MAX_ACK_WAITERS) { filter_ack() spin_lock_irqsave(&q->lock, flags); /* position == skb_queue_len(q) */ for (i=1; i<position; i++) skb = __skb_dequeue(q) if (mac->type == NL80211_IFTYPE_AP) skb = __skb_dequeue(q); spin_unlock_irqrestore(&q->lock, flags); skb_dequeue() -> NULL Since there is a small gap between checking skb queue length and skb being unconditionally dequeued in zd_mac_tx_to_dev(), skb_dequeue() can return NULL. Then the pointer is passed to zd_mac_tx_status() where it is dereferenced. In order to avoid potential NULL pointer dereference due to situations like above, check if skb is not NULL before passing it to zd_mac_tx_status(). Found by Linux Verification Center (linuxtesting.org) with SVACE. Fixes: 459c51a ("zd1211rw: port to mac80211") Signed-off-by: Daniil Dulov <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Johannes Berg <[email protected]>
1 parent 1fe44a8 commit 74b1ec9

File tree

1 file changed

+5
-1
lines changed
  • drivers/net/wireless/zydas/zd1211rw

1 file changed

+5
-1
lines changed

drivers/net/wireless/zydas/zd1211rw/zd_mac.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,11 @@ void zd_mac_tx_to_dev(struct sk_buff *skb, int error)
583583

584584
skb_queue_tail(q, skb);
585585
while (skb_queue_len(q) > ZD_MAC_MAX_ACK_WAITERS) {
586-
zd_mac_tx_status(hw, skb_dequeue(q),
586+
skb = skb_dequeue(q);
587+
if (!skb)
588+
break;
589+
590+
zd_mac_tx_status(hw, skb,
587591
mac->ack_pending ? mac->ack_signal : 0,
588592
NULL);
589593
mac->ack_pending = 0;

0 commit comments

Comments
 (0)