[IP]
authorCameron Gutman <aicommander@gmail.com>
Sat, 24 Apr 2010 22:37:45 +0000 (22:37 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sat, 24 Apr 2010 22:37:45 +0000 (22:37 +0000)
- Don't try to close the connection again if it has already been terminated by the remote peer

svn path=/trunk/; revision=47007

reactos/lib/drivers/ip/transport/tcp/tcp.c

index ae02e4a..187c9a5 100644 (file)
@@ -735,16 +735,24 @@ NTSTATUS TCPClose
     Socket = Connection->SocketContext;
     Connection->SocketContext = NULL;
 
-    /* We need to close here otherwise oskit will never indicate
-     * SEL_FIN and we will never fully close the connection
-     */
-    Status = TCPTranslateError( OskitTCPClose( Socket ) );
+    /* Don't try to close again if the other side closed us already */
+    if (Connection->SignalState != SEL_FIN)
+    {
+       /* We need to close here otherwise oskit will never indicate
+        * SEL_FIN and we will never fully close the connection */
+       Status = TCPTranslateError( OskitTCPClose( Socket ) );
 
-    if (!NT_SUCCESS(Status))
+       if (!NT_SUCCESS(Status))
+       {
+           Connection->SocketContext = Socket;
+           UnlockObject(Connection, OldIrql);
+           return Status;
+       }
+    }
+    else
     {
-        Connection->SocketContext = Socket;
-        UnlockObject(Connection, OldIrql);
-        return Status;
+       /* We are already closed by the other end so return success */
+       Status = STATUS_SUCCESS;
     }
 
     if (Connection->AddressFile)