ACK: [PATCH] fwts_iasl_interface.c: ensure we read in all of stdout (LP: #1200426)
Alex Hung
alex.hung at canonical.com
Fri Jul 12 02:41:10 UTC 2013
On 07/12/2013 08:06 AM, 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;
> }
>
Acked-by: Alex Hung <alex.hung at canonical.com>
--
Cheers,
Alex Hung
More information about the fwts-devel
mailing list