Fix build problem with system call in compile/compile.c

Message ID 54AFA92C.8010108@redhat.com
State New, archived
Headers

Commit Message

Pedro Alves Jan. 9, 2015, 10:10 a.m. UTC
  On 01/09/2015 03:54 AM, Chen Gang S wrote:
> On 1/9/15 08:10, Steve Ellcey wrote:
>> On Thu, 2015-01-08 at 23:22 +0000, Pedro Alves wrote:
>>> On 01/08/2015 10:12 PM, Steve Ellcey wrote:
>>>
>>>> I haven't seen any objection to
>>>> Chen's patch but I haven't seen an official approval either.
>>>
>>> FAOD, Chen's patch is OK.
>>>
>>> Thanks,
>>> Pedro Alves
>>>
>>
>> Excellent.  Chen Gang, do you have write access to check in this patch
>> or do you need someone to do the check in for you?
>>
> 
> Excuse me, I guess, I can not check in, welcome any other members help to
> check in for me.
I was going to apply it as is, but I recalled that the return
of "system" is really a 'wait' status:

> +  if (system (zap))
> +    warning (_("Could not remove temporary directory %s"), dir);

so I tweaked the patch accordingly, and pushed it, as below.

------------
From: Chen Gang <gang.chen@sunrus.com.cn>
Subject: [PATCH] gdb/compile/compile.c: Check return value of 'system' to
 avoid compiler warning

Under Ubuntu 12, we need to check the return value of system(), or the
compiler warns:

  gcc -g -O2   -I. -I../../binutils-gdb/gdb -I../../binutils-gdb/gdb/common -I../../binutils-gdb/gdb/config -DLOCALEDIR="\"/usr/local/share/locale\"" -DHAVE_CONFIG_H -I../../binutils-gdb/gdb/../include/opcode -I../../binutils-gdb/gdb/../opcodes/.. -I../../binutils-gdb/gdb/../readline/.. -I../bfd -I../../binutils-gdb/gdb/../bfd -I../../binutils-gdb/gdb/../include -I../libdecnumber -I../../binutils-gdb/gdb/../libdecnumber  -I../../binutils-gdb/gdb/gnulib/import -Ibuild-gnulib/import   -DTUI=1  -Wall -Wdeclaration-after-statement -Wpointer-arith -Wpointer-sign -Wno-unused -Wunused-value -Wunused-function -Wno-switch -Wno-char-subscripts -Wmissing-prototypes -Wdeclaration-after-statement -Wempty-body -Wmissing-parameter-type -Wold-style-declaration -Wold-style-definition -Wformat-nonliteral -Werror -c -o compile.o -MT compile.o -MMD -MP -MF .deps/compile.Tpo ../../binutils-gdb/gdb/compile/compile.c
  ../../binutils-gdb/gdb/compile/compile.c: In function ‘do_rmdir’:
  ../../binutils-gdb/gdb/compile/compile.c:175:10: error: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Werror=unused-result]
  cc1: all warnings being treated as errors
  make[2]: *** [compile.o] Error 1
  make[2]: Leaving directory `/upstream/build-binutils-s390/gdb'
  make[1]: *** [all-gdb] Error 2
  make[1]: Leaving directory `/upstream/build-binutils-s390'
  make: *** [all] Error 2

Also, 'zap' is leaking.

2015-01-09  Chen Gang  <gang.chen.5i5j@gmail.com>
	    Pedro Alves  <palves@redhat.com>

	* compile/compile.c: Include "gdb_wait.h".
	(do_rmdir): Check return value, and free 'zap'.
---
 gdb/compile/compile.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
  

Comments

Chen Gang Jan. 9, 2015, 10:50 a.m. UTC | #1
On 1/9/15 18:10, Pedro Alves wrote:
> On 01/09/2015 03:54 AM, Chen Gang S wrote:
>>
>> Excuse me, I guess, I can not check in, welcome any other members help to
>> check in for me.
> I was going to apply it as is, but I recalled that the return
> of "system" is really a 'wait' status:
> 
>> +  if (system (zap))
>> +    warning (_("Could not remove temporary directory %s"), dir);
> 
> so I tweaked the patch accordingly, and pushed it, as below.
[...]
> -  system (zap);
> +  wstat = system (zap);
> +  if (wstat == -1 || !WIFEXITED (wstat) || WEXITSTATUS (wstat) != 0)
> +    warning (_("Could not remove temporary directory %s"), dir);

Oh, really it is.  Thanks.


Thanks.
  
Chen Gang Jan. 9, 2015, 8:59 p.m. UTC | #2
On 1/9/15 18:50, Chen Gang S wrote:
> On 1/9/15 18:10, Pedro Alves wrote:
>> On 01/09/2015 03:54 AM, Chen Gang S wrote:
>>>
>>> Excuse me, I guess, I can not check in, welcome any other members help to
>>> check in for me.
>> I was going to apply it as is, but I recalled that the return
>> of "system" is really a 'wait' status:
>>
>>> +  if (system (zap))
>>> +    warning (_("Could not remove temporary directory %s"), dir);
>>
>> so I tweaked the patch accordingly, and pushed it, as below.
> [...]
>> -  system (zap);
>> +  wstat = system (zap);
>> +  if (wstat == -1 || !WIFEXITED (wstat) || WEXITSTATUS (wstat) != 0)
>> +    warning (_("Could not remove temporary directory %s"), dir);
> 
> Oh, really it is.  Thanks.
> 

Excuse me, I am not quite familiar with the patch apply working flow for
binutils/gdb, it seems each patch can only have one 'Signed-of-by' for
it (do not like Linux kernel or QEMU, can have multiple 'Signed-of-by').

For me, this patch need multiple 'Signed-of-by': I start the patch, and
Pedro Alves give a very necessary improvement (or it will introduce a
new bug, which is not recognized quite obviously by others).

If what I said above is correct, one way maybe, apply my original patch
firstly, then apply the fix patch by Pedro Alves. I am not quite sure
whether this way is suitable or not, though.


Thanks.
  
Chen Gang Jan. 9, 2015, 10 p.m. UTC | #3
On 1/10/15 04:59, Chen Gang S wrote:
> On 1/9/15 18:50, Chen Gang S wrote:
>> On 1/9/15 18:10, Pedro Alves wrote:
>>> On 01/09/2015 03:54 AM, Chen Gang S wrote:
>>>>
>>>> Excuse me, I guess, I can not check in, welcome any other members help to
>>>> check in for me.
>>> I was going to apply it as is, but I recalled that the return
>>> of "system" is really a 'wait' status:
>>>
>>>> +  if (system (zap))
>>>> +    warning (_("Could not remove temporary directory %s"), dir);
>>>
>>> so I tweaked the patch accordingly, and pushed it, as below.
>> [...]
>>> -  system (zap);
>>> +  wstat = system (zap);
>>> +  if (wstat == -1 || !WIFEXITED (wstat) || WEXITSTATUS (wstat) != 0)
>>> +    warning (_("Could not remove temporary directory %s"), dir);
>>
>> Oh, really it is.  Thanks.
>>
> 
> Excuse me, I am not quite familiar with the patch apply working flow for
> binutils/gdb, it seems each patch can only have one 'Signed-of-by' for
> it (do not like Linux kernel or QEMU, can have multiple 'Signed-of-by').
> 
> For me, this patch need multiple 'Signed-of-by': I start the patch, and
> Pedro Alves give a very necessary improvement (or it will introduce a
> new bug, which is not recognized quite obviously by others).
> 
> If what I said above is correct, one way maybe, apply my original patch
> firstly, then apply the fix patch by Pedro Alves. I am not quite sure
> whether this way is suitable or not, though.
> 

Oh, the patch is already applied with 2 appliers :-)


Thanks.
  
Joel Brobecker Jan. 10, 2015, 4:30 a.m. UTC | #4
> Excuse me, I am not quite familiar with the patch apply working flow for
> binutils/gdb, it seems each patch can only have one 'Signed-of-by' for
> it (do not like Linux kernel or QEMU, can have multiple 'Signed-of-by').
> 
> For me, this patch need multiple 'Signed-of-by': I start the patch, and
> Pedro Alves give a very necessary improvement (or it will introduce a
> new bug, which is not recognized quite obviously by others).

I know you've answered your own question about your patch in particular,
but I wanted to clarify a couple of things.

About "can only have one 'Signed-off-by'":

    We do not use git's sign-off (at least, not at the moment).
    As you know, there is an approval process through this mailing
    list which is used instead, but who actually approves the patch
    is not recorded in the git commit.

    However, the approver is not the same thing at the author, or
    the group of authors. If you are the sole author of a patch,
    and I request a few small changes that you make, and then it
    gets approved, you are still the sole author of those changes.
    Hence your name remains the only name listed in the corresponding
    ChangeLog entries. There is a small exception where a reviewer
    contributes significant ideas towards the final patch, or even
    contributes pieces of it, in which case the reviewer now also
    becomes co-author, in which case his name gets added to the
    corresponding ChangeLog entries.

> If what I said above is correct, one way maybe, apply my original patch
> firstly, then apply the fix patch by Pedro Alves. I am not quite sure
> whether this way is suitable or not, though.

About that:

    We avoid that approach, because it introduces a commit where
    we know there is an issue. Although the issue is supposed to
    get fixed right after, it still isn't great in the context of
    "git bisect" for instance.
  

Patch

diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c
index 1d18bd7..ccac49d 100644
--- a/gdb/compile/compile.c
+++ b/gdb/compile/compile.c
@@ -37,6 +37,7 @@ 
 #include "filestuff.h"
 #include "target.h"
 #include "osabi.h"
+#include "gdb_wait.h"
 
 
 
@@ -169,10 +170,14 @@  do_rmdir (void *arg)
 {
   const char *dir = arg;
   char *zap;
-  
+  int wstat;
+
   gdb_assert (strncmp (dir, TMP_PREFIX, strlen (TMP_PREFIX)) == 0);
   zap = concat ("rm -rf ", dir, (char *) NULL);
-  system (zap);
+  wstat = system (zap);
+  if (wstat == -1 || !WIFEXITED (wstat) || WEXITSTATUS (wstat) != 0)
+    warning (_("Could not remove temporary directory %s"), dir);
+  XDELETEVEC (zap);
 }
 
 /* Return the name of the temporary directory to use for .o files, and