I tried the smaller diff and I didn't get any crashes. Thank you very much!
On Tue, Dec 8, 2015 at 1:39 AM, Martin Pieuchot <[email protected]> wrote: > On 08/12/15(Tue) 00:50, Aaron Miller wrote: >> Hi Martin, >> >> It appears to work. After patching, rebuilding, and installing the kernel, >> I could use the Internet with a lot of data transfer. I unplugged and >> plugged back in my wifi dongle twice without any crashes, and the >> Internet kept working. >> >> However, I saw a crash I haven't seen before -- no traceback in ddb, >> just a blank screen (but with the LCD backlight on) and the fan >> spinning. Pressing caps lock didn't toggle the LED. >> >> This crash might be because of something else in the current /usr/src >> tree -- I can't rule that out because I was previously using a >> snapshot from two days earlier and some crashing bug could have been >> introduced since then. > > Thanks for testing, I could isolate the fix, diff below is much smaller. > > Is it still ok with it? > > Index: net/route.c > =================================================================== > RCS file: /cvs/src/sys/net/route.c,v > retrieving revision 1.289 > diff -u -p -r1.289 route.c > --- net/route.c 5 Dec 2015 10:07:55 -0000 1.289 > +++ net/route.c 8 Dec 2015 09:07:49 -0000 > @@ -645,6 +645,9 @@ rtdeletemsg(struct rtentry *rt, struct i > static inline int > rtequal(struct rtentry *a, struct rtentry *b) > { > + if (a == b) > + return 1; > + > if (memcmp(rt_key(a), rt_key(b), rt_key(a)->sa_len) == 0 && > rt_plen(a) == rt_plen(b)) > return 1; > @@ -656,10 +659,22 @@ int > rtflushclone1(struct rtentry *rt, void *arg, u_int id) > { > struct rtentry *parent = arg; > + struct ifnet *ifp; > + > + ifp = if_get(rt->rt_ifidx); > + > + /* > + * This happens when an interface with a RTF_CLONING route is > + * being detached. In this case it's safe to bail because all > + * the routes are being purged by rt_if_remove(). > + */ > + if (ifp == NULL) > + return 0; > + > + if (ISSET(rt->rt_flags, RTF_CLONED) && rtequal(rt->rt_parent, parent)) > + rtdeletemsg(rt, ifp, id); > > - if ((rt->rt_flags & RTF_CLONED) != 0 && (rt->rt_parent == parent || > - rtequal(rt->rt_parent, parent))) > - rtdeletemsg(rt, NULL, id); > + if_put(ifp); > return 0; > } >
