diff options
Diffstat (limited to 'include/net/sock.h')
-rw-r--r-- | include/net/sock.h | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index aed16eb9db4b..5697caf8cc76 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -600,12 +600,15 @@ static inline int sk_stream_memory_free(struct sock *sk) | |||
600 | /* OOB backlog add */ | 600 | /* OOB backlog add */ |
601 | static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb) | 601 | static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb) |
602 | { | 602 | { |
603 | if (!sk->sk_backlog.tail) { | 603 | /* dont let skb dst not refcounted, we are going to leave rcu lock */ |
604 | sk->sk_backlog.head = sk->sk_backlog.tail = skb; | 604 | skb_dst_force(skb); |
605 | } else { | 605 | |
606 | if (!sk->sk_backlog.tail) | ||
607 | sk->sk_backlog.head = skb; | ||
608 | else | ||
606 | sk->sk_backlog.tail->next = skb; | 609 | sk->sk_backlog.tail->next = skb; |
607 | sk->sk_backlog.tail = skb; | 610 | |
608 | } | 611 | sk->sk_backlog.tail = skb; |
609 | skb->next = NULL; | 612 | skb->next = NULL; |
610 | } | 613 | } |
611 | 614 | ||