Skip to content

Commit 74e7e1e

Browse files
committed
xen/netback: don't call kfree_skb() with interrupts disabled
It is not allowed to call kfree_skb() from hardware interrupt context or with interrupts being disabled. So remove kfree_skb() from the spin_lock_irqsave() section and use the already existing "drop" label in xenvif_start_xmit() for dropping the SKB. At the same time replace the dev_kfree_skb() call there with a call of dev_kfree_skb_any(), as xenvif_start_xmit() can be called with disabled interrupts. This is XSA-424 / CVE-2022-42328 / CVE-2022-42329. Fixes: be81992 ("xen/netback: don't queue unlimited number of packages") Reported-by: Yang Yingliang <[email protected]> Signed-off-by: Juergen Gross <[email protected]> Reviewed-by: Jan Beulich <[email protected]> Signed-off-by: Juergen Gross <[email protected]>
1 parent ad7f402 commit 74e7e1e

File tree

3 files changed

+10
-6
lines changed

3 files changed

+10
-6
lines changed

drivers/net/xen-netback/common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ int xenvif_dealloc_kthread(void *data);
386386
irqreturn_t xenvif_ctrl_irq_fn(int irq, void *data);
387387

388388
bool xenvif_have_rx_work(struct xenvif_queue *queue, bool test_kthread);
389-
void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb);
389+
bool xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb);
390390

391391
void xenvif_carrier_on(struct xenvif *vif);
392392

drivers/net/xen-netback/interface.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,14 +254,16 @@ xenvif_start_xmit(struct sk_buff *skb, struct net_device *dev)
254254
if (vif->hash.alg == XEN_NETIF_CTRL_HASH_ALGORITHM_NONE)
255255
skb_clear_hash(skb);
256256

257-
xenvif_rx_queue_tail(queue, skb);
257+
if (!xenvif_rx_queue_tail(queue, skb))
258+
goto drop;
259+
258260
xenvif_kick_thread(queue);
259261

260262
return NETDEV_TX_OK;
261263

262264
drop:
263265
vif->dev->stats.tx_dropped++;
264-
dev_kfree_skb(skb);
266+
dev_kfree_skb_any(skb);
265267
return NETDEV_TX_OK;
266268
}
267269

drivers/net/xen-netback/rx.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,18 @@ static bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue)
8282
return false;
8383
}
8484

85-
void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb)
85+
bool xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb)
8686
{
8787
unsigned long flags;
88+
bool ret = true;
8889

8990
spin_lock_irqsave(&queue->rx_queue.lock, flags);
9091

9192
if (queue->rx_queue_len >= queue->rx_queue_max) {
9293
struct net_device *dev = queue->vif->dev;
9394

9495
netif_tx_stop_queue(netdev_get_tx_queue(dev, queue->id));
95-
kfree_skb(skb);
96-
queue->vif->dev->stats.rx_dropped++;
96+
ret = false;
9797
} else {
9898
if (skb_queue_empty(&queue->rx_queue))
9999
xenvif_update_needed_slots(queue, skb);
@@ -104,6 +104,8 @@ void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb)
104104
}
105105

106106
spin_unlock_irqrestore(&queue->rx_queue.lock, flags);
107+
108+
return ret;
107109
}
108110

109111
static struct sk_buff *xenvif_rx_dequeue(struct xenvif_queue *queue)

0 commit comments

Comments
 (0)