Date: Thu, 11 Oct 2007 17:40:03 GMT From: "Craig Rodrigues" <rodrigc@crodrigues.org> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/112490: [route] [patch] Problem in "rt_check" routine. Message-ID: <200710111740.l9BHe3tD035670@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/112490; it has been noted by GNATS. From: "Craig Rodrigues" <rodrigc@crodrigues.org> To: bug-followup@freebsd.org Cc: mehuljv@yahoo.com, jhb@FreeBSD.org Subject: Re: kern/112490: [route] [patch] Problem in "rt_check" routine. Date: Thu, 11 Oct 2007 13:23:34 -0400 --vkogqOf2sHV7VnPd Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, Here is a variation of the patch posted in PR 112490. Ivan Voras has tried testing with this, but it didn't solve the problem mentioned in PR 112490. -- Craig Rodrigues rodrigc@crodrigues.org --vkogqOf2sHV7VnPd Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="a.txt" Index: route.c =================================================================== RCS file: /home/ncvs/src/sys/net/route.c,v retrieving revision 1.120 diff -u -r1.120 route.c --- route.c 11 Jun 2007 12:19:34 -0000 1.120 +++ route.c 11 Oct 2007 17:21:15 -0000 @@ -1281,6 +1281,7 @@ int error; KASSERT(*lrt0 != NULL, ("rt_check")); +try_again: rt = rt0 = *lrt0; /* NB: the locking here is tortuous... */ @@ -1297,11 +1298,19 @@ } /* XXX BSD/OS checks dst->sa_family != AF_NS */ if (rt->rt_flags & RTF_GATEWAY) { - if (rt->rt_gwroute == NULL) + struct rtentry *temp_rt_gwroute = rt->rt_gwroute; + if (temp_rt_gwroute == NULL) goto lookup; rt = rt->rt_gwroute; RT_LOCK(rt); /* NB: gwroute */ + if(rt0->rt_flags & 0x80000000U){ + /*This rt is under process...*/ + RT_UNLOCK(rt); + RT_UNLOCK(rt0); + goto try_again; + } if ((rt->rt_flags & RTF_UP) == 0) { + rt0->rt_flags |= 0x80000000U; RTFREE_LOCKED(rt); /* unlock gwroute */ rt = rt0; lookup: @@ -1315,6 +1324,7 @@ } RT_LOCK(rt0); rt0->rt_gwroute = rt; + rt0->rt_flags &= (~0x80000000U); if (rt == NULL) { RT_UNLOCK(rt0); return (EHOSTUNREACH); --vkogqOf2sHV7VnPd--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200710111740.l9BHe3tD035670>