Skip to content

Commit

Permalink
ACPICA: Fix memory leak if acpi_ps_get_next_field() fails
Browse files Browse the repository at this point in the history
[ Upstream commit e6169a8 ]

ACPICA commit 1280045754264841b119a5ede96cd005bc09b5a7

If acpi_ps_get_next_field() fails, the previously created field list
needs to be properly disposed before returning the status code.

Link: acpica/acpica@12800457
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
[ rjw: Rename local variable to avoid compiler confusion ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Wer-Wolf authored and gregkh committed Oct 10, 2024
1 parent 964fe89 commit ce1c6c0
Showing 1 changed file with 39 additions and 0 deletions.
39 changes: 39 additions & 0 deletions drivers/acpi/acpica/psargs.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state);
static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
*parser_state);

static void acpi_ps_free_field_list(union acpi_parse_object *start);

/*******************************************************************************
*
* FUNCTION: acpi_ps_get_next_package_length
Expand Down Expand Up @@ -683,6 +685,39 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
return_PTR(field);
}

/*******************************************************************************
*
* FUNCTION: acpi_ps_free_field_list
*
* PARAMETERS: start - First Op in field list
*
* RETURN: None.
*
* DESCRIPTION: Free all Op objects inside a field list.
*
******************************************************************************/

static void acpi_ps_free_field_list(union acpi_parse_object *start)
{
union acpi_parse_object *cur = start;
union acpi_parse_object *next;
union acpi_parse_object *arg;

while (cur) {
next = cur->common.next;

/* AML_INT_CONNECTION_OP can have a single argument */

arg = acpi_ps_get_arg(cur, 0);
if (arg) {
acpi_ps_free_op(arg);
}

acpi_ps_free_op(cur);
cur = next;
}
}

/*******************************************************************************
*
* FUNCTION: acpi_ps_get_next_arg
Expand Down Expand Up @@ -751,6 +786,10 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
while (parser_state->aml < parser_state->pkg_end) {
field = acpi_ps_get_next_field(parser_state);
if (!field) {
if (arg) {
acpi_ps_free_field_list(arg);
}

return_ACPI_STATUS(AE_NO_MEMORY);
}

Expand Down

0 comments on commit ce1c6c0

Please sign in to comment.