On Sun, Jan 18, 2015 at 02:07:40PM +0100, Martin Pieuchot wrote:
> Hello Peter,
> 
> On 18/01/15(Sun) 13:45, [email protected] wrote:
> > >Synopsis:  Crash triggered by ifconfig up on urtwn interface with post 
> > >usb3 snapshots 
> > >Category: amd64 kernel
> > >Environment:
> >     System      : OpenBSD 5.7
> >     Details     : OpenBSD 5.7-beta (GENERIC.MP) #788: Sat Jan 17 07:35:25 
> > MST 2015
> >                      
> > [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> > 
> >     Architecture: OpenBSD.amd64
> >     Machine     : amd64
> > >Description:
> >     After the recent USB changes, my urtwn would lose link significantly 
> > more often than previous. At most times
> >     netstart urtwn0 would produce desired effect, however every 5 or 6 
> > times the machine would crash. 
> >     Photos of the desired post crash output are at 
> > http://www.bsdly.net/~peter/20150118_crash/ 
> > >How-To-Repeat:
> >     amd64 machine with usb3 only ports, no bios option to downshift to 
> > older mode. use urtwn wifi dongle,
> >     when link drops, use /etc/netstart to re-establish link. every 5 to 6 
> > times, the system crashes.        
> 
> Thanks for the bug report.  Due to the existing problem with xhci(4) on 
> Intel hardware and the fact that urtwn(4) does not bring itself down
> when the interface times out, you're exercising some unusual code path
> in the network stack.
> 
> And you found a regression the hard way.  Sorry for that, diff below
> should fix it.  Well it won't make your urtwn(4) work better, but at
> least it should not panic(9) your kernel.
> 
> Index: route.c
> ===================================================================
> RCS file: /cvs/src/sys/net/route.c,v
> retrieving revision 1.199
> diff -u -p -r1.199 route.c
> --- route.c   13 Jan 2015 12:14:00 -0000      1.199
> +++ route.c   18 Jan 2015 13:02:00 -0000
> @@ -1045,8 +1045,10 @@ rt_checkgate(struct ifnet *ifp, struct r
>  
>       if ((rt->rt_flags & RTF_UP) == 0) {
>               rt = rtalloc(dst, RT_REPORT|RT_RESOLVE, rtableid);
> +             if (rt == NULL)
> +                     return (EHOSTUNREACH);
>               rt->rt_refcnt--;
> -             if (rt == NULL || rt->rt_ifp != ifp)
> +             if (rt->rt_ifp != ifp)
>                       return (EHOSTUNREACH);
>       }
>  
> 

OK claudio@ on this diff.

-- 
:wq Claudio

Reply via email to