Loading drivers/acpi/acpica/tbutils.c +25 −9 Original line number Diff line number Diff line Loading @@ -416,9 +416,18 @@ acpi_tb_get_table(struct acpi_table_desc *table_desc, } } if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) { table_desc->validation_count++; if (table_desc->validation_count == 0) { table_desc->validation_count--; /* * Detect validation_count overflows to ensure that the warning * message will only be printed once. */ if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) { ACPI_WARNING((AE_INFO, "Table %p, Validation count overflows\n", table_desc)); } } *out_table = table_desc->pointer; Loading @@ -445,13 +454,20 @@ void acpi_tb_put_table(struct acpi_table_desc *table_desc) ACPI_FUNCTION_TRACE(acpi_tb_put_table); if (table_desc->validation_count == 0) { if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) { table_desc->validation_count--; /* * Detect validation_count underflows to ensure that the warning * message will only be printed once. */ if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) { ACPI_WARNING((AE_INFO, "Table %p, Validation count is zero before decrement\n", "Table %p, Validation count underflows\n", table_desc)); return_VOID; } table_desc->validation_count--; } if (table_desc->validation_count == 0) { Loading drivers/acpi/acpica/utresrc.c +0 −9 Original line number Diff line number Diff line Loading @@ -474,15 +474,6 @@ acpi_ut_walk_aml_resources(struct acpi_walk_state *walk_state, return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG); } /* * The end_tag opcode must be followed by a zero byte. * Although this byte is technically defined to be a checksum, * in practice, all ASL compilers set this byte to zero. */ if (*(aml + 1) != 0) { return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG); } /* Return the pointer to the end_tag if requested */ if (!user_function) { Loading include/acpi/actbl.h +14 −0 Original line number Diff line number Diff line Loading @@ -374,6 +374,20 @@ struct acpi_table_desc { u16 validation_count; }; /* * Maximum value of the validation_count field in struct acpi_table_desc. * When reached, validation_count cannot be changed any more and the table will * be permanently regarded as validated. * * This is to prevent situations in which unbalanced table get/put operations * may cause premature table unmapping in the OS to happen. * * The maximum validation count can be defined to any value, but should be * greater than the maximum number of OS early stage mapping slots to avoid * leaking early stage table mappings to the late stage. */ #define ACPI_MAX_TABLE_VALIDATIONS ACPI_UINT16_MAX /* Masks for Flags field above */ #define ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL (0) /* Virtual address, external maintained */ Loading Loading
drivers/acpi/acpica/tbutils.c +25 −9 Original line number Diff line number Diff line Loading @@ -416,9 +416,18 @@ acpi_tb_get_table(struct acpi_table_desc *table_desc, } } if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) { table_desc->validation_count++; if (table_desc->validation_count == 0) { table_desc->validation_count--; /* * Detect validation_count overflows to ensure that the warning * message will only be printed once. */ if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) { ACPI_WARNING((AE_INFO, "Table %p, Validation count overflows\n", table_desc)); } } *out_table = table_desc->pointer; Loading @@ -445,13 +454,20 @@ void acpi_tb_put_table(struct acpi_table_desc *table_desc) ACPI_FUNCTION_TRACE(acpi_tb_put_table); if (table_desc->validation_count == 0) { if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) { table_desc->validation_count--; /* * Detect validation_count underflows to ensure that the warning * message will only be printed once. */ if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) { ACPI_WARNING((AE_INFO, "Table %p, Validation count is zero before decrement\n", "Table %p, Validation count underflows\n", table_desc)); return_VOID; } table_desc->validation_count--; } if (table_desc->validation_count == 0) { Loading
drivers/acpi/acpica/utresrc.c +0 −9 Original line number Diff line number Diff line Loading @@ -474,15 +474,6 @@ acpi_ut_walk_aml_resources(struct acpi_walk_state *walk_state, return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG); } /* * The end_tag opcode must be followed by a zero byte. * Although this byte is technically defined to be a checksum, * in practice, all ASL compilers set this byte to zero. */ if (*(aml + 1) != 0) { return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG); } /* Return the pointer to the end_tag if requested */ if (!user_function) { Loading
include/acpi/actbl.h +14 −0 Original line number Diff line number Diff line Loading @@ -374,6 +374,20 @@ struct acpi_table_desc { u16 validation_count; }; /* * Maximum value of the validation_count field in struct acpi_table_desc. * When reached, validation_count cannot be changed any more and the table will * be permanently regarded as validated. * * This is to prevent situations in which unbalanced table get/put operations * may cause premature table unmapping in the OS to happen. * * The maximum validation count can be defined to any value, but should be * greater than the maximum number of OS early stage mapping slots to avoid * leaking early stage table mappings to the late stage. */ #define ACPI_MAX_TABLE_VALIDATIONS ACPI_UINT16_MAX /* Masks for Flags field above */ #define ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL (0) /* Virtual address, external maintained */ Loading