diff options
| -rw-r--r-- | net/irda/af_irda.c | 3 | ||||
| -rw-r--r-- | net/key/af_key.c | 2 | ||||
| -rw-r--r-- | net/netlink/af_netlink.c | 6 | ||||
| -rw-r--r-- | net/sctp/ulpqueue.c | 9 |
4 files changed, 13 insertions, 7 deletions
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index eabd6838f50a..0eb7d596d470 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c | |||
| @@ -138,7 +138,6 @@ static void irda_disconnect_indication(void *instance, void *sap, | |||
| 138 | sk->sk_shutdown |= SEND_SHUTDOWN; | 138 | sk->sk_shutdown |= SEND_SHUTDOWN; |
| 139 | 139 | ||
| 140 | sk->sk_state_change(sk); | 140 | sk->sk_state_change(sk); |
| 141 | sock_orphan(sk); | ||
| 142 | release_sock(sk); | 141 | release_sock(sk); |
| 143 | 142 | ||
| 144 | /* Close our TSAP. | 143 | /* Close our TSAP. |
| @@ -1446,7 +1445,7 @@ static int irda_recvmsg_stream(struct kiocb *iocb, struct socket *sock, | |||
| 1446 | */ | 1445 | */ |
| 1447 | ret = sock_error(sk); | 1446 | ret = sock_error(sk); |
| 1448 | if (ret) | 1447 | if (ret) |
| 1449 | break; | 1448 | ; |
| 1450 | else if (sk->sk_shutdown & RCV_SHUTDOWN) | 1449 | else if (sk->sk_shutdown & RCV_SHUTDOWN) |
| 1451 | ; | 1450 | ; |
| 1452 | else if (noblock) | 1451 | else if (noblock) |
diff --git a/net/key/af_key.c b/net/key/af_key.c index cf77930ee516..345019345f09 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
| @@ -2072,7 +2072,7 @@ static int pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, in | |||
| 2072 | rq->sadb_x_ipsecrequest_proto = t->id.proto; | 2072 | rq->sadb_x_ipsecrequest_proto = t->id.proto; |
| 2073 | if ((mode = pfkey_mode_from_xfrm(t->mode)) < 0) | 2073 | if ((mode = pfkey_mode_from_xfrm(t->mode)) < 0) |
| 2074 | return -EINVAL; | 2074 | return -EINVAL; |
| 2075 | mode = pfkey_mode_from_xfrm(t->mode); | 2075 | rq->sadb_x_ipsecrequest_mode = mode; |
| 2076 | rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_REQUIRE; | 2076 | rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_REQUIRE; |
| 2077 | if (t->reqid) | 2077 | if (t->reqid) |
| 2078 | rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_UNIQUE; | 2078 | rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_UNIQUE; |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index e73d8f546c6b..c48b0f49f003 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -443,6 +443,7 @@ static int netlink_release(struct socket *sock) | |||
| 443 | return 0; | 443 | return 0; |
| 444 | 444 | ||
| 445 | netlink_remove(sk); | 445 | netlink_remove(sk); |
| 446 | sock_orphan(sk); | ||
| 446 | nlk = nlk_sk(sk); | 447 | nlk = nlk_sk(sk); |
| 447 | 448 | ||
| 448 | spin_lock(&nlk->cb_lock); | 449 | spin_lock(&nlk->cb_lock); |
| @@ -457,7 +458,6 @@ static int netlink_release(struct socket *sock) | |||
| 457 | /* OK. Socket is unlinked, and, therefore, | 458 | /* OK. Socket is unlinked, and, therefore, |
| 458 | no new packets will arrive */ | 459 | no new packets will arrive */ |
| 459 | 460 | ||
| 460 | sock_orphan(sk); | ||
| 461 | sock->sk = NULL; | 461 | sock->sk = NULL; |
| 462 | wake_up_interruptible_all(&nlk->wait); | 462 | wake_up_interruptible_all(&nlk->wait); |
| 463 | 463 | ||
| @@ -1412,9 +1412,9 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, | |||
| 1412 | return -ECONNREFUSED; | 1412 | return -ECONNREFUSED; |
| 1413 | } | 1413 | } |
| 1414 | nlk = nlk_sk(sk); | 1414 | nlk = nlk_sk(sk); |
| 1415 | /* A dump is in progress... */ | 1415 | /* A dump or destruction is in progress... */ |
| 1416 | spin_lock(&nlk->cb_lock); | 1416 | spin_lock(&nlk->cb_lock); |
| 1417 | if (nlk->cb) { | 1417 | if (nlk->cb || sock_flag(sk, SOCK_DEAD)) { |
| 1418 | spin_unlock(&nlk->cb_lock); | 1418 | spin_unlock(&nlk->cb_lock); |
| 1419 | netlink_destroy_callback(cb); | 1419 | netlink_destroy_callback(cb); |
| 1420 | sock_put(sk); | 1420 | sock_put(sk); |
diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c index bfb197e37da3..b29e3e4b72c9 100644 --- a/net/sctp/ulpqueue.c +++ b/net/sctp/ulpqueue.c | |||
| @@ -190,7 +190,14 @@ int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event) | |||
| 190 | if (!sctp_sk(sk)->pd_mode) { | 190 | if (!sctp_sk(sk)->pd_mode) { |
| 191 | queue = &sk->sk_receive_queue; | 191 | queue = &sk->sk_receive_queue; |
| 192 | } else if (ulpq->pd_mode) { | 192 | } else if (ulpq->pd_mode) { |
| 193 | if (event->msg_flags & MSG_NOTIFICATION) | 193 | /* If the association is in partial delivery, we |
| 194 | * need to finish delivering the partially processed | ||
| 195 | * packet before passing any other data. This is | ||
| 196 | * because we don't truly support stream interleaving. | ||
| 197 | */ | ||
| 198 | if ((event->msg_flags & MSG_NOTIFICATION) || | ||
| 199 | (SCTP_DATA_NOT_FRAG == | ||
| 200 | (event->msg_flags & SCTP_DATA_FRAG_MASK))) | ||
| 194 | queue = &sctp_sk(sk)->pd_lobby; | 201 | queue = &sctp_sk(sk)->pd_lobby; |
| 195 | else { | 202 | else { |
| 196 | clear_pd = event->msg_flags & MSG_EOR; | 203 | clear_pd = event->msg_flags & MSG_EOR; |
