[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