mt76: mt76s: fix oom in mt76s_tx_queue_skb_raw
authorLorenzo Bianconi <lorenzo@kernel.org>
Thu, 30 Jul 2020 09:38:46 +0000 (11:38 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 24 Sep 2020 16:10:13 +0000 (18:10 +0200)
Free the mcu skb in case of error in mt76s_tx_queue_skb_raw routine

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/sdio.c

index d2b38ed..5d83530 100644 (file)
@@ -244,22 +244,27 @@ mt76s_tx_queue_skb_raw(struct mt76_dev *dev, enum mt76_txq_id qid,
        struct mt76_queue *q = dev->q_tx[qid].q;
        int ret = -ENOSPC, len = skb->len;
 
-       spin_lock_bh(&q->lock);
        if (q->queued == q->ndesc)
-               goto out;
+               goto error;
 
        ret = mt76_skb_adjust_pad(skb);
        if (ret)
-               goto out;
+               goto error;
+
+       spin_lock_bh(&q->lock);
 
        q->entry[q->tail].buf_sz = len;
        q->entry[q->tail].skb = skb;
        q->tail = (q->tail + 1) % q->ndesc;
        q->queued++;
 
-out:
        spin_unlock_bh(&q->lock);
 
+       return 0;
+
+error:
+       dev_kfree_skb(skb);
+
        return ret;
 }