diff options
author | Don Lewis <truckman@FreeBSD.org> | 2004-04-23 19:49:08 +0000 |
---|---|---|
committer | Don Lewis <truckman@FreeBSD.org> | 2004-04-23 19:49:08 +0000 |
commit | ac296511a8df8335f24bcde9c6b4c381b5ef4752 (patch) | |
tree | 91125e92d3a19b6b0528834f2713afd822f6236d /sys/netinet | |
parent | 59bf0f7ebc2651385da631f0b805c953f1418653 (diff) | |
download | src-ac296511a8df8335f24bcde9c6b4c381b5ef4752.tar.gz src-ac296511a8df8335f24bcde9c6b4c381b5ef4752.zip |
Don't skip the splx() call in *_usr_bind() and *_usr_connect() if the
socket address length check fails. This is similar to the fix in
revision 1.99, except this version of the fix does not move the sanity
checks out from under the spl.
Submitted by: pjd
Pointy hat to: truckman
Notes
Notes:
svn path=/stable/4/; revision=128590
Diffstat (limited to 'sys/netinet')
-rw-r--r-- | sys/netinet/tcp_usrreq.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index efbb434a0dd1..04be91f9a112 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -203,8 +203,10 @@ tcp_usr_bind(struct socket *so, struct sockaddr *nam, struct proc *p) * to them. */ sinp = (struct sockaddr_in *)nam; - if (nam->sa_len != sizeof (*sinp)) - return (EINVAL); + if (nam->sa_len != sizeof (*sinp)) { + error = EINVAL; + goto out; + } if (sinp->sin_family == AF_INET && IN_MULTICAST(ntohl(sinp->sin_addr.s_addr))) { error = EAFNOSUPPORT; @@ -234,8 +236,10 @@ tcp6_usr_bind(struct socket *so, struct sockaddr *nam, struct proc *p) * to them. */ sin6p = (struct sockaddr_in6 *)nam; - if (nam->sa_len != sizeof (*sin6p)) - return (EINVAL); + if (nam->sa_len != sizeof (*sin6p)) { + error = EINVAL; + goto out; + } if (sin6p->sin6_family == AF_INET6 && IN6_IS_ADDR_MULTICAST(&sin6p->sin6_addr)) { error = EAFNOSUPPORT; @@ -326,8 +330,10 @@ tcp_usr_connect(struct socket *so, struct sockaddr *nam, struct proc *p) * Must disallow TCP ``connections'' to multicast addresses. */ sinp = (struct sockaddr_in *)nam; - if (nam->sa_len != sizeof (*sinp)) - return (EINVAL); + if (nam->sa_len != sizeof (*sinp)) { + error = EINVAL; + goto out; + } if (sinp->sin_family == AF_INET && IN_MULTICAST(ntohl(sinp->sin_addr.s_addr))) { error = EAFNOSUPPORT; @@ -358,8 +364,10 @@ tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct proc *p) * Must disallow TCP ``connections'' to multicast addresses. */ sin6p = (struct sockaddr_in6 *)nam; - if (nam->sa_len != sizeof (*sin6p)) - return (EINVAL); + if (nam->sa_len != sizeof (*sin6p)) { + error = EINVAL; + goto out; + } if (sin6p->sin6_family == AF_INET6 && IN6_IS_ADDR_MULTICAST(&sin6p->sin6_addr)) { error = EAFNOSUPPORT; |