Skip to content

Commit

Permalink
ACPICA: Avoid use of invalid pointers in returned object field
Browse files Browse the repository at this point in the history
During operand evaluation, ensure that the ReturnObj field is
cleared on error and only valid pointers are stored there.

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>
  • Loading branch information
Bob Moore authored and Len Brown committed Apr 22, 2008
1 parent 4e3156b commit 4b6e16c
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 8 deletions.
1 change: 1 addition & 0 deletions drivers/acpi/executer/exoparg1.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ acpi_status acpi_ex_opcode_0A_0T_1R(struct acpi_walk_state *walk_state)

if ((ACPI_FAILURE(status)) || walk_state->result_obj) {
acpi_ut_remove_reference(return_desc);
walk_state->result_obj = NULL;
} else {
/* Save the return value */

Expand Down
19 changes: 13 additions & 6 deletions drivers/acpi/executer/exoparg2.c
Original file line number Diff line number Diff line change
Expand Up @@ -241,10 +241,6 @@ acpi_status acpi_ex_opcode_2A_2T_1R(struct acpi_walk_state *walk_state)
goto cleanup;
}

/* Return the remainder */

walk_state->result_obj = return_desc1;

cleanup:
/*
* Since the remainder is not returned indirectly, remove a reference to
Expand All @@ -259,6 +255,12 @@ acpi_status acpi_ex_opcode_2A_2T_1R(struct acpi_walk_state *walk_state)
acpi_ut_remove_reference(return_desc1);
}

/* Save return object (the remainder) on success */

else {
walk_state->result_obj = return_desc1;
}

return_ACPI_STATUS(status);
}

Expand Down Expand Up @@ -490,6 +492,7 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)

if (ACPI_FAILURE(status)) {
acpi_ut_remove_reference(return_desc);
walk_state->result_obj = NULL;
}

return_ACPI_STATUS(status);
Expand Down Expand Up @@ -583,8 +586,6 @@ acpi_status acpi_ex_opcode_2A_0T_1R(struct acpi_walk_state *walk_state)
return_desc->integer.value = ACPI_INTEGER_MAX;
}

walk_state->result_obj = return_desc;

cleanup:

/* Delete return object on error */
Expand All @@ -593,5 +594,11 @@ acpi_status acpi_ex_opcode_2A_0T_1R(struct acpi_walk_state *walk_state)
acpi_ut_remove_reference(return_desc);
}

/* Save return object on success */

else {
walk_state->result_obj = return_desc;
}

return_ACPI_STATUS(status);
}
1 change: 1 addition & 0 deletions drivers/acpi/executer/exoparg3.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)

if (ACPI_FAILURE(status) || walk_state->result_obj) {
acpi_ut_remove_reference(return_desc);
walk_state->result_obj = NULL;
}

/* Set the return object and exit */
Expand Down
8 changes: 6 additions & 2 deletions drivers/acpi/executer/exoparg6.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,8 +322,6 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state)
goto cleanup;
}

walk_state->result_obj = return_desc;

cleanup:

/* Delete return object on error */
Expand All @@ -332,5 +330,11 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state)
acpi_ut_remove_reference(return_desc);
}

/* Save return object on success */

else {
walk_state->result_obj = return_desc;
}

return_ACPI_STATUS(status);
}

0 comments on commit 4b6e16c

Please sign in to comment.