Fixed more socket close problems. You could get through TCPClose, unlock the socket, have somebody else service and even, and unlink the connection object at the same time. Now we hold the TCP lock while removing a connection. Modified: trunk/reactos/drivers/lib/ip/transport/tcp/event.c Modified: trunk/reactos/drivers/net/tcpip/tcpip/fileobjs.c _____
Modified: trunk/reactos/drivers/lib/ip/transport/tcp/event.c --- trunk/reactos/drivers/lib/ip/transport/tcp/event.c 2005-02-23 23:37:06 UTC (rev 13731) +++ trunk/reactos/drivers/lib/ip/transport/tcp/event.c 2005-02-24 08:51:18 UTC (rev 13732) @@ -10,8 +10,6 @@
#include "precomp.h"
-extern VOID DrainSignals(); - int TCPSocketState(void *ClientData, void *WhichSocket, void *WhichConnection, @@ -32,10 +30,9 @@ if( !Connection ) { TI_DbgPrint(DEBUG_TCP,("Socket closing.\n")); Connection = FileFindConnectionByContext( WhichSocket ); - if( !Connection ) { - TcpipRecursiveMutexLeave( &TCPLock ); + if( !Connection ) return 0; - } else + else TI_DbgPrint(DEBUG_TCP,("Found socket %x\n", Connection)); }
_____
Modified: trunk/reactos/drivers/net/tcpip/tcpip/fileobjs.c --- trunk/reactos/drivers/net/tcpip/tcpip/fileobjs.c 2005-02-23 23:37:06 UTC (rev 13731) +++ trunk/reactos/drivers/net/tcpip/tcpip/fileobjs.c 2005-02-24 08:51:18 UTC (rev 13732) @@ -471,8 +471,10 @@
Connection = Request->Handle.ConnectionContext;
+ TcpipRecursiveMutexEnter( &TCPLock, TRUE ); TCPClose(Connection); DeleteConnectionEndpoint(Connection); + TcpipRecursiveMutexLeave( &TCPLock );
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));