summaryrefslogtreecommitdiffstats
path: root/sys/netinet/tcp_usrreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet/tcp_usrreq.c')
-rw-r--r--sys/netinet/tcp_usrreq.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index 38e82edc26c..de6ee75474f 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tcp_usrreq.c,v 1.33 1999/03/24 02:28:21 cmetz Exp $ */
+/* $OpenBSD: tcp_usrreq.c,v 1.34 1999/07/02 20:39:08 cmetz Exp $ */
/* $NetBSD: tcp_usrreq.c,v 1.20 1996/02/13 23:44:16 christos Exp $ */
/*
@@ -466,7 +466,7 @@ tcp_usrreq(so, req, m, nam, control)
panic("tcp_usrreq");
}
if (tp && (so->so_options & SO_DEBUG))
- tcp_trace(TA_USER, ostate, tp, (struct tcpiphdr *)0, req, 0);
+ tcp_trace(TA_USER, ostate, tp, (caddr_t)0, req, 0);
splx(s);
return (error);
}
@@ -531,7 +531,13 @@ tcp_ctloutput(op, so, level, optname, mp)
break;
case TCP_MAXSEG:
- if (m && (i = *mtod(m, int *)) > 0 && i <= tp->t_maxseg)
+ if (m == NULL || m->m_len < sizeof (int)) {
+ error = EINVAL;
+ break;
+ }
+
+ i = *mtod(m, int *);
+ if (i > 0 && i <= tp->t_maxseg)
tp->t_maxseg = i;
else
error = EINVAL;
@@ -539,8 +545,20 @@ tcp_ctloutput(op, so, level, optname, mp)
#ifdef TCP_SACK
case TCP_SACK_DISABLE:
- i = *mtod(m, int *);
- tp->sack_disable = i;
+ if (m == NULL || m->m_len < sizeof (int)) {
+ error = EINVAL;
+ break;
+ }
+
+ if (TCPS_HAVEESTABLISHED(tp->t_state)) {
+ error = EPERM;
+ break;
+ }
+
+ if (*mtod(m, int *))
+ tp->sack_disable = 1;
+ else
+ tp->sack_disable = 0;
break;
#endif
default: