diff options
Diffstat (limited to 'sys/netinet/tcp_usrreq.c')
-rw-r--r-- | sys/netinet/tcp_usrreq.c | 28 |
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: |