diff options
author | Neil Horman <nhorman@tuxdriver.com> | 2005-12-03 05:30:06 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-12-03 05:30:06 +0100 |
commit | 6736dc35e9e1b9c8084d5c362a429a3e8189af6b (patch) | |
tree | eeead909e51390c8e5c3df73bcf3dbddbba71575 /net/sctp | |
parent | Revert "[SCSI] fix usb storage oops" (diff) | |
download | linux-6736dc35e9e1b9c8084d5c362a429a3e8189af6b.tar.xz linux-6736dc35e9e1b9c8084d5c362a429a3e8189af6b.zip |
[SCTP]: Return socket errors only if the receive queue is empty.
This patch fixes an issue where it is possible to get valid data after
a ENOTCONN error. It returns socket errors only after data queued on
socket receive queue is consumed.
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/socket.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index abab81f3818f..d890dfa8818f 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -4743,11 +4743,6 @@ static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, struct sk_buff *skb; long timeo; - /* Caller is allowed not to check sk->sk_err before calling. */ - error = sock_error(sk); - if (error) - goto no_packet; - timeo = sock_rcvtimeo(sk, noblock); SCTP_DEBUG_PRINTK("Timeout: timeo: %ld, MAX: %ld.\n", @@ -4774,6 +4769,11 @@ static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, if (skb) return skb; + /* Caller is allowed not to check sk->sk_err before calling. */ + error = sock_error(sk); + if (error) + goto no_packet; + if (sk->sk_shutdown & RCV_SHUTDOWN) break; |