aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorDon Lewis <truckman@FreeBSD.org>2004-04-23 19:49:08 +0000
committerDon Lewis <truckman@FreeBSD.org>2004-04-23 19:49:08 +0000
commitac296511a8df8335f24bcde9c6b4c381b5ef4752 (patch)
tree91125e92d3a19b6b0528834f2713afd822f6236d /sys/netinet
parent59bf0f7ebc2651385da631f0b805c953f1418653 (diff)
downloadsrc-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.c24
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;