Skip to content

Commit

Permalink
ACPICA: Fix fault after mem allocation failure in AML parser
Browse files Browse the repository at this point in the history
Fixes a crash if a memory allocation fails during the Op completion
routine acpi_ps_complete_this_op().

http://www.acpica.org/bugzilla/show_bug.cgi?id=492

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>
  • Loading branch information
Lin Ming authored and Len Brown committed Oct 23, 2008
1 parent bbbbeb8 commit c35def2
Showing 1 changed file with 11 additions and 17 deletions.
28 changes: 11 additions & 17 deletions drivers/acpi/parser/psparse.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
union acpi_parse_object *next;
const struct acpi_opcode_info *parent_info;
union acpi_parse_object *replacement_op = NULL;
acpi_status status = AE_OK;

ACPI_FUNCTION_TRACE_PTR(ps_complete_this_op, op);

Expand Down Expand Up @@ -186,7 +187,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
replacement_op =
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
if (!replacement_op) {
goto allocate_error;
status = AE_NO_MEMORY;
}
break;

Expand All @@ -211,7 +212,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
replacement_op =
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
if (!replacement_op) {
goto allocate_error;
status = AE_NO_MEMORY;
}
} else
if ((op->common.parent->common.aml_opcode ==
Expand All @@ -226,13 +227,13 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
acpi_ps_alloc_op(op->common.
aml_opcode);
if (!replacement_op) {
goto allocate_error;
status = AE_NO_MEMORY;
} else {
replacement_op->named.data =
op->named.data;
replacement_op->named.length =
op->named.length;
}

replacement_op->named.data =
op->named.data;
replacement_op->named.length =
op->named.length;
}
}
break;
Expand All @@ -242,7 +243,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
replacement_op =
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
if (!replacement_op) {
goto allocate_error;
status = AE_NO_MEMORY;
}
}

Expand Down Expand Up @@ -302,14 +303,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
/* Now we can actually delete the subtree rooted at Op */

acpi_ps_delete_parse_tree(op);
return_ACPI_STATUS(AE_OK);

allocate_error:

/* Always delete the subtree, even on error */

acpi_ps_delete_parse_tree(op);
return_ACPI_STATUS(AE_NO_MEMORY);
return_ACPI_STATUS(status);
}

/*******************************************************************************
Expand Down

0 comments on commit c35def2

Please sign in to comment.