svn commit: r213249 - stable/6/sys/netinet
Bjoern A. Zeeb
bz at FreeBSD.org
Tue Sep 28 19:17:40 UTC 2010
Author: bz
Date: Tue Sep 28 19:17:39 2010
New Revision: 213249
URL: http://svn.freebsd.org/changeset/base/213249
Log:
r201663 introduced a bug in stable/6 that prison_ip() might change the
passed address argument, while we are only interested in whether it is a
valid address of the jail.
This can modify an address in the live interface address list with an
address of the jail. Make a copy of the address for the call to
prison_ip() to avoid this.
Reported by: Andreas Longwitz (longwitz incore.de)
Tested by: Andreas Longwitz (longwitz incore.de)
PR: kern/114325
Modified:
stable/6/sys/netinet/in.c
Modified: stable/6/sys/netinet/in.c
==============================================================================
--- stable/6/sys/netinet/in.c Tue Sep 28 15:33:30 2010 (r213248)
+++ stable/6/sys/netinet/in.c Tue Sep 28 19:17:39 2010 (r213249)
@@ -252,12 +252,15 @@ in_control(so, cmd, data, ifp, td)
* the first one on the interface, if possible.
*/
if (ifp) {
+ struct in_addr tmp;
+
dst = ((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr;
LIST_FOREACH(iap, INADDR_HASH(dst.s_addr), ia_hash)
if (iap->ia_ifp == ifp &&
iap->ia_addr.sin_addr.s_addr == dst.s_addr) {
+ tmp.s_addr = dst.s_addr;
if (td == NULL || !prison_ip(
- td->td_ucred, 0, &dst.s_addr))
+ td->td_ucred, 0, &tmp.s_addr))
ia = iap;
break;
}
@@ -265,9 +268,11 @@ in_control(so, cmd, data, ifp, td)
TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
iap = ifatoia(ifa);
if (iap->ia_addr.sin_family == AF_INET) {
+ tmp.s_addr =
+ iap->ia_addr.sin_addr.s_addr;
if (td != NULL &&
prison_ip(td->td_ucred, 0,
- &iap->ia_addr.sin_addr.s_addr))
+ &tmp.s_addr))
continue;
ia = iap;
break;
More information about the svn-src-stable-6
mailing list