[PATCH] acpica: fix disassembly on i386 platforms (LP: #1547469)

Alex Hung alex.hung at canonical.com
Mon Feb 22 02:47:18 UTC 2016


On 2016-02-19 10:42 PM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> On i386 builds on Xenial I'm seeing:
>
> *** Error in `/home/king/repos/fwts/src/.libs/lt-fwts': double free or
>    corruption (!prev): 0x08bfb010 ***
>
> this occurs because AcpiGbl_ParseOpRoot is being deleted and not being
> set back to NULL, so subsequent parsing of externally loaded tables
> append to this non-null tree with the last Op nodes and this causes
> issues when we free these objects twice on the subsequent call of
> AcpiPsDeleteParseTree.  We need to always ensure AcpiGbl_ParseOpRoot
> is NULL after deleting the parse tree from it.
>
> The second set of fixes syncs the disassembly code with the current
> iASL main disassbly idoims.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>   src/acpica/source/common/adisasm.c               |  1 +
>   src/acpica/source/compiler/fwts_iasl_interface.c | 14 ++++++++++++--
>   2 files changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c
> index 3dabe3b..520863c 100644
> --- a/src/acpica/source/common/adisasm.c
> +++ b/src/acpica/source/common/adisasm.c
> @@ -700,6 +700,7 @@ AdDoExternalFileList (
>               AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot,
>                   AcpiGbl_RootNode, OwnerId);
>               AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
> +            AcpiGbl_ParseOpRoot = NULL;
>
>               ExternalListHead = ExternalListHead->Next;
>           }
> diff --git a/src/acpica/source/compiler/fwts_iasl_interface.c b/src/acpica/source/compiler/fwts_iasl_interface.c
> index 83fb926..d0ffcb7 100644
> --- a/src/acpica/source/compiler/fwts_iasl_interface.c
> +++ b/src/acpica/source/compiler/fwts_iasl_interface.c
> @@ -39,9 +39,15 @@ static void init_asl_core(void)
>   {
>   	int i;
>
> +	AcpiOsInitialize();
> +	ACPI_DEBUG_INITIALIZE();
>   	AcpiGbl_ExternalFileList = NULL;
>   	AcpiDbgLevel = 0;
> -	PrInitializePreprocessor ();
> +	PrInitializePreprocessor();
> +	AcpiGbl_DmOpt_Verbose = FALSE;
> +	AcpiGbl_IntegerBitWidth = 64;
> +	AcpiGbl_IntegerNybbleWidth = 16;
> +	AcpiGbl_IntegerByteWidth = 8;
>
>   	for (i = 0; i < ASL_NUM_FILES; i++) {
>   		Gbl_Files[i].Handle = NULL;
> @@ -53,7 +59,7 @@ static void init_asl_core(void)
>   	Gbl_Files[ASL_FILE_STDERR].Handle   = stdout;
>   	Gbl_Files[ASL_FILE_STDERR].Filename = "STDOUT";
>
> -	Gbl_LineBufferSize = 16384;
> +	Gbl_LineBufferSize = 1024;
>   	Gbl_CurrentLineBuffer = NULL;
>   	Gbl_MainTokenBuffer = NULL;
>   	UtExpandLineBuffers();
> @@ -133,6 +139,10 @@ int fwts_iasl_disassemble_aml(
>
>   		/* ...and do the ACPICA disassambly... */
>   		AslDoOneFile((char *)tables[which]);
> +		UtFreeLineBuffers();
> +		AslParserCleanup();
> +		if (AcpiGbl_ExternalFileList)
> +			AcpiDmClearExternalFileList();
>
>   		fclose(fperr);
>   		fclose(fpout);
>

Acked-by: Alex Hung <alex.hung at canonical.com>



More information about the fwts-devel mailing list