summaryrefslogtreecommitdiffstats
path: root/sys/netinet6
diff options
context:
space:
mode:
authorsmh <smh@FreeBSD.org>2017-04-14 22:02:08 +0000
committersmh <smh@FreeBSD.org>2017-04-14 22:02:08 +0000
commit538996dc06eb821c841b6c90813605770644f7f9 (patch)
treefbde83838b452d8442845d0dd1e4cbad48fbb681 /sys/netinet6
parent0d14ffec9a63f0c4e2f2a6a95805c0b85828a324 (diff)
downloadFreeBSD-src-538996dc06eb821c841b6c90813605770644f7f9.zip
FreeBSD-src-538996dc06eb821c841b6c90813605770644f7f9.tar.gz
MFC r316313, r316328:
Allow explicitly assigned IPv4 & IPv6 loopback addresses to be used in jails. Relnotes: Yes Sponsored by: Multiplay
Diffstat (limited to 'sys/netinet6')
-rw-r--r--sys/netinet6/in6_jail.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/sys/netinet6/in6_jail.c b/sys/netinet6/in6_jail.c
index f774805..8e0de66 100644
--- a/sys/netinet6/in6_jail.c
+++ b/sys/netinet6/in6_jail.c
@@ -293,12 +293,6 @@ prison_local_ip6(struct ucred *cred, struct in6_addr *ia6, int v6only)
return (EAFNOSUPPORT);
}
- if (IN6_IS_ADDR_LOOPBACK(ia6)) {
- bcopy(&pr->pr_ip6[0], ia6, sizeof(struct in6_addr));
- mtx_unlock(&pr->pr_mtx);
- return (0);
- }
-
if (IN6_IS_ADDR_UNSPECIFIED(ia6)) {
/*
* In case there is only 1 IPv6 address, and v6only is true,
@@ -311,6 +305,11 @@ prison_local_ip6(struct ucred *cred, struct in6_addr *ia6, int v6only)
}
error = prison_check_ip6_locked(pr, ia6);
+ if (error == EADDRNOTAVAIL && IN6_IS_ADDR_LOOPBACK(ia6)) {
+ bcopy(&pr->pr_ip6[0], ia6, sizeof(struct in6_addr));
+ error = 0;
+ }
+
mtx_unlock(&pr->pr_mtx);
return (error);
}
@@ -341,7 +340,8 @@ prison_remote_ip6(struct ucred *cred, struct in6_addr *ia6)
return (EAFNOSUPPORT);
}
- if (IN6_IS_ADDR_LOOPBACK(ia6)) {
+ if (IN6_IS_ADDR_LOOPBACK(ia6) &&
+ prison_check_ip6_locked(pr, ia6) == EADDRNOTAVAIL) {
bcopy(&pr->pr_ip6[0], ia6, sizeof(struct in6_addr));
mtx_unlock(&pr->pr_mtx);
return (0);
@@ -357,9 +357,8 @@ prison_remote_ip6(struct ucred *cred, struct in6_addr *ia6)
/*
* Check if given address belongs to the jail referenced by cred/prison.
*
- * Returns 0 if jail doesn't restrict IPv6 or if address belongs to jail,
- * EADDRNOTAVAIL if the address doesn't belong, or EAFNOSUPPORT if the jail
- * doesn't allow IPv6.
+ * Returns 0 if address belongs to jail,
+ * EADDRNOTAVAIL if the address doesn't belong to the jail.
*/
int
prison_check_ip6_locked(const struct prison *pr, const struct in6_addr *ia6)
OpenPOWER on IntegriCloud