[PATCH] fwts_iasl_interface.c: ensure we read in all of stdout (LP: #1200426)

Colin Ian King colin.king at canonical.com
Fri Jul 12 10:13:03 UTC 2013


On 12/07/13 10:05, Colin Ian King wrote:
> On 12/07/13 01:06, Colin King wrote:
>> From: Colin Ian King <colin.king at canonical.com>
>>
>> Redirecting stdout to a file when running the syntaxcheck test results
>> in no failures.  We need to ensure we fflush on stdout to flush the
>> IASL output on stdout down the pipe to the reading parent process.
>>
>> This patch also ensures we check for NULL on realloc.  Also fixes
>> an incorrect stdout fd check on pipefds[0] and removes an unnecessary
>> close on pipefds[1] on the child process.
>>
>> Took the opportunity to do some white space cleanup and a general tidy
>> up of the code too.  Must of had a bad day when I originally wrote
>> this code.
>>
>> Signed-off-by: Colin Ian King <colin.king at canonical.com>
>> ---
>>  src/acpica/source/compiler/fwts_iasl_interface.c | 64 +++++++++++++++---------
>>  1 file changed, 40 insertions(+), 24 deletions(-)
>>
>> diff --git a/src/acpica/source/compiler/fwts_iasl_interface.c b/src/acpica/source/compiler/fwts_iasl_interface.c
>> index 84670e4..206e0c8 100644
>> --- a/src/acpica/source/compiler/fwts_iasl_interface.c
>> +++ b/src/acpica/source/compiler/fwts_iasl_interface.c
>> @@ -33,7 +33,7 @@ static void init_asl_core(void)
>>  
>>  	AcpiDbgLevel = 0;
>>  
>> -	for (i=0; i<ASL_NUM_FILES; i++) {
>> +	for (i = 0; i < ASL_NUM_FILES; i++) {
>>  		Gbl_Files[i].Handle = NULL;
>>  		Gbl_Files[i].Filename = NULL;
>>  	}
>> @@ -64,8 +64,8 @@ int fwts_iasl_disassemble_aml(const char *aml, const char *outputfile)
>>  
>>  		/* Setup ACPICA disassembler globals */
>>  		Gbl_DisasmFlag = TRUE;
>> -        	Gbl_DoCompile = FALSE;
>> -        	Gbl_OutputFilenamePrefix = (char*)outputfile;
>> +		Gbl_DoCompile = FALSE;
>> +		Gbl_OutputFilenamePrefix = (char*)outputfile;
>>  		Gbl_UseDefaultAmlFilename = FALSE;
>>  
>>  		/* Throw away noisy errors */
>> @@ -76,7 +76,7 @@ int fwts_iasl_disassemble_aml(const char *aml, const char *outputfile)
>>  		break;
>>  	default:
>>  		/* Parent */
>> -		waitpid(pid, &status, WUNTRACED | WCONTINUED);
>> +		(void)waitpid(pid, &status, WUNTRACED | WCONTINUED);
>>  	}
>>  
>>  	return 0;
>> @@ -84,13 +84,14 @@ int fwts_iasl_disassemble_aml(const char *aml, const char *outputfile)
>>  
>>  int fwts_iasl_assemble_aml(const char *source, char **output)
>>  {
>> -	int pipefds[2];
>> +	int 	pipefds[2];
>> +	int	status;
>> +	int 	ret = 0;
>> +	size_t	len = 0;
>> +	ssize_t	n;
>>  	pid_t	pid;
>>  	char    *data = NULL;
>>  	char	buffer[8192];
>> -	int	n;
>> -	int 	len = 0;
>> -	int	status;
>>  
>>  	if (pipe(pipefds) < 0)
>>  		return -1;
>> @@ -98,46 +99,61 @@ int fwts_iasl_assemble_aml(const char *source, char **output)
>>  	pid = fork();
>>  	switch (pid) {
>>  	case -1:
>> -		close(pipefds[0]);
>> -		close(pipefds[1]);
>> +		(void)close(pipefds[0]);
>> +		(void)close(pipefds[1]);
>>  		return -1;
>>  	case 0:
>>  		/* Child */
>>  		init_asl_core();
>>  
>> -		if (pipefds[0] != STDOUT_FILENO) {
>> -			dup2(pipefds[1], STDOUT_FILENO);
>> -			close(pipefds[1]);
>> +		/* stdout to be redirected down the writer end of pipe */
>> +		if (pipefds[1] != STDOUT_FILENO) {
>> +			if (dup2(pipefds[1], STDOUT_FILENO) < 0) {
>> +				_exit(EXIT_FAILURE);
>> +			}
>>  		}
>> -		close(pipefds[0]);
>> +		/* Close reader end */
>> +		(void)close(pipefds[0]);
>>  
>>  		/* Setup ACPICA compiler globals */
>>  		Gbl_DisasmFlag = FALSE;
>> -        	Gbl_DoCompile = TRUE;
>> +		Gbl_DoCompile = TRUE;
>>  		Gbl_PreprocessFlag = TRUE;
>> -        	Gbl_UseDefaultAmlFilename = FALSE;
>> -        	Gbl_OutputFilenamePrefix = (char*)source;
>> +		Gbl_UseDefaultAmlFilename = FALSE;
>> +		Gbl_OutputFilenamePrefix = (char*)source;
>>  
>> -		status = AslDoOnePathname((char*)source, AslDoOneFile);
>> +		(void)AslDoOnePathname((char*)source, AslDoOneFile);
>>  
>> -		close(pipefds[1]);
>> +		/*
>> +		 * We need to flush buffered I/O on IASL stdout
>> +		 * before we exit
>> +		 */
>> +		fflush(stdout);
>>  
>>  		_exit(0);
>>  		break;
>>  	default:
>>  		/* Parent */
>> -		close(pipefds[1]);
>>  
>> +		/* Close writer end */
>> +		(void)close(pipefds[1]);
>> +
>> +		/* Gather output from IASL */
>>  		while ((n = read(pipefds[0], buffer, sizeof(buffer))) > 0) {
>>  			data = realloc(data, len + n + 1);
>> +			if (data == NULL) {
>> +				ret = -1;
>> +				break;
>> +			}
>>  			memcpy(data + len, buffer, n);
>>  			len += n;
>> -			data[len] = 0;
>> +			data[len] = '\0';
>>  		}
>> -		waitpid(pid, &status, WUNTRACED | WCONTINUED);
>> -		close(pipefds[0]);
>> +		(void)waitpid(pid, &status, WUNTRACED | WCONTINUED);
>> +		(void)close(pipefds[0]);
>> +		break;
>>  	}
>>  
>>  	*output = data;
>> -	return 0;
>> +	return ret;
>>  }
>>
> 
> NACK, found a regression on some deeper testing. Will sent an update
> later.  Apologies
> 

Sorry, ignore my own NACK, I found the bug was somewhere else. This code
is working as expected after all. *sigh*

Colin



More information about the fwts-devel mailing list