ACPICA: Disassembler: Enhance resource descriptor detection
authorBob Moore <robert.moore@intel.com>
Wed, 26 Apr 2017 08:17:43 +0000 (16:17 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 26 Apr 2017 22:30:58 +0000 (00:30 +0200)
ACPICA commit ba5020b2dbe1538e4ccd7ac2dfd8843a690c007f

This change enhances the detection of resource descriptors
within a buffer object. For the end_tag opcode, the second byte
is defined to be either a checksum or zero. All known ASL compilers
insert a zero for this byte. The disassembler now ensures this
byte is zero before deciding that a buffer should be disassembled
to a resource descriptor. This helps eliminate incorrect decisions
when attempting to disassemble a buffer to a resource descriptor.

Link: https://github.com/acpica/acpica/commit/ba5020b2
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/utresrc.c

index ff096d9755b925d9f72105f42993ebcc7c0522e1..e0587c85bafdf73a299c40d531eefa27deab4761 100644 (file)
@@ -474,6 +474,15 @@ acpi_ut_walk_aml_resources(struct acpi_walk_state *walk_state,
                                return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
                        }
 
+                       /*
+                        * The end_tag opcode must be followed by a zero byte.
+                        * Although this byte is technically defined to be a checksum,
+                        * in practice, all ASL compilers set this byte to zero.
+                        */
+                       if (*(aml + 1) != 0) {
+                               return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
+                       }
+
                        /* Return the pointer to the end_tag if requested */
 
                        if (!user_function) {