diff options
Diffstat (limited to 'net/unix/garbage.c')
| -rw-r--r-- | net/unix/garbage.c | 23 | 
1 files changed, 14 insertions, 9 deletions
diff --git a/net/unix/garbage.c b/net/unix/garbage.c index 1f8b8cdfcdc8..dfe94a90ece4 100644 --- a/net/unix/garbage.c +++ b/net/unix/garbage.c @@ -342,6 +342,18 @@ enum unix_recv_queue_lock_class {  	U_RECVQ_LOCK_EMBRYO,  }; +static void unix_collect_queue(struct unix_sock *u, struct sk_buff_head *hitlist) +{ +	skb_queue_splice_init(&u->sk.sk_receive_queue, hitlist); + +#if IS_ENABLED(CONFIG_AF_UNIX_OOB) +	if (u->oob_skb) { +		WARN_ON_ONCE(skb_unref(u->oob_skb)); +		u->oob_skb = NULL; +	} +#endif +} +  static void unix_collect_skb(struct list_head *scc, struct sk_buff_head *hitlist)  {  	struct unix_vertex *vertex; @@ -365,18 +377,11 @@ static void unix_collect_skb(struct list_head *scc, struct sk_buff_head *hitlist  				/* listener -> embryo order, the inversion never happens. */  				spin_lock_nested(&embryo_queue->lock, U_RECVQ_LOCK_EMBRYO); -				skb_queue_splice_init(embryo_queue, hitlist); +				unix_collect_queue(unix_sk(skb->sk), hitlist);  				spin_unlock(&embryo_queue->lock);  			}  		} else { -			skb_queue_splice_init(queue, hitlist); - -#if IS_ENABLED(CONFIG_AF_UNIX_OOB) -			if (u->oob_skb) { -				kfree_skb(u->oob_skb); -				u->oob_skb = NULL; -			} -#endif +			unix_collect_queue(u, hitlist);  		}  		spin_unlock(&queue->lock);  | 
