mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
sock: sock_dequeue_err_skb() needs hard irq safety
Non NAPI drivers can call skb_tstamp_tx() and then sock_queue_err_skb() from hard IRQ context. Therefore, sock_dequeue_err_skb() needs to block hard irq or corruptions or hangs can happen. Signed-off-by: Eric Dumazet <edumazet@google.com> Fixes:364a9e9324
("sock: deduplicate errqueue dequeue") Fixes:cb820f8e4b
("net: Provide a generic socket error queue delivery method for Tx time stamps.") Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
846cd66788
commit
997d5c3f44
@ -3621,13 +3621,14 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk)
|
||||
{
|
||||
struct sk_buff_head *q = &sk->sk_error_queue;
|
||||
struct sk_buff *skb, *skb_next;
|
||||
unsigned long flags;
|
||||
int err = 0;
|
||||
|
||||
spin_lock_bh(&q->lock);
|
||||
spin_lock_irqsave(&q->lock, flags);
|
||||
skb = __skb_dequeue(q);
|
||||
if (skb && (skb_next = skb_peek(q)))
|
||||
err = SKB_EXT_ERR(skb_next)->ee.ee_errno;
|
||||
spin_unlock_bh(&q->lock);
|
||||
spin_unlock_irqrestore(&q->lock, flags);
|
||||
|
||||
sk->sk_err = err;
|
||||
if (err)
|
||||
|
Loading…
Reference in New Issue
Block a user