Patchwork Correct handling of gcc-[ar|nm|ranlib] exit codes

login
register
mail settings
Submitter Meador Inge
Date Sept. 27, 2012, 1:01 p.m.
Message ID <1348750886-20673-1-git-send-email-meadori@codesourcery.com>
Download mbox | patch
Permalink /patch/187351/
State New
Headers show

Comments

Meador Inge - Sept. 27, 2012, 1:01 p.m.
Hi All,

The gcc-[ar|nm|ranlib] LTO utils use 'pex_one' to spawn the wrapped binutils
program.  However, currently it is blindly returning the value of the 'err'
parameter for the exit code.  According the documentation [1] 'err' is only
set for an error return and 'status' is only set for a successful return.

This patch fixes the bug by appropriately checking the returned status
and extracting the exit code when needed.  Tested on GNU/Linux and Windows.

OK?

2012-09-27  Meador Inge  <meadori@codesourcery.com>

	* gcc-ar.c (main): Handle the returning of the sub-process error
	code correctly.

[1] http://gcc.gnu.org/onlinedocs/libiberty/Functions.html#Functions
Richard Guenther - Sept. 27, 2012, 1:53 p.m.
On Thu, Sep 27, 2012 at 3:01 PM, Meador Inge <meadori@codesourcery.com> wrote:
> Hi All,
>
> The gcc-[ar|nm|ranlib] LTO utils use 'pex_one' to spawn the wrapped binutils
> program.  However, currently it is blindly returning the value of the 'err'
> parameter for the exit code.  According the documentation [1] 'err' is only
> set for an error return and 'status' is only set for a successful return.
>
> This patch fixes the bug by appropriately checking the returned status
> and extracting the exit code when needed.  Tested on GNU/Linux and Windows.
>
> OK?

Ok.  Also for the branches (where applicable).

Thanks,
Richard.

> 2012-09-27  Meador Inge  <meadori@codesourcery.com>
>
>         * gcc-ar.c (main): Handle the returning of the sub-process error
>         code correctly.
>
> [1] http://gcc.gnu.org/onlinedocs/libiberty/Functions.html#Functions
>
> Index: gcc/gcc-ar.c
> ===================================================================
> --- gcc/gcc-ar.c        (revision 191792)
> +++ gcc/gcc-ar.c        (working copy)
> @@ -42,6 +42,7 @@
>    const char *err_msg;
>    const char **nargv;
>    bool is_ar = !strcmp (PERSONALITY, "ar");
> +  int exit_code = FATAL_EXIT_CODE;
>
>    exe_name = PERSONALITY;
>  #ifdef CROSS_DIRECTORY_STRUCTURE
> @@ -96,6 +97,20 @@
>                      NULL,NULL,  &status, &err);
>    if (err_msg)
>      fprintf(stderr, "Error running %s: %s\n", exe_name, err_msg);
> +  else if (status)
> +    {
> +      if (WIFSIGNALED (status))
> +       {
> +         int sig = WTERMSIG (status);
> +         fprintf (stderr, "%s terminated with signal %d [%s]%s\n",
> +                  exe_name, sig, strsignal(sig),
> +                  WCOREDUMP(status) ? ", core dumped" : "");
> +       }
> +      else if (WIFEXITED (status))
> +       exit_code = WEXITSTATUS (status);
> +    }
> +  else
> +    exit_code = SUCCESS_EXIT_CODE;
>
> -  return err;
> +  return exit_code;
>  }

Patch

Index: gcc/gcc-ar.c
===================================================================
--- gcc/gcc-ar.c	(revision 191792)
+++ gcc/gcc-ar.c	(working copy)
@@ -42,6 +42,7 @@ 
   const char *err_msg;
   const char **nargv;
   bool is_ar = !strcmp (PERSONALITY, "ar");
+  int exit_code = FATAL_EXIT_CODE;
 
   exe_name = PERSONALITY;
 #ifdef CROSS_DIRECTORY_STRUCTURE
@@ -96,6 +97,20 @@ 
 		     NULL,NULL,  &status, &err);
   if (err_msg) 
     fprintf(stderr, "Error running %s: %s\n", exe_name, err_msg);
+  else if (status)
+    {
+      if (WIFSIGNALED (status))
+	{
+	  int sig = WTERMSIG (status);
+	  fprintf (stderr, "%s terminated with signal %d [%s]%s\n",
+		   exe_name, sig, strsignal(sig),
+		   WCOREDUMP(status) ? ", core dumped" : "");
+	}
+      else if (WIFEXITED (status))
+	exit_code = WEXITSTATUS (status);
+    }
+  else
+    exit_code = SUCCESS_EXIT_CODE;
 
-  return err;
+  return exit_code;
 }