diff options
-rw-r--r-- | net/sctp/ulpqueue.c | 9 |
1 files changed, 8 insertions, 1 deletions
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; |