Author: cmihail
Date: Mon Jun 20 21:37:32 2011
New Revision: 52395

URL: http://svn.reactos.org/svn/reactos?rev=52395&view=rev
Log:
[lwIP]
- Abort the connection if the socket is not in LISTEN state, instead of closing 
it
[TCPIP]
- move redundant socket closure where so we don't try to free uninitialized 
variable
- in case our socket got closed or for some reason doesn't exist return a 
default success

Modified:
    branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/connect.c
    branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/event.c
    branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/tcp.c
    branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c

Modified: branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/connect.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/connect.c?rev=52395&r1=52394&r2=52395&view=diff
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/connect.c 
[iso-8859-1] (original)
+++ branches/GSoC_2011/TcpIpDriver/drivers/network/afd/afd/connect.c 
[iso-8859-1] Mon Jun 20 21:37:32 2011
@@ -281,7 +281,7 @@
 
     AFD_DbgPrint(MID_TRACE,("Called: FCB %x, FO %x\n",
                            Context, FCB->FileObject));
-    DbgPrint("[StreamSocketConnectComplete] Called: FCB %x, FO %x\n",
+    DbgPrint("[AFD, StreamSocketConnectComplete] Called: FCB 0x%x, FO 0x%x\n",
                            Context, FCB->FileObject);
 
     /* I was wrong about this before as we can have pending writes to a not
@@ -333,7 +333,7 @@
            NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, 
Tail.Overlay.ListEntry);
            
         AFD_DbgPrint(MID_TRACE,("Completing connect %x\n", NextIrp));
-        DbgPrint("[StreamSocketConnectComplete] Completing connect %x\n", 
NextIrp);
+        DbgPrint("[AFD, StreamSocketConnectComplete] Completing connect 
0x%x\n", NextIrp);
            
         NextIrp->IoStatus.Status = Status;
            NextIrp->IoStatus.Information = NT_SUCCESS(Status) ? 
((ULONG_PTR)FCB->Connection.Handle) : 0;
@@ -410,7 +410,7 @@
                                       0 );
 
     AFD_DbgPrint(MID_TRACE,("Connect request:\n"));
-    DbgPrint("[AfdStreamSocketConnect] Connect request:\n");
+    DbgPrint("[AFD, AfdStreamSocketConnect] Connect request:\n");
 #if 0
     OskitDumpBuffer
        ( (PCHAR)ConnectReq,
@@ -420,8 +420,7 @@
     if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
     {
         if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
-        FCB->RemoteAddress =
-               TaCopyTransportAddress( &ConnectReq->RemoteAddress );
+            FCB->RemoteAddress = TaCopyTransportAddress( 
&ConnectReq->RemoteAddress );
 
         if( !FCB->RemoteAddress )
                Status = STATUS_NO_MEMORY;
@@ -440,10 +439,10 @@
         case SOCKET_STATE_CONNECTING:
                return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT );
 
-    case SOCKET_STATE_CREATED:
-       if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress );
-       FCB->LocalAddress =
-           TaBuildNullTransportAddress( 
ConnectReq->RemoteAddress.Address[0].AddressType );
+        case SOCKET_STATE_CREATED:
+               if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress );
+                   FCB->LocalAddress = TaBuildNullTransportAddress(
+                    ConnectReq->RemoteAddress.Address[0].AddressType);
 
                if( FCB->LocalAddress )
             {
@@ -460,9 +459,10 @@
         /* Drop through to SOCKET_STATE_BOUND */
 
         case SOCKET_STATE_BOUND:
-               if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
-                   FCB->RemoteAddress =
-                       TaCopyTransportAddress( &ConnectReq->RemoteAddress );
+               if( FCB->RemoteAddress )
+                ExFreePool( FCB->RemoteAddress );
+               
+            FCB->RemoteAddress = TaCopyTransportAddress( 
&ConnectReq->RemoteAddress );
 
                if( !FCB->RemoteAddress )
             {
@@ -475,13 +475,10 @@
                if( !NT_SUCCESS(Status) )
                    break;
 
-               Status = TdiBuildConnectionInfo
-                   ( &FCB->ConnectInfo,
-                     &ConnectReq->RemoteAddress );
+               Status = TdiBuildConnectionInfo(&FCB->ConnectInfo, 
&ConnectReq->RemoteAddress);
 
             if( NT_SUCCESS(Status) )
-                Status = TdiBuildConnectionInfo(&TargetAddress,
-                                               &ConnectReq->RemoteAddress);
+                Status = TdiBuildConnectionInfo(&TargetAddress, 
&ConnectReq->RemoteAddress);
             else break;
 
                if( NT_SUCCESS(Status) )
@@ -502,7 +499,7 @@
                     ExFreePool(TargetAddress);
 
                    AFD_DbgPrint(MID_TRACE,("Queueing IRP %x\n", Irp));
-                DbgPrint("[AfdStreamSocketConnect] Queueing IRP %x\n", Irp);
+                DbgPrint("[AFD, AfdStreamSocketConnect] Queueing IRP %x\n", 
Irp);
 
                    if( Status == STATUS_PENDING )
                 {
@@ -515,7 +512,7 @@
         default:
                AFD_DbgPrint(MID_TRACE,("Inappropriate socket state %d for 
connect\n",
                                        FCB->State));
-            DbgPrint("[AfdStreamSocketConnect] Inappropriate socket state %d 
for connect\n",
+            DbgPrint("[AFD, AfdStreamSocketConnect] Inappropriate socket state 
%d for connect\n",
                         FCB->State);
                break;
     }

Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/event.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/event.c?rev=52395&r1=52394&r2=52395&view=diff
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/event.c 
[iso-8859-1] (original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/event.c 
[iso-8859-1] Mon Jun 20 21:37:32 2011
@@ -202,6 +202,10 @@
 
             DbgPrint("[IP, TCPAcceptEventHandler] Trying to unlock 
Bucket->AssociatedEndpoint\n");
             UnlockObject(Bucket->AssociatedEndpoint, OldIrql);
+
+            /*  free socket context created in FileOpenConnection, as we're 
using a new
+                one; we free it asynchornously because otherwise we create a 
dedlock */
+            ChewCreate(SocketContextCloseWorker, OldSocketContext);
         }
         
         DereferenceObject(Bucket->AssociatedEndpoint);
@@ -212,10 +216,6 @@
     }
     
     DereferenceObject(Connection);
-
-    /*  free socket context created in FileOpenConnection, as we're using a new
-        one; we free it asynchornously because otherwise we create a dedlock */
-    ChewCreate(SocketContextCloseWorker, OldSocketContext);
 }
 
 VOID

Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/tcp.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/tcp.c?rev=52395&r1=52394&r2=52395&view=diff
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/tcp.c 
[iso-8859-1] (original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/tcp.c 
[iso-8859-1] Mon Jun 20 21:37:32 2011
@@ -347,14 +347,23 @@
 
     LockObject(Connection, &OldIrql);
 
-    if (Flags & TDI_DISCONNECT_RELEASE)
-    {
-        Status = LibTCPShutdown(Connection->SocketContext, 0, 1);
-    }
-
-    if ((Flags & TDI_DISCONNECT_ABORT) || !Flags)
-    {
-        Status = LibTCPShutdown(Connection->SocketContext, 1, 1);
+    if (Connection->SocketContext)
+    {
+        if (Flags & TDI_DISCONNECT_RELEASE)
+        {
+            Status = 
TCPTranslateError(LibTCPShutdown(Connection->SocketContext, 0, 1));
+        }
+
+        if ((Flags & TDI_DISCONNECT_ABORT) || !Flags)
+        {
+            Status = 
TCPTranslateError(LibTCPShutdown(Connection->SocketContext, 1, 1));
+        }
+    }
+    else
+    {
+        /* We already got closed by the other side so just return success */
+        DbgPrint("[IP, TCPDisconnect] Socket was alraedy clsoed on the other 
side\n");
+        Status = STATUS_SUCCESS;
     }
     
     DbgPrint("LibTCPShutdown: %x\n", Status);

Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c?rev=52395&r1=52394&r2=52395&view=diff
==============================================================================
--- 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] 
Mon Jun 20 21:37:32 2011
@@ -612,7 +612,17 @@
 {
     struct close_callback_msg *msg = arg;
     
-    msg->Error = tcp_close(msg->Pcb);
+    if (msg->Pcb->state == LISTEN)
+    {
+        DbgPrint("[lwIP, LibTCPCloseCallback] Closing a listener\n");
+        msg->Error = tcp_close(msg->Pcb);
+    }
+    else
+    {
+        DbgPrint("[lwIP, LibTCPCloseCallback] Aborting a connection\n");
+        tcp_abort(msg->Pcb);
+        msg->Error = ERR_OK;
+    }
     
     KeSetEvent(&msg->Event, IO_NO_INCREMENT, FALSE);
 }


Reply via email to