diff options
author | Lin Ming <ming.m.lin@intel.com> | 2009-10-13 06:23:20 +0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2009-11-25 04:30:03 +0300 |
commit | 0240d7b4f20f7d156a74dfdd0647a0231b7e8ef4 (patch) | |
tree | 135f87ba510a800c751e31c65d60f590197a201c /drivers/acpi/acpica | |
parent | 2752699392b828edf3123f911f6e8b4dd7daeb56 (diff) | |
download | linux-0240d7b4f20f7d156a74dfdd0647a0231b7e8ef4.tar.xz |
ACPICA: Add repair for bad _MAT buffers
_MAT can inadvertently return an Integer instead of a Buffer
if the return value has been read from a Field whose width is
less than or equal to the global integer width (32 or 64 bits).
ACPICA BZ 810.
http://www.acpica.org/bugzilla/show_bug.cgi?id=810
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/acpica')
-rw-r--r-- | drivers/acpi/acpica/nsrepair.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/acpi/acpica/nsrepair.c b/drivers/acpi/acpica/nsrepair.c index dfa31c5ba6c3..f2f5269fed6d 100644 --- a/drivers/acpi/acpica/nsrepair.c +++ b/drivers/acpi/acpica/nsrepair.c @@ -44,6 +44,7 @@ #include <acpi/acpi.h> #include "accommon.h" #include "acnamesp.h" +#include "acinterp.h" #include "acpredef.h" #define _COMPONENT ACPI_NAMESPACE @@ -76,6 +77,7 @@ acpi_ns_repair_object(struct acpi_predefined_data *data, union acpi_operand_object *return_object = *return_object_ptr; union acpi_operand_object *new_object; acpi_size length; + acpi_status status; /* * At this point, we know that the type of the returned object was not @@ -120,9 +122,26 @@ acpi_ns_repair_object(struct acpi_predefined_data *data, case ACPI_TYPE_INTEGER: - /* Does the method/object legally return a string? */ + /* 1) Does the method/object legally return a buffer? */ + + if (expected_btypes & ACPI_RTYPE_BUFFER) { + /* + * Convert the Integer to a packed-byte buffer. _MAT needs + * this sometimes, if a read has been performed on a Field + * object that is less than or equal to the global integer + * size (32 or 64 bits). + */ + status = + acpi_ex_convert_to_buffer(return_object, + &new_object); + if (ACPI_FAILURE(status)) { + return (status); + } + } + + /* 2) Does the method/object legally return a string? */ - if (expected_btypes & ACPI_RTYPE_STRING) { + else if (expected_btypes & ACPI_RTYPE_STRING) { /* * The only supported Integer-to-String conversion is to convert * an integer of value 0 to a NULL string. The last element of |