- Restore the worker in the loopback code because we can enter the loopback code...
authorCameron Gutman <aicommander@gmail.com>
Fri, 15 Jan 2010 18:01:52 +0000 (18:01 +0000)
committerCameron Gutman <aicommander@gmail.com>
Fri, 15 Jan 2010 18:01:52 +0000 (18:01 +0000)
 - Fixes a crash with TCP over loopback

svn path=/branches/aicom-network-branch/; revision=45087

lib/drivers/ip/network/loopback.c

index 7b90ea6..18054bc 100644 (file)
 
 PIP_INTERFACE Loopback = NULL;
 
+VOID LoopPassiveWorker(
+  PVOID Context)
+{
+  PIP_PACKET IPPacket = Context;
+
+  IPReceive(Loopback, IPPacket);
+  FreeNdisPacket(IPPacket->NdisPacket);
+
+  ExFreePool(Context);
+}
+
 VOID LoopTransmit(
   PVOID Context,
   PNDIS_PACKET NdisPacket,
@@ -34,6 +45,7 @@ VOID LoopTransmit(
     NDIS_STATUS NdisStatus;
     IP_PACKET IPPacket;
     PNDIS_BUFFER NdisBuffer;
+    PVOID WorkerBuffer;
 
     ASSERT_KM_POINTER(NdisPacket);
     ASSERT_KM_POINTER(PC(NdisPacket));
@@ -46,9 +58,6 @@ VOID LoopTransmit(
     NdisStatus = AllocatePacketWithBuffer
         ( &XmitPacket, PacketBuffer, PacketLength );
 
-    (PC(NdisPacket)->DLComplete)
-        ( PC(NdisPacket)->Context, NdisPacket, NdisStatus );
-
     if( NT_SUCCESS(NdisStatus) ) {
         IPInitializePacket(&IPPacket, 0);
                
@@ -60,12 +69,23 @@ VOID LoopTransmit(
                                      &IPPacket.ContigSize,
                                      &IPPacket.TotalSize);
 
-        IPReceive(Loopback, &IPPacket);
-
-        FreeNdisPacket(XmitPacket);
+        
+        WorkerBuffer = ExAllocatePool(NonPagedPool, sizeof(IPPacket));
+        if (WorkerBuffer)
+        {
+            RtlCopyMemory(WorkerBuffer, &IPPacket, sizeof(IPPacket));
+            if (!ChewCreate(LoopPassiveWorker, WorkerBuffer))
+            {
+                ExFreePool(WorkerBuffer);
+                NdisStatus = NDIS_STATUS_RESOURCES;
+            }
+        }
+        else
+            NdisStatus = NDIS_STATUS_RESOURCES;
     }
 
-    TI_DbgPrint(MAX_TRACE, ("Done\n"));
+    (PC(NdisPacket)->DLComplete)
+        ( PC(NdisPacket)->Context, NdisPacket, NdisStatus );
 }
 
 NDIS_STATUS LoopRegisterAdapter(