[ros-diffs] [cgutman] 46080: - We forget that AE_BUFFER_OVERFLOW is normal and expected since our buffer length is 0 so don't fail if that status is returned - For any device that actually had resources we would return STATUS_SUCCESS without building a resource list and if the device didn't have resources we would end up freeing a NULL pointer, storing stack trash in Irp->IoStatus.Information, and then returning STATUS_SUCCESS - Fixes reporting device resources (and possibly the VBox additions crash with ACPI enabled)

cgutman at svn.reactos.org cgutman at svn.reactos.org
Wed Mar 10 23:25:40 CET 2010


Author: cgutman
Date: Wed Mar 10 23:25:40 2010
New Revision: 46080

URL: http://svn.reactos.org/svn/reactos?rev=46080&view=rev
Log:
 - We forget that AE_BUFFER_OVERFLOW is normal and expected since our buffer length is 0 so don't fail if that status is returned
 - For any device that actually had resources we would return STATUS_SUCCESS without building a resource list and if the device didn't have resources we would end up freeing a NULL pointer, storing stack trash in Irp->IoStatus.Information, and then returning STATUS_SUCCESS
 - Fixes reporting device resources (and possibly the VBox additions crash with ACPI enabled)

Modified:
    trunk/reactos/drivers/bus/acpi/buspdo.c

Modified: trunk/reactos/drivers/bus/acpi/buspdo.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/buspdo.c?rev=46080&r1=46079&r2=46080&view=diff
==============================================================================
--- trunk/reactos/drivers/bus/acpi/buspdo.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/buspdo.c [iso-8859-1] Wed Mar 10 23:25:40 2010
@@ -599,23 +599,23 @@
     /* Get current resources */
     Buffer.Length = 0;
     AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
+    if ((!ACPI_SUCCESS(AcpiStatus) && AcpiStatus != AE_BUFFER_OVERFLOW) ||
+        Buffer.Length == 0)
+    {
+      return Irp->IoStatus.Status;
+    }
+
+    Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
+    if (!Buffer.Pointer)
+      return STATUS_INSUFFICIENT_RESOURCES;
+
+    AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
     if (!ACPI_SUCCESS(AcpiStatus))
     {
-      return STATUS_SUCCESS;
-    }
-    if (Buffer.Length > 0)
-    {
-      Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
-      if (!Buffer.Pointer)
-      {
-        ASSERT(FALSE);
-      }
-      AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
-      if (!ACPI_SUCCESS(AcpiStatus))
-      {
-        ASSERT(FALSE);
-      }
-	}
+      DPRINT1("AcpiGetCurrentResources #2 failed (0x%x)\n", AcpiStatus);
+      ASSERT(FALSE);
+      return STATUS_UNSUCCESSFUL;
+    }
 
 	resource= Buffer.Pointer;
 	/* Count number of resources */
@@ -776,23 +776,23 @@
     /* Get current resources */
     Buffer.Length = 0;
     AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
+    if ((!ACPI_SUCCESS(AcpiStatus) && AcpiStatus != AE_BUFFER_OVERFLOW) ||
+        Buffer.Length == 0)
+    {
+      return Irp->IoStatus.Status;
+    }
+
+    Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
+    if (!Buffer.Pointer)
+      return STATUS_INSUFFICIENT_RESOURCES;
+
+    AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
     if (!ACPI_SUCCESS(AcpiStatus))
     {
-      return STATUS_SUCCESS;
-    }
-    if (Buffer.Length > 0)
-    {
-      Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length);
-      if (!Buffer.Pointer)
-      {
-        ASSERT(FALSE);
-      }
-      AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer);
-      if (!ACPI_SUCCESS(AcpiStatus))
-      {
-        ASSERT(FALSE);
-      }
-	}
+      DPRINT1("AcpiGetCurrentResources #2 failed (0x%x)\n", AcpiStatus);
+      ASSERT(FALSE);
+      return STATUS_UNSUCCESSFUL;
+    }
 
 	resource= Buffer.Pointer;
 	/* Count number of resources */




More information about the Ros-diffs mailing list