ACPICA: Fix possible memory leak for Scope ASL operator
Using Scope(\) to change the scope to the root could cause a single object memory leak. 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>
This commit is contained in:
Родитель
74d3ec77a5
Коммит
50b77eda9b
|
@ -639,26 +639,42 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
|
|||
break;
|
||||
|
||||
case AML_SCOPE_OP:
|
||||
/*
|
||||
* The Path is an object reference to an existing object.
|
||||
* Don't enter the name into the namespace, but look it up
|
||||
* for use later.
|
||||
*/
|
||||
status =
|
||||
acpi_ns_lookup(walk_state->scope_info, buffer_ptr,
|
||||
object_type, ACPI_IMODE_EXECUTE,
|
||||
ACPI_NS_SEARCH_PARENT, walk_state, &(node));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
if (status == AE_NOT_FOUND) {
|
||||
status = AE_OK;
|
||||
} else {
|
||||
ACPI_ERROR_NAMESPACE(buffer_ptr, status);
|
||||
|
||||
/* Special case for Scope(\) -> refers to the Root node */
|
||||
|
||||
if (op && (op->named.node == acpi_gbl_root_node)) {
|
||||
node = op->named.node;
|
||||
|
||||
status =
|
||||
acpi_ds_scope_stack_push(node, object_type,
|
||||
walk_state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* The Path is an object reference to an existing object.
|
||||
* Don't enter the name into the namespace, but look it up
|
||||
* for use later.
|
||||
*/
|
||||
status =
|
||||
acpi_ns_lookup(walk_state->scope_info, buffer_ptr,
|
||||
object_type, ACPI_IMODE_EXECUTE,
|
||||
ACPI_NS_SEARCH_PARENT, walk_state,
|
||||
&(node));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
if (status == AE_NOT_FOUND) {
|
||||
status = AE_OK;
|
||||
} else {
|
||||
ACPI_ERROR_NAMESPACE(buffer_ptr,
|
||||
status);
|
||||
}
|
||||
#else
|
||||
ACPI_ERROR_NAMESPACE(buffer_ptr, status);
|
||||
ACPI_ERROR_NAMESPACE(buffer_ptr, status);
|
||||
#endif
|
||||
return_ACPI_STATUS(status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче