aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/dispatcher/dsopcode.c
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2008-04-10 11:06:36 -0400
committerLen Brown <len.brown@intel.com>2008-04-22 14:29:20 -0400
commit773069d48030e670cf2032a13ddf16a2e0034df3 (patch)
tree2f45fd7e90600d26c08c641c75059eb0b15d6dcd /drivers/acpi/dispatcher/dsopcode.c
parent4b119e21d0c66c22e8ca03df05d9de623d0eb50f (diff)
ACPICA: Several fixes for internal method result stack
fixes STACK_OVERFLOW exception on nested method calls. internal bugzilla 262 and 275. Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/dispatcher/dsopcode.c')
-rw-r--r--drivers/acpi/dispatcher/dsopcode.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c
index f501e083aac7..0c4630dc09f3 100644
--- a/drivers/acpi/dispatcher/dsopcode.c
+++ b/drivers/acpi/dispatcher/dsopcode.c
@@ -808,6 +808,12 @@ acpi_ds_eval_data_object_operands(struct acpi_walk_state *walk_state,
808 808
809 /* The first operand (for all of these data objects) is the length */ 809 /* The first operand (for all of these data objects) is the length */
810 810
811 /*
812 * Set proper index into operand stack for acpi_ds_obj_stack_push
813 * invoked inside acpi_ds_create_operand.
814 */
815 walk_state->operand_index = walk_state->num_operands;
816
811 status = acpi_ds_create_operand(walk_state, op->common.value.arg, 1); 817 status = acpi_ds_create_operand(walk_state, op->common.value.arg, 1);
812 if (ACPI_FAILURE(status)) { 818 if (ACPI_FAILURE(status)) {
813 return_ACPI_STATUS(status); 819 return_ACPI_STATUS(status);
@@ -1070,8 +1076,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
1070 * is set to anything other than zero! 1076 * is set to anything other than zero!
1071 */ 1077 */
1072 walk_state->return_desc = walk_state->operands[0]; 1078 walk_state->return_desc = walk_state->operands[0];
1073 } else if ((walk_state->results) && 1079 } else if (walk_state->result_count) {
1074 (walk_state->results->results.num_results > 0)) {
1075 1080
1076 /* Since we have a real Return(), delete any implicit return */ 1081 /* Since we have a real Return(), delete any implicit return */
1077 1082