summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorsilby <silby@FreeBSD.org>2002-09-22 02:54:07 +0000
committersilby <silby@FreeBSD.org>2002-09-22 02:54:07 +0000
commitf004ac1d6f18cd643f74a0ba48308fc312163e5c (patch)
tree8265a4696ccba53486591f7ece5ae5c169a08208 /sys/netinet
parent54bef63e730f6db9d1b8b7aed9f1872855d8aaa0 (diff)
downloadFreeBSD-src-f004ac1d6f18cd643f74a0ba48308fc312163e5c.zip
FreeBSD-src-f004ac1d6f18cd643f74a0ba48308fc312163e5c.tar.gz
Fix issue where shutdown(socket, SHUT_RD) was effectively
ignored for TCP sockets. NetBSD PR: 18185 Submitted by: Sean Boudreau <seanb@qnx.com> MFC after: 3 days
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/tcp_input.c13
-rw-r--r--sys/netinet/tcp_reass.c13
2 files changed, 20 insertions, 6 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index 3563fff..958a44f 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -1057,8 +1057,12 @@ after_listen:
/*
* Add data to socket buffer.
*/
- m_adj(m, drop_hdrlen); /* delayed header drop */
- sbappend(&so->so_rcv, m);
+ if (so->so_state & SS_CANTRCVMORE) {
+ m_freem(m);
+ } else {
+ m_adj(m, drop_hdrlen); /* delayed header drop */
+ sbappend(&so->so_rcv, m);
+ }
sorwakeup(so);
if (DELAY_ACK(tp)) {
callout_reset(tp->tt_delack, tcp_delacktime,
@@ -2086,7 +2090,10 @@ dodata: /* XXX */
tcpstat.tcps_rcvpack++;
tcpstat.tcps_rcvbyte += tlen;
ND6_HINT(tp);
- sbappend(&so->so_rcv, m);
+ if (so->so_state & SS_CANTRCVMORE)
+ m_freem(m);
+ else
+ sbappend(&so->so_rcv, m);
sorwakeup(so);
} else {
thflags = tcp_reass(tp, th, &tlen, m);
diff --git a/sys/netinet/tcp_reass.c b/sys/netinet/tcp_reass.c
index 3563fff..958a44f 100644
--- a/sys/netinet/tcp_reass.c
+++ b/sys/netinet/tcp_reass.c
@@ -1057,8 +1057,12 @@ after_listen:
/*
* Add data to socket buffer.
*/
- m_adj(m, drop_hdrlen); /* delayed header drop */
- sbappend(&so->so_rcv, m);
+ if (so->so_state & SS_CANTRCVMORE) {
+ m_freem(m);
+ } else {
+ m_adj(m, drop_hdrlen); /* delayed header drop */
+ sbappend(&so->so_rcv, m);
+ }
sorwakeup(so);
if (DELAY_ACK(tp)) {
callout_reset(tp->tt_delack, tcp_delacktime,
@@ -2086,7 +2090,10 @@ dodata: /* XXX */
tcpstat.tcps_rcvpack++;
tcpstat.tcps_rcvbyte += tlen;
ND6_HINT(tp);
- sbappend(&so->so_rcv, m);
+ if (so->so_state & SS_CANTRCVMORE)
+ m_freem(m);
+ else
+ sbappend(&so->so_rcv, m);
sorwakeup(so);
} else {
thflags = tcp_reass(tp, th, &tlen, m);
OpenPOWER on IntegriCloud