diff options
author | Jung-uk Kim <jkim@FreeBSD.org> | 2014-02-17 17:10:41 +0000 |
---|---|---|
committer | Jung-uk Kim <jkim@FreeBSD.org> | 2014-02-17 17:10:41 +0000 |
commit | 526d99544ba42a5a2155021975b3b97da425819e (patch) | |
tree | f33eb960cbd87cb5fa516e45153eb6351dc8ea2e /source/components/utilities/utdelete.c | |
parent | 7bf0bd8c239ae7e6cb5c98382db85377146519d6 (diff) |
Notes
Diffstat (limited to 'source/components/utilities/utdelete.c')
-rw-r--r-- | source/components/utilities/utdelete.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/source/components/utilities/utdelete.c b/source/components/utilities/utdelete.c index 480e1f764d9f..9e4c79b95ac3 100644 --- a/source/components/utilities/utdelete.c +++ b/source/components/utilities/utdelete.c @@ -86,6 +86,7 @@ AcpiUtDeleteInternalObj ( ACPI_OPERAND_OBJECT *HandlerDesc; ACPI_OPERAND_OBJECT *SecondDesc; ACPI_OPERAND_OBJECT *NextDesc; + ACPI_OPERAND_OBJECT *StartDesc; ACPI_OPERAND_OBJECT **LastObjPtr; @@ -250,9 +251,10 @@ AcpiUtDeleteInternalObj ( if (HandlerDesc) { NextDesc = HandlerDesc->AddressSpace.RegionList; + StartDesc = NextDesc; LastObjPtr = &HandlerDesc->AddressSpace.RegionList; - /* Remove the region object from the handler's list */ + /* Remove the region object from the handler list */ while (NextDesc) { @@ -262,10 +264,20 @@ AcpiUtDeleteInternalObj ( break; } - /* Walk the linked list of handler */ + /* Walk the linked list of handlers */ LastObjPtr = &NextDesc->Region.Next; NextDesc = NextDesc->Region.Next; + + /* Prevent infinite loop if list is corrupted */ + + if (NextDesc == StartDesc) + { + ACPI_ERROR ((AE_INFO, + "Circular region list in address handler object %p", + HandlerDesc)); + return_VOID; + } } if (HandlerDesc->AddressSpace.HandlerFlags & |