svn commit: r197089 - stable/8/sys/netinet
Shteryana Shopova
syrinx at FreeBSD.org
Fri Sep 11 15:07:36 UTC 2009
Author: syrinx
Date: Fri Sep 11 15:07:36 2009
New Revision: 197089
URL: http://svn.freebsd.org/changeset/base/197089
Log:
MFC r196932:
When joining a multicast group, the inp_lookup_mcast_ifp call
does a KASSERT that the group address is multicast, so the
check if this is indeed true and eventually return a EINVAL if not,
should be done before calling inp_lookup_mcast_ifp. This fixes a kernel
crash when calling setsockopt (sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,...)
with invalid group address.
Reviewed by: bms
Approved by: re (kib)
Modified:
stable/8/sys/netinet/in_mcast.c
Modified: stable/8/sys/netinet/in_mcast.c
==============================================================================
--- stable/8/sys/netinet/in_mcast.c Fri Sep 11 13:46:28 2009 (r197088)
+++ stable/8/sys/netinet/in_mcast.c Fri Sep 11 15:07:36 2009 (r197089)
@@ -1899,6 +1899,9 @@ inp_join_group(struct inpcb *inp, struct
ssa->sin.sin_addr = mreqs.imr_sourceaddr;
}
+ if (!IN_MULTICAST(ntohl(gsa->sin.sin_addr.s_addr)))
+ return (EINVAL);
+
ifp = inp_lookup_mcast_ifp(inp, &gsa->sin,
mreqs.imr_interface);
CTR3(KTR_IGMPV3, "%s: imr_interface = %s, ifp = %p",
@@ -1936,6 +1939,9 @@ inp_join_group(struct inpcb *inp, struct
ssa->sin.sin_port = 0;
}
+ if (!IN_MULTICAST(ntohl(gsa->sin.sin_addr.s_addr)))
+ return (EINVAL);
+
if (gsr.gsr_interface == 0 || V_if_index < gsr.gsr_interface)
return (EADDRNOTAVAIL);
ifp = ifnet_byindex(gsr.gsr_interface);
@@ -1948,9 +1954,6 @@ inp_join_group(struct inpcb *inp, struct
break;
}
- if (!IN_MULTICAST(ntohl(gsa->sin.sin_addr.s_addr)))
- return (EINVAL);
-
if (ifp == NULL || (ifp->if_flags & IFF_MULTICAST) == 0)
return (EADDRNOTAVAIL);
More information about the svn-src-stable-8
mailing list