[TCPIP] Check for allocation failures in ReadIpConfiguration. CID 1411924
[reactos.git] / drivers / network / tcpip / datalink / lan.c
index b63e947..23ffbba 100644 (file)
@@ -107,7 +107,7 @@ GetPacketTypeFromHeaderBuffer(PLAN_ADAPTER Adapter,
     switch (Adapter->Media)
     {
         case NdisMedium802_3:
-            /* Ethernet and IEEE 802.3 frames can be destinguished by
+            /* Ethernet and IEEE 802.3 frames can be distinguished by
                looking at the IEEE 802.3 length field. This field is
                less than or equal to 1500 for a valid IEEE 802.3 frame
                and larger than 1500 is it's a valid EtherType value.
@@ -138,8 +138,9 @@ GetPacketTypeFromNdisPacket(PLAN_ADAPTER Adapter,
     ULONG BytesCopied;
     NDIS_STATUS Status;
     
-    HeaderBuffer = ExAllocatePool(NonPagedPool,
-                                  Adapter->HeaderSize);
+    HeaderBuffer = ExAllocatePoolWithTag(NonPagedPool,
+                                         Adapter->HeaderSize,
+                                         HEADER_TAG);
     if (!HeaderBuffer)
         return NDIS_STATUS_RESOURCES;
     
@@ -151,7 +152,7 @@ GetPacketTypeFromNdisPacket(PLAN_ADAPTER Adapter,
     if (BytesCopied != Adapter->HeaderSize)
     {
         /* Runt frame */
-        ExFreePool(HeaderBuffer);
+        ExFreePoolWithTag(HeaderBuffer, HEADER_TAG);
         TI_DbgPrint(DEBUG_DATALINK, ("Runt frame (size %d).\n", BytesCopied));
         return NDIS_STATUS_NOT_ACCEPTED;
     }
@@ -161,7 +162,7 @@ GetPacketTypeFromNdisPacket(PLAN_ADAPTER Adapter,
                                            BytesCopied,
                                            PacketType);
     
-    ExFreePool(HeaderBuffer);
+    ExFreePoolWithTag(HeaderBuffer, HEADER_TAG);
     
     return Status;
 }
@@ -594,7 +595,7 @@ BOOLEAN ReadIpConfiguration(PIP_INTERFACE Interface)
     
     InitializeObjectAttributes(&ObjectAttributes,
                                &TcpipRegistryPath,
-                               OBJ_CASE_INSENSITIVE,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
                                0,
                                NULL);
     
@@ -607,7 +608,7 @@ BOOLEAN ReadIpConfiguration(PIP_INTERFACE Interface)
     }
     else
     {
-        KeyValueInfo = ExAllocatePool(PagedPool, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR));
+        KeyValueInfo = ExAllocatePoolWithTag(PagedPool, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR), KEY_VALUE_TAG);
         if (!KeyValueInfo)
         {
             ZwClose(ParameterHandle);
@@ -636,14 +637,16 @@ BOOLEAN ReadIpConfiguration(PIP_INTERFACE Interface)
             if (NT_SUCCESS(Status))
             {
                 RegistryDataU.Length = KeyValueInfo->DataLength;
-                
-                RtlUnicodeStringToAnsiString(&RegistryDataA,
-                                             &RegistryDataU,
-                                             TRUE);
-                
-                AddrInitIPv4(&Interface->Unicast, inet_addr(RegistryDataA.Buffer));
-                
-                RtlFreeAnsiString(&RegistryDataA);
+
+                Status = RtlUnicodeStringToAnsiString(&RegistryDataA,
+                                                      &RegistryDataU,
+                                                      TRUE);
+                if (NT_SUCCESS(Status))
+                {
+                    AddrInitIPv4(&Interface->Unicast,
+                                 inet_addr(RegistryDataA.Buffer));
+                    RtlFreeAnsiString(&RegistryDataA);
+                }
             }
 
             Status = ZwQueryValueKey(ParameterHandle,
@@ -655,16 +658,18 @@ BOOLEAN ReadIpConfiguration(PIP_INTERFACE Interface)
             if (NT_SUCCESS(Status))
             {
                 RegistryDataU.Length = KeyValueInfo->DataLength;
-                
-                RtlUnicodeStringToAnsiString(&RegistryDataA,
-                                             &RegistryDataU,
-                                             TRUE);
-                
-                AddrInitIPv4(&Interface->Netmask, inet_addr(RegistryDataA.Buffer));
-                
-                RtlFreeAnsiString(&RegistryDataA);
+
+                Status = RtlUnicodeStringToAnsiString(&RegistryDataA,
+                                                      &RegistryDataU,
+                                                      TRUE);
+                if (NT_SUCCESS(Status))
+                {
+                    AddrInitIPv4(&Interface->Netmask,
+                                 inet_addr(RegistryDataA.Buffer));
+                    RtlFreeAnsiString(&RegistryDataA);
+                }
             }
-            
+
             /* We have to wait until both IP address and subnet mask
              * are read to add the interface route, but we must do it
              * before we add the default gateway */
@@ -682,23 +687,26 @@ BOOLEAN ReadIpConfiguration(PIP_INTERFACE Interface)
             if (NT_SUCCESS(Status))
             {
                 RegistryDataU.Length = KeyValueInfo->DataLength;
-                
-                RtlUnicodeStringToAnsiString(&RegistryDataA,
-                                             &RegistryDataU,
-                                             TRUE);
-                
-                AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer));
-                
-                if (!AddrIsUnspecified(&Router))
-                    RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, Interface, 1);
-                
-                RtlFreeAnsiString(&RegistryDataA);
+
+                Status = RtlUnicodeStringToAnsiString(&RegistryDataA,
+                                                      &RegistryDataU,
+                                                      TRUE);
+                if (NT_SUCCESS(Status))
+                {
+                    AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer));
+
+                    if (!AddrIsUnspecified(&Router))
+                        RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, Interface, 1);
+
+                    RtlFreeAnsiString(&RegistryDataA);
+                }
             }
         }
-        
+
+        ExFreePoolWithTag(KeyValueInfo, KEY_VALUE_TAG);
         ZwClose(ParameterHandle);
     }
-    
+
     return TRUE;
 }
 
@@ -823,7 +831,7 @@ VOID NTAPI ProtocolStatus(
     if (!Adapter->Context)
         return;
     
-    Context = ExAllocatePool(NonPagedPool, sizeof(RECONFIGURE_CONTEXT));
+    Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(RECONFIGURE_CONTEXT), CONTEXT_TAG);
     if (!Context)
         return;
     
@@ -836,7 +844,7 @@ VOID NTAPI ProtocolStatus(
 
             if (Adapter->State == LAN_STATE_STARTED)
             {
-                ExFreePool(Context);
+                ExFreePoolWithTag(Context, CONTEXT_TAG);
                 return;
             }
 
@@ -848,7 +856,7 @@ VOID NTAPI ProtocolStatus(
             
             if (Adapter->State == LAN_STATE_STOPPED)
             {
-                ExFreePool(Context);
+                ExFreePoolWithTag(Context, CONTEXT_TAG);
                 return;
             }
             
@@ -859,7 +867,7 @@ VOID NTAPI ProtocolStatus(
             Adapter->OldState = Adapter->State;
             Adapter->State = LAN_STATE_RESETTING;
             /* Nothing else to do here */
-            ExFreePool(Context);
+            ExFreePoolWithTag(Context, CONTEXT_TAG);
             return;
 
         case NDIS_STATUS_RESET_END:
@@ -869,13 +877,13 @@ VOID NTAPI ProtocolStatus(
 
         default:
             DbgPrint("Unhandled status: %x", GeneralStatus);
-            ExFreePool(Context);
+            ExFreePoolWithTag(Context, CONTEXT_TAG);
             return;
     }
 
     /* Queue the work item */
     if (!ChewCreate(ReconfigureAdapterWorker, Context))
-        ExFreePool(Context);
+        ExFreePoolWithTag(Context, CONTEXT_TAG);
 }
 
 VOID NTAPI ProtocolStatusComplete(NDIS_HANDLE NdisBindingContext)
@@ -925,7 +933,7 @@ VOID NTAPI ProtocolBindAdapter(
     IN  PVOID          SystemSpecific2)
 /*
  * FUNCTION: Called by NDIS during NdisRegisterProtocol to set up initial
- *           bindings, and periodically thereafer as new adapters come online
+ *           bindings, and periodically thereafter as new adapters come online
  * ARGUMENTS:
  *     Status: Return value to NDIS
  *     BindContext: Handle provided by NDIS to track pending binding operations
@@ -1074,7 +1082,7 @@ OpenRegistryKey( PNDIS_STRING RegistryPath, PHANDLE RegHandle ) {
     OBJECT_ATTRIBUTES Attributes;
     NTSTATUS Status;
 
-    InitializeObjectAttributes(&Attributes, RegistryPath, OBJ_CASE_INSENSITIVE, 0, 0);
+    InitializeObjectAttributes(&Attributes, RegistryPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);
     Status = ZwOpenKey(RegHandle, KEY_ALL_ACCESS, &Attributes);
     return Status;
 }
@@ -1108,8 +1116,8 @@ static NTSTATUS ReadStringFromRegistry( HANDLE RegHandle,
     UnicodeString.MaximumLength = Information->DataLength;
 
     String->Buffer =
-       (PWCHAR)ExAllocatePool( NonPagedPool,
-                               UnicodeString.MaximumLength + sizeof(WCHAR) );
+       (PWCHAR)ExAllocatePoolWithTag( NonPagedPool,
+                               UnicodeString.MaximumLength + sizeof(WCHAR), REG_STR_TAG );
 
     if( !String->Buffer ) return STATUS_NO_MEMORY;
 
@@ -1135,9 +1143,9 @@ NTSTATUS NTAPI AppendUnicodeString(PUNICODE_STRING ResultFirst,
                                   BOOLEAN Deallocate) {
     NTSTATUS Status;
     UNICODE_STRING Ustr = *ResultFirst;
-    PWSTR new_string = ExAllocatePool
+    PWSTR new_string = ExAllocatePoolWithTag
         (PagedPool,
-         (ResultFirst->Length + Second->Length + sizeof(WCHAR)));
+         (ResultFirst->Length + Second->Length + sizeof(WCHAR)), TEMP_STRING_TAG);
     if( !new_string ) {
        return STATUS_NO_MEMORY;
     }
@@ -1150,7 +1158,7 @@ NTSTATUS NTAPI AppendUnicodeString(PUNICODE_STRING ResultFirst,
     new_string[ResultFirst->Length / sizeof(WCHAR)] = 0;
     Status = RtlCreateUnicodeString(ResultFirst,new_string) ?
        STATUS_SUCCESS : STATUS_NO_MEMORY;
-    ExFreePool(new_string);
+    ExFreePoolWithTag(new_string, TEMP_STRING_TAG);
     return Status;
 }
 
@@ -1198,8 +1206,8 @@ cleanup:
     RtlFreeUnicodeString( &RootDevice );
     RtlFreeUnicodeString( &LinkageKeyName );
     RtlFreeUnicodeString( &DescKeyName );
-    if( LinkageKey ) NtClose( LinkageKey );
-    if( DescKey ) NtClose( DescKey );
+    if( LinkageKey ) ZwClose( LinkageKey );
+    if( DescKey ) ZwClose( DescKey );
 
     TI_DbgPrint(DEBUG_DATALINK,("Returning %x\n", Status));
 
@@ -1213,7 +1221,7 @@ static NTSTATUS FindDeviceDescForAdapter( PUNICODE_STRING Name,
     NTSTATUS Status;
     ULONG i;
     KEY_BASIC_INFORMATION *Kbio =
-        ExAllocatePool(NonPagedPool, sizeof(KEY_BASIC_INFORMATION));
+        ExAllocatePoolWithTag(NonPagedPool, sizeof(KEY_BASIC_INFORMATION), KBIO_TAG);
     ULONG KbioLength = sizeof(KEY_BASIC_INFORMATION), ResultLength;
 
     RtlInitUnicodeString( DeviceDesc, NULL );
@@ -1228,7 +1236,7 @@ static NTSTATUS FindDeviceDescForAdapter( PUNICODE_STRING Name,
     if( !NT_SUCCESS(Status) ) {
         TI_DbgPrint(DEBUG_DATALINK,("Couldn't open Enum key %wZ: %x\n",
                                     &EnumKeyName, Status));
-        ExFreePool( Kbio );
+        ExFreePoolWithTag( Kbio, KBIO_TAG );
         return Status;
     }
 
@@ -1237,12 +1245,12 @@ static NTSTATUS FindDeviceDescForAdapter( PUNICODE_STRING Name,
                                  Kbio, KbioLength, &ResultLength );
 
         if( Status == STATUS_BUFFER_TOO_SMALL || Status == STATUS_BUFFER_OVERFLOW ) {
-            ExFreePool( Kbio );
+            ExFreePoolWithTag( Kbio, KBIO_TAG );
             KbioLength = ResultLength;
-            Kbio = ExAllocatePool( NonPagedPool, KbioLength );
+            Kbio = ExAllocatePoolWithTag( NonPagedPool, KbioLength, KBIO_TAG );
             if( !Kbio ) {
                 TI_DbgPrint(DEBUG_DATALINK,("Failed to allocate memory\n"));
-                NtClose( EnumKey );
+                ZwClose( EnumKey );
                 return STATUS_NO_MEMORY;
             }
 
@@ -1251,8 +1259,8 @@ static NTSTATUS FindDeviceDescForAdapter( PUNICODE_STRING Name,
 
             if( !NT_SUCCESS(Status) ) {
                 TI_DbgPrint(DEBUG_DATALINK,("Couldn't enum key child %d\n", i));
-                NtClose( EnumKey );
-                ExFreePool( Kbio );
+                ZwClose( EnumKey );
+                ExFreePoolWithTag( Kbio, KBIO_TAG );
                 return Status;
             }
         }
@@ -1265,15 +1273,15 @@ static NTSTATUS FindDeviceDescForAdapter( PUNICODE_STRING Name,
             Status = CheckForDeviceDesc
                 ( &EnumKeyName, &TargetKeyName, Name, DeviceDesc );
             if( NT_SUCCESS(Status) ) {
-                NtClose( EnumKey );
-                ExFreePool( Kbio );
+                ZwClose( EnumKey );
+                ExFreePoolWithTag( Kbio, KBIO_TAG );
                 return Status;
             } else Status = STATUS_SUCCESS;
         }
     }
 
-    NtClose( EnumKey );
-    ExFreePool( Kbio );
+    ZwClose( EnumKey );
+    ExFreePoolWithTag( Kbio, KBIO_TAG );
     return STATUS_UNSUCCESSFUL;
 }