diff options
author | Bob Moore <robert.moore@intel.com> | 2008-04-10 11:06:36 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2008-04-22 14:29:20 -0400 |
commit | 773069d48030e670cf2032a13ddf16a2e0034df3 (patch) | |
tree | 2f45fd7e90600d26c08c641c75059eb0b15d6dcd /drivers/acpi/dispatcher/dsopcode.c | |
parent | 4b119e21d0c66c22e8ca03df05d9de623d0eb50f (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.c | 9 |
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 | ||