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: