Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 04 Feb 2013 09:41:32 +0200
From:      Andriy Gapon <avg@FreeBSD.org>
To:        Mark Johnston <markj@FreeBSD.org>
Cc:        svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org
Subject:   Re: svn commit: r246245 - head/sys/netgraph
Message-ID:  <510F662C.1080007@FreeBSD.org>
In-Reply-To: <20130204003701.GA1700@oddish>
References:  <201302021154.r12Bs0tp030831@svn.freebsd.org> <20130204003701.GA1700@oddish>

next in thread | previous in thread | raw e-mail | index | archive | help
on 04/02/2013 02:37 Mark Johnston said the following:
> On Sat, Feb 02, 2013 at 11:54:00AM +0000, Andriy Gapon wrote:
>> Author: avg
>> Date: Sat Feb  2 11:54:00 2013
>> New Revision: 246245
>> URL: http://svnweb.freebsd.org/changeset/base/246245
>>
>> Log:
>>   ng_ether: track interface renaming
>>   
>>   Also sanitize interface names that can potentially contain characters
>>   that are prohibited in netgraph names.
>>   
>>   PR:		kern/154850 (sanitizing of names)
>>   Discussed with:	eri, melifaro
>>   Submitted by:	Nikolay Denev <ndenev@gmail.com> (sanitizing code)
>>   Reviewed by:	eri, glebius
>>   MFC after:	17 days
>>
>> Modified:
>>   head/sys/netgraph/ng_ether.c
>>
> 
> Hi Andriy,
> 
> This commit seems to cause a panic during boot when creating the
> loopback interface. I couldn't get a core dump but the problem seems to
> happen when dereferencing ifp->if_l2com in the IFP2NG macro in
> ng_ether_ifnet_arrival_event(). In the case of lo(4) this pointer seems
> to be NULL (I suppose because lo(4) doesn't register itself in the
> if_com_alloc/free tables).
> 
> The patch below fixes the panic for me.

Mark,

thank you for the report and sorry for the breakage.
Could you please try the following patch (slightly different from your patch)?

diff --git a/sys/netgraph/ng_ether.c b/sys/netgraph/ng_ether.c
index 6266f40..05ea402 100644
--- a/sys/netgraph/ng_ether.c
+++ b/sys/netgraph/ng_ether.c
@@ -410,11 +410,16 @@ static void
 ng_ether_ifnet_arrival_event(void *arg __unused, struct ifnet *ifp)
 {
 	char name[IFNAMSIZ];
-	node_p node = IFP2NG(ifp);
+	node_p node;
+
+	/* Only ethernet interfaces are of interest. */
+	if (ifp->if_type != IFT_ETHER)
+		return;

 	/*
 	 * Just return if it's a new interface without an ng_ether companion.
 	 */
+	node = IFP2NG(ifp);
 	if (node == NULL)
 		return;


> diff --git a/sys/netgraph/ng_ether.c b/sys/netgraph/ng_ether.c
> index 6266f40..f566346 100644
> --- a/sys/netgraph/ng_ether.c
> +++ b/sys/netgraph/ng_ether.c
> @@ -410,7 +410,12 @@ static void
>  ng_ether_ifnet_arrival_event(void *arg __unused, struct ifnet *ifp)
>  {
>  	char name[IFNAMSIZ];
> -	node_p node = IFP2NG(ifp);
> +	node_p node;
> +
> +	if (ifp->if_l2com == NULL)
> +		return;
> +
> +	node = IFP2NG(ifp);
>  
>  	/*
>  	 * Just return if it's a new interface without an ng_ether companion.
> 


-- 
Andriy Gapon



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