Author: cmihail Date: Wed Jul 20 11:11:40 2011 New Revision: 52734
URL: http://svn.reactos.org/svn/reactos?rev=52734&view=rev Log: [lwIP] - Fix another race condition caused crash bug
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/driver... ============================================================================== --- branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c [iso-8859-1] (original) +++ branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c [iso-8859-1] Wed Jul 20 11:11:40 2011 @@ -60,6 +60,8 @@ { DbgPrint("[lwIP, InternalSendEventHandler] SendEvent (0x%x, 0x%x, %d)\n", arg, pcb, (unsigned int)space); + + ASSERT(pcb->sent != 0);
/* Make sure the socket didn't get closed */ if (!arg) return ERR_OK; @@ -79,6 +81,8 @@
DbgPrint("[lwIP, InternalRecvEventHandler] RecvEvent (0x%x, pcb = 0x%x, pbuf = 0x%x, err = %d)\n", arg, pcb, p, (unsigned int)err); + + ASSERT(pcb->recv != NULL);
/* Make sure the socket didn't get closed */ if (!arg) @@ -588,7 +592,12 @@ { struct shutdown_callback_msg *msg = arg;
- if (msg->Pcb->state == ESTABLISHED || msg->Pcb->state == SYN_RCVD) + /* + We check here if the pcb is in state ESTABLISHED or SYN_RECV because otherwise + it means lwIP will take care of it anyway and if it does so before us it will + cause memory corruption. + */ + if ((msg->Pcb->state == ESTABLISHED) || (msg->Pcb->state == SYN_RCVD)) { msg->Error = tcp_shutdown(msg->Pcb, msg->shut_rx, msg->shut_tx); } @@ -604,7 +613,7 @@ struct shutdown_callback_msg *msg; err_t ret;
- DbgPrint("[lwIP, LibTCPShutdown] Called on pcb = 0x%x with rx = %d, tx = %d\n", pcb, shut_rx, shut_tx); + DbgPrint("[lwIP, LibTCPShutdown] Called on pcb = 0x%x, rx = %d, tx = %d\n", pcb, shut_rx, shut_tx);
if (!pcb) { @@ -658,6 +667,12 @@ { struct close_callback_msg *msg = arg;
+ if (msg->Pcb->state == CLOSED) + { + DbgPrint("[lwIP, LibTCPCloseCallback] Connection was closed on us\n"); + msg->Error = ERR_OK; + } + if (msg->Pcb->state == LISTEN) { DbgPrint("[lwIP, LibTCPCloseCallback] Closing a listener\n");