On Mon, 14 Feb 2011, r...@objcomp.com.au wrote:

>       There is a code path in rt_senddesync that fails to deallocate an
>       mbuf in the case where sbappendaddr fails.  If sbappendaddr fails,
>       a 200ms timeout is scheduled to retry the operation, but the mbuf
>       remains allocated.
> 
>       The ddb stack trace from a breakpoint set in m_gethdr is:
>               m_gethdr(2,1,d9798eb4,d03e292e,30d40) at m_gethdr
>               rt_msg1(10,0,d9798ed0,d9798ed4,d0202f0d) at rt_msg1+0x45
>               rt_senddesync(d15ed480,d9798f00,d03cbd36,d9798ef4,d1535a80) at 
> rt_senddesync+0x2a

> >Fix:
>       Free any allocated mbuf prior to calling timeout_add in rt_senddesync.

Thanks, that was very helpful.  Does this fix it?

Index: rtsock.c
===================================================================
RCS file: /home/tedu/cvs/src/sys/net/rtsock.c,v
retrieving revision 1.113
diff -u -r1.113 rtsock.c
--- rtsock.c    6 Jan 2011 14:50:11 -0000       1.113
+++ rtsock.c    14 Feb 2011 03:25:54 -0000
@@ -309,6 +309,8 @@
                        rop->flags &= ~ROUTECB_FLAG_DESYNC;
                        sorwakeup(rp->rcb_socket);
                } else {
+                       if (desync_mbuf)
+                                       m_freem(desync_mbuf);
                        /* Re-add timeout to try sending msg again */
                        timeout_add(&rop->timeout, ROUTE_DESYNC_RESEND_TIMEOUT);
                }

Reply via email to