Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Apr 2010 15:07:08 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r207277 - in head/sys: netinet netinet6
Message-ID:  <201004271507.o3RF78XG042814@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Tue Apr 27 15:07:08 2010
New Revision: 207277
URL: http://svn.freebsd.org/changeset/base/207277

Log:
  Enhance the historic behaviour of raw sockets and jails in a way
  that we allow all possible jail IPs as source address rather than
  forcing the "primary". While IPv6 naturally has source address
  selection, for legacy IP we do not go through the pain in case
  IP_HDRINCL was not set. People should bind(2) for that.
  
  This will, for example, allow ping(|6) -S to work correctly for
  non-primary addresses.
  
  Reported by:	(ten 211.ru)
  Tested by:	(ten 211.ru)
  MFC after:	4 days

Modified:
  head/sys/netinet/raw_ip.c
  head/sys/netinet6/raw_ip6.c

Modified: head/sys/netinet/raw_ip.c
==============================================================================
--- head/sys/netinet/raw_ip.c	Tue Apr 27 15:05:03 2010	(r207276)
+++ head/sys/netinet/raw_ip.c	Tue Apr 27 15:07:08 2010	(r207277)
@@ -427,11 +427,24 @@ rip_output(struct mbuf *m, struct socket
 		ip->ip_p = inp->inp_ip_p;
 		ip->ip_len = m->m_pkthdr.len;
 		ip->ip_src = inp->inp_laddr;
-		error = prison_get_ip4(inp->inp_cred, &ip->ip_src);
-		if (error != 0) {
-			INP_RUNLOCK(inp);
-			m_freem(m);
-			return (error);
+		if (jailed(inp->inp_cred)) {
+			/*
+			 * prison_local_ip4() would be good enough but would
+			 * let a source of INADDR_ANY pass, which we do not
+			 * want to see from jails. We do not go through the
+			 * pain of in_pcbladdr() for raw sockets.
+			 */
+			if (ip->ip_src.s_addr == INADDR_ANY)
+				error = prison_get_ip4(inp->inp_cred,
+				    &ip->ip_src);
+			else
+				error = prison_local_ip4(inp->inp_cred,
+				    &ip->ip_src);
+			if (error != 0) {
+				INP_RUNLOCK(inp);
+				m_freem(m);
+				return (error);
+			}
 		}
 		ip->ip_dst.s_addr = dst;
 		ip->ip_ttl = inp->inp_ip_ttl;

Modified: head/sys/netinet6/raw_ip6.c
==============================================================================
--- head/sys/netinet6/raw_ip6.c	Tue Apr 27 15:05:03 2010	(r207276)
+++ head/sys/netinet6/raw_ip6.c	Tue Apr 27 15:07:08 2010	(r207277)
@@ -465,7 +465,7 @@ rip6_output(m, va_alist)
 	    &oifp, &in6a);
 	if (error)
 		goto bad;
-	error = prison_get_ip6(in6p->inp_cred, &in6a);
+	error = prison_check_ip6(in6p->inp_cred, &in6a);
 	if (error != 0)
 		goto bad;
 	ip6->ip6_src = in6a;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004271507.o3RF78XG042814>