From: Cameron Gutman Date: Wed, 10 Mar 2010 22:25:40 +0000 (+0000) Subject: - We forget that AE_BUFFER_OVERFLOW is normal and expected since our buffer length... X-Git-Tag: backups/header-work@57446~158^2~31 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=1733eb0a2f1b464b6d6482a167cd73b93f93216f;ds=inline - 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) svn path=/trunk/; revision=46080 --- diff --git a/reactos/drivers/bus/acpi/buspdo.c b/reactos/drivers/bus/acpi/buspdo.c index 25fbe324f4f..e7cc65b0c19 100644 --- a/reactos/drivers/bus/acpi/buspdo.c +++ b/reactos/drivers/bus/acpi/buspdo.c @@ -599,23 +599,23 @@ Bus_PDO_QueryResources( /* Get current resources */ Buffer.Length = 0; AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer); - if (!ACPI_SUCCESS(AcpiStatus)) + if ((!ACPI_SUCCESS(AcpiStatus) && AcpiStatus != AE_BUFFER_OVERFLOW) || + Buffer.Length == 0) { - return STATUS_SUCCESS; + return Irp->IoStatus.Status; } - if (Buffer.Length > 0) + + Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length); + if (!Buffer.Pointer) + return STATUS_INSUFFICIENT_RESOURCES; + + AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer); + if (!ACPI_SUCCESS(AcpiStatus)) { - 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 @@ Bus_PDO_QueryResourceRequirements( /* Get current resources */ Buffer.Length = 0; AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer); - if (!ACPI_SUCCESS(AcpiStatus)) + if ((!ACPI_SUCCESS(AcpiStatus) && AcpiStatus != AE_BUFFER_OVERFLOW) || + Buffer.Length == 0) { - return STATUS_SUCCESS; + return Irp->IoStatus.Status; } - if (Buffer.Length > 0) + + Buffer.Pointer = ExAllocatePool(PagedPool, Buffer.Length); + if (!Buffer.Pointer) + return STATUS_INSUFFICIENT_RESOURCES; + + AcpiStatus = AcpiGetCurrentResources(DeviceData->AcpiHandle, &Buffer); + if (!ACPI_SUCCESS(AcpiStatus)) { - 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 */