aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sctp/socket.c')
-rw-r--r--net/sctp/socket.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 0b338eca6dc0..e6926cb19420 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -4368,15 +4368,11 @@ static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags,
4368 * However, this function was corrent in any case. 8) 4368 * However, this function was corrent in any case. 8)
4369 */ 4369 */
4370 if (flags & MSG_PEEK) { 4370 if (flags & MSG_PEEK) {
4371 unsigned long cpu_flags; 4371 spin_lock_bh(&sk->sk_receive_queue.lock);
4372
4373 sctp_spin_lock_irqsave(&sk->sk_receive_queue.lock,
4374 cpu_flags);
4375 skb = skb_peek(&sk->sk_receive_queue); 4372 skb = skb_peek(&sk->sk_receive_queue);
4376 if (skb) 4373 if (skb)
4377 atomic_inc(&skb->users); 4374 atomic_inc(&skb->users);
4378 sctp_spin_unlock_irqrestore(&sk->sk_receive_queue.lock, 4375 spin_unlock_bh(&sk->sk_receive_queue.lock);
4379 cpu_flags);
4380 } else { 4376 } else {
4381 skb = skb_dequeue(&sk->sk_receive_queue); 4377 skb = skb_dequeue(&sk->sk_receive_queue);
4382 } 4378 }
@@ -4686,6 +4682,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
4686 struct sctp_endpoint *newep = newsp->ep; 4682 struct sctp_endpoint *newep = newsp->ep;
4687 struct sk_buff *skb, *tmp; 4683 struct sk_buff *skb, *tmp;
4688 struct sctp_ulpevent *event; 4684 struct sctp_ulpevent *event;
4685 int flags = 0;
4689 4686
4690 /* Migrate socket buffer sizes and all the socket level options to the 4687 /* Migrate socket buffer sizes and all the socket level options to the
4691 * new socket. 4688 * new socket.
@@ -4707,6 +4704,17 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
4707 sctp_sk(newsk)->bind_hash = pp; 4704 sctp_sk(newsk)->bind_hash = pp;
4708 inet_sk(newsk)->num = inet_sk(oldsk)->num; 4705 inet_sk(newsk)->num = inet_sk(oldsk)->num;
4709 4706
4707 /* Copy the bind_addr list from the original endpoint to the new
4708 * endpoint so that we can handle restarts properly
4709 */
4710 if (assoc->peer.ipv4_address)
4711 flags |= SCTP_ADDR4_PEERSUPP;
4712 if (assoc->peer.ipv6_address)
4713 flags |= SCTP_ADDR6_PEERSUPP;
4714 sctp_bind_addr_copy(&newsp->ep->base.bind_addr,
4715 &oldsp->ep->base.bind_addr,
4716 SCTP_SCOPE_GLOBAL, GFP_KERNEL, flags);
4717
4710 /* Move any messages in the old socket's receive queue that are for the 4718 /* Move any messages in the old socket's receive queue that are for the
4711 * peeled off association to the new socket's receive queue. 4719 * peeled off association to the new socket's receive queue.
4712 */ 4720 */