Author: cmihail
Date: Mon May 16 13:00:34 2011
New Revision: 51781

URL: http://svn.reactos.org/svn/reactos?rev=51781&view=rev
Log:
Make kernel not crash when trying to accept in incoming tcp connection. The 
problem is in TCPAcceptEventHandler, where calling the LibTCPAccept function 
would cause an assert to fail in LibTCPAccept. We just set the state of the pcb 
to LISTEN and after calling LibTCPAccept we set it to ESTABLISHED. The 
connection still fails but at least the kernel doesn't crash. Needs further 
serious investigation.

Modified:
    branches/GSoC_2011/TcpIpDriver/lib/drivers/ip/transport/tcp/event.c

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=51781&r1=51780&r2=51781&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 May 16 13:00:34 2011
@@ -114,7 +114,7 @@
     NTSTATUS Status;
     KIRQL OldIrql;
     
-    DbgPrint("TCPAcceptEventHandler\n");
+    DbgPrint("TCPAcceptEventHandler] Called\n");
     
     ReferenceObject(Connection);
     
@@ -126,7 +126,7 @@
         Irp = Bucket->Request.RequestContext;
         IrpSp = IoGetCurrentIrpStackLocation( Irp );
         
-        TI_DbgPrint(DEBUG_TCP,("Getting the socket\n"));
+        TI_DbgPrint(DEBUG_TCP,("[TCPAcceptEventHandler] Getting the 
socket\n"));
         
         Status = TCPCheckPeerForAccept(newpcb,
                                        
(PTDI_REQUEST_KERNEL)&IrpSp->Parameters);
@@ -136,22 +136,27 @@
         Bucket->Status = Status;
         Bucket->Information = 0;
         
-        DbgPrint("Associated with: 0x%x\n", 
Bucket->AssociatedEndpoint->SocketContext);
-        
-        DbgPrint("Completing accept event %x\n", Status);
+        DbgPrint("[TCPAcceptEventHandler] Associated with: 0x%x\n", 
Bucket->AssociatedEndpoint->SocketContext);
+        
+        DbgPrint("[TCPAcceptEventHandler] Completing accept event %x\n", 
Status);
         
         Complete = Bucket->Request.RequestNotifyObject;
         
         if (Status == STATUS_SUCCESS)
         {
+            newpcb->state = LISTEN;
             LockObject(Bucket->AssociatedEndpoint, &OldIrql);
             Bucket->AssociatedEndpoint->SocketContext = newpcb;
+            DbgPrint("[TCPAcceptEventHandler] LibTCPAccept coming up\n");
             
             LibTCPAccept(newpcb, Bucket->AssociatedEndpoint);
+
+            DbgPrint("[TCPAcceptEventHandler] Trying to unlock 
Bucket->AssociatedEndpoint\n");
             UnlockObject(Bucket->AssociatedEndpoint, OldIrql);
+            newpcb->state = ESTABLISHED;
         }
         
-        DbgPrint("Done!\n");
+        DbgPrint("[TCPAcceptEventHandler] Done!\n");
         
         Complete(Bucket->Request.RequestContext, Bucket->Status, 
Bucket->Information);
             
@@ -172,7 +177,7 @@
     NTSTATUS Status;
     PMDL Mdl;
     
-    DbgPrint("TCPSendEventHandler\n");
+    DbgPrint("[TCPSendEventHandler] Called\n");
     
     ReferenceObject(Connection);
 
@@ -248,7 +253,7 @@
     
     ReferenceObject(Connection);
     
-    DbgPrint("TCPRecvEventHandler\n");
+    DbgPrint("[TCPRecvEventHandler] Called\n");
     
     if ((Entry = ExInterlockedRemoveHeadList(&Connection->ReceiveRequest, 
&Connection->Lock))) {
         Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
@@ -304,25 +309,28 @@
     PTDI_BUCKET Bucket;
     PLIST_ENTRY Entry;
     
-    DbgPrint("TCPConnectEventHandler\n");
-    
-    ReferenceObject(Connection);
-    
-    while ((Entry = ExInterlockedRemoveHeadList(&Connection->ConnectRequest, 
&Connection->Lock))) {
+    DbgPrint("[TCPConnectEventHandler] Called\n");
+    
+    ReferenceObject(Connection);
+    
+    while ((Entry = ExInterlockedRemoveHeadList(&Connection->ConnectRequest, 
&Connection->Lock)))
+    {
         
         Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry );
         
         Bucket->Status = TCPTranslateError(err);
         Bucket->Information = 0;
         
-        DbgPrint("Completing connection request! (0x%x)\n", err);
-        
-        Complete = Bucket->Request.RequestNotifyObject;
-        
-        Complete(Bucket->Request.RequestContext, Bucket->Status, 
Bucket->Information);
-        
-        ExFreePoolWithTag(Bucket, TDI_BUCKET_TAG);
-    }
+        DbgPrint("[TCPConnectEventHandler] Completing connection request! 
(0x%x)\n", err);
+        
+        Complete = Bucket->Request.RequestNotifyObject;
+        
+        Complete(Bucket->Request.RequestContext, Bucket->Status, 
Bucket->Information);
+        
+        ExFreePoolWithTag(Bucket, TDI_BUCKET_TAG);
+    }
+
+    DbgPrint("[TCPConnectEventHandler] Done\n");
     
     DereferenceObject(Connection);
 }


Reply via email to