Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a819ba2 authored by Pavel Belous's avatar Pavel Belous Committed by Greg Kroah-Hartman
Browse files

net: atlantic: fix use after free kasan warn



commit a4980919ad6a7be548d499bc5338015e1a9191c6 upstream.

skb->len is used to calculate statistics after xmit invocation.

Under a stress load it may happen that skb will be xmited,
rx interrupt will come and skb will be freed, all before xmit function
is even returned.

Eventually, skb->len will access unallocated area.

Moving stats calculation into tx_clean routine.

Fixes: 018423e9 ("net: ethernet: aquantia: Add ring support code")
Reported-by: default avatarChristophe Vu-Brugier <cvubrugier@fastmail.fm>
Signed-off-by: default avatarIgor Russkikh <irusskikh@marvell.com>
Signed-off-by: default avatarPavel Belous <pbelous@marvell.com>
Signed-off-by: default avatarDmitry Bogdanov <dbogdanov@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 0ededb6e
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -530,10 +530,6 @@ int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb)
	if (likely(frags)) {
		err = self->aq_hw_ops->hw_ring_tx_xmit(self->aq_hw,
						       ring, frags);
		if (err >= 0) {
			++ring->stats.tx.packets;
			ring->stats.tx.bytes += skb->len;
		}
	} else {
		err = NETDEV_TX_BUSY;
	}
+5 −2
Original line number Diff line number Diff line
@@ -162,9 +162,12 @@ bool aq_ring_tx_clean(struct aq_ring_s *self)
			}
		}

		if (unlikely(buff->is_eop))
			dev_kfree_skb_any(buff->skb);
		if (unlikely(buff->is_eop)) {
			++self->stats.rx.packets;
			self->stats.tx.bytes += buff->skb->len;

			dev_kfree_skb_any(buff->skb);
		}
		buff->pa = 0U;
		buff->eop_index = 0xffffU;
		self->sw_head = aq_ring_next_dx(self, self->sw_head);