Fix a memory leak Modified: trunk/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c _____
Modified: trunk/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c --- trunk/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c 2006-01-01 11:34:59 UTC (rev 20502) +++ trunk/reactos/drivers/lib/oskittcp/oskittcp/tcp_output.c 2006-01-01 11:41:05 UTC (rev 20503) @@ -69,7 +69,6 @@
#define IS_LOOPBACK_ADDR(addr) \ ((ntohl(addr) & IN_CLASSA_NET) == (IN_LOOPBACKNET << IN_CLASSA_NSHIFT))
- /* * Tcp output routine: figure out what should be sent and send it. */ @@ -87,6 +86,9 @@ int idle, sendalot; struct rmxp_tao *taop; struct rmxp_tao tao_noncached; +#ifdef __REACTOS__ + struct mbuf *n; +#endif
OS_DbgPrint(OSK_MID_TRACE,("Called\n"));
@@ -732,6 +734,18 @@ #endif error = ip_output(m, tp->t_inpcb->inp_options, &tp->t_inpcb->inp_route, so->so_options & SO_DONTROUTE, 0); +#ifdef __REACTOS__ + /* We allocated m, so we are responsible for freeing it. If the mbuf + contains a pointer to an external datablock, we (or rather, m_copy) + didn't allocate it but pointed it to the data to send. So we have + to cheat a little bit and keep M_FREE from freeing the external + data block */ + while (NULL != m) { + m->m_flags &= ~M_EXT; + MFREE(m, n); + m = n; + } +#endif } if (error) { out: