Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [patch gdbserver 7.6.1 only] Fix fd leak regression
@ 2013-08-29 11:11 Jan Kratochvil
  2013-08-29 12:15 ` Pedro Alves
  0 siblings, 1 reply; 12+ messages in thread
From: Jan Kratochvil @ 2013-08-29 11:11 UTC (permalink / raw)
  To: gdb-patches

Hi,

in
	[commit without 7.6.1] [gdbserver patch] [7.6.1] Fix fd leak regression
	https://sourceware.org/ml/gdb-patches/2013-08/msg00845.html
I wrote:
# Although without 7.6.1 - 7.6 does not yet have gdb/common/filestuff.[ch] and
# from various available solutions I think it is just OK to wait for 7.7.

As I found I would like even 7.6.x fixed I wrote this alternative patch.

No regressions on {x86_64,x86_64-m32,i686}-fedora21pre-linux-gnu and in
gdbserver mode.


Thanks,
Jan


gdb/gdbserver/
2013-08-29  Jan Kratochvil  <jan.kratochvil@redhat.com>

	PR server/15604
	* linux-low.c
	(linux_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
	Close LISTEN_DESC.
	(lynx_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
	Close LISTEN_DESC.
	* remote-utils.c (listen_desc): Remove static qualifier.
	* server.h (listen_desc): New declaration.
	* spu-low.c
	(spu_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
	Close LISTEN_DESC.

diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 523926d..38d1caa 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -668,6 +668,8 @@ linux_create_inferior (char *program, char **allargs)
 	      /* Errors ignored.  */;
 	    }
 	}
+      else
+	close (listen_desc);
 
       execv (program, allargs);
       if (errno == ENOENT)
diff --git a/gdb/gdbserver/lynx-low.c b/gdb/gdbserver/lynx-low.c
index a5f3b6d..78ab6f4 100644
--- a/gdb/gdbserver/lynx-low.c
+++ b/gdb/gdbserver/lynx-low.c
@@ -218,6 +218,8 @@ lynx_create_inferior (char *program, char **allargs)
       pgrp = getpid();
       setpgid (0, pgrp);
       ioctl (0, TIOCSPGRP, &pgrp);
+      if (!remote_connection_is_stdio ())
+	close (listen_desc);
       lynx_ptrace (PTRACE_TRACEME, null_ptid, 0, 0, 0);
       execv (program, allargs);
       fprintf (stderr, "Cannot exec %s: %s.\n", program, strerror (errno));
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index 42c6a54..0738309 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -109,7 +109,7 @@ struct ui_file *gdb_stdlog;
 static int remote_is_stdio = 0;
 
 static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR;
-static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR;
+gdb_fildes_t listen_desc = INVALID_DESCRIPTOR;
 
 /* FIXME headerize? */
 extern int using_threads;
diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index 139cd49..e5dce4e 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -274,6 +274,7 @@ extern void hostio_last_error_from_errno (char *own_buf);
 /* From remote-utils.c */
 
 extern int remote_debug;
+extern gdb_fildes_t listen_desc;
 extern int noack_mode;
 extern int transport_is_reliable;
 
diff --git a/gdb/gdbserver/spu-low.c b/gdb/gdbserver/spu-low.c
index deaa115..07839ca 100644
--- a/gdb/gdbserver/spu-low.c
+++ b/gdb/gdbserver/spu-low.c
@@ -273,6 +273,8 @@ spu_create_inferior (char *program, char **allargs)
 
   if (pid == 0)
     {
+      if (!remote_connection_is_stdio ())
+	close (listen_desc);
       ptrace (PTRACE_TRACEME, 0, 0, 0);
 
       setpgid (0, 0);


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 11:11 [patch gdbserver 7.6.1 only] Fix fd leak regression Jan Kratochvil
@ 2013-08-29 12:15 ` Pedro Alves
  2013-08-29 13:04   ` Jan Kratochvil
  0 siblings, 1 reply; 12+ messages in thread
From: Pedro Alves @ 2013-08-29 12:15 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: gdb-patches

On 08/29/2013 12:10 PM, Jan Kratochvil wrote:
> Hi,
> 
> in
> 	[commit without 7.6.1] [gdbserver patch] [7.6.1] Fix fd leak regression
> 	https://sourceware.org/ml/gdb-patches/2013-08/msg00845.html
> I wrote:
> # Although without 7.6.1 - 7.6 does not yet have gdb/common/filestuff.[ch] and
> # from various available solutions I think it is just OK to wait for 7.7.
> 
> As I found I would like even 7.6.x fixed I wrote this alternative patch.
> 

(We could also just mark the sockets as SOCK_CLOEXEC, I think?
Though that's "only" since Linux 2.6.27, so I've no objection with
going this route.)

I think we need to close remote_desc too.  With plain "target remote",
the inferior is spawned before gdb connects, but with extended-remote+"run",
that's not the case.

-- 
Pedro Alves


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 12:15 ` Pedro Alves
@ 2013-08-29 13:04   ` Jan Kratochvil
  2013-08-29 14:17     ` Pedro Alves
  0 siblings, 1 reply; 12+ messages in thread
From: Jan Kratochvil @ 2013-08-29 13:04 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

On Thu, 29 Aug 2013 14:15:45 +0200, Pedro Alves wrote:
> (We could also just mark the sockets as SOCK_CLOEXEC, I think?
> Though that's "only" since Linux 2.6.27, so I've no objection with
> going this route.)

* There is no real need for SOCK_CLOEXEC, GDB benefits from it for Python
  threads (possibly calling their own fork+exec) but those do not happen for
  gdbserver.

* It would not work for old/non-Linux OSes which does not matter much but it
  is still rather a disadvantage.

* One has to handle missing SOCK_CLOEXEC #define and also errors on setting
  it, and for two fds.

So +/- I did not consider it easier than this one.


> I think we need to close remote_desc too.  With plain "target remote",
> the inferior is spawned before gdb connects, but with extended-remote+"run",
> that's not the case.

True, thanks for catching it.

I have tested extended-remote really leaked fd and the leak no longer happens.


Jan


gdb/gdbserver/
2013-08-29  Jan Kratochvil  <jan.kratochvil@redhat.com>

	PR server/15604
	* linux-low.c
	(linux_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
	Close LISTEN_DESC and optionally REMOTE_DESC.
	(lynx_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
	Close LISTEN_DESC and optionally REMOTE_DESC.
	* remote-utils.c (remote_desc, listen_desc): Remove static qualifier.
	* server.h (remote_desc, listen_desc): New declaration.
	* spu-low.c
	(spu_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
	Close LISTEN_DESC and optionally REMOTE_DESC.

diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 12208dc..4e16372 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -602,6 +602,12 @@ linux_create_inferior (char *program, char **allargs)
 	      /* Errors ignored.  */;
 	    }
 	}
+      else
+	{
+	  close (listen_desc);
+	  if (gdb_connected ())
+	    close (remote_desc);
+	}
 
       execv (program, allargs);
       if (errno == ENOENT)
diff --git a/gdb/gdbserver/lynx-low.c b/gdb/gdbserver/lynx-low.c
index 4cf8683..46c5fbb 100644
--- a/gdb/gdbserver/lynx-low.c
+++ b/gdb/gdbserver/lynx-low.c
@@ -245,6 +245,12 @@ lynx_create_inferior (char *program, char **allargs)
       pgrp = getpid();
       setpgid (0, pgrp);
       ioctl (0, TIOCSPGRP, &pgrp);
+      if (!remote_connection_is_stdio ())
+	{
+	  close (listen_desc);
+	  if (gdb_connected ())
+	    close (remote_desc);
+	}
       lynx_ptrace (PTRACE_TRACEME, null_ptid, 0, 0, 0);
       execv (program, allargs);
       fprintf (stderr, "Cannot exec %s: %s.\n", program, strerror (errno));
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index 5cd6fa1..aa02c09 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -107,8 +107,8 @@ struct ui_file *gdb_stdlog;
 
 static int remote_is_stdio = 0;
 
-static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR;
-static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR;
+gdb_fildes_t remote_desc = INVALID_DESCRIPTOR;
+gdb_fildes_t listen_desc = INVALID_DESCRIPTOR;
 
 /* FIXME headerize? */
 extern int using_threads;
diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index 1a1d9b2..88eae43 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -281,6 +281,8 @@ extern void hostio_last_error_from_errno (char *own_buf);
 /* From remote-utils.c */
 
 extern int remote_debug;
+extern gdb_fildes_t remote_desc;
+extern gdb_fildes_t listen_desc;
 extern int noack_mode;
 extern int transport_is_reliable;
 
diff --git a/gdb/gdbserver/spu-low.c b/gdb/gdbserver/spu-low.c
index 6e3974a..028829b 100644
--- a/gdb/gdbserver/spu-low.c
+++ b/gdb/gdbserver/spu-low.c
@@ -274,6 +274,12 @@ spu_create_inferior (char *program, char **allargs)
 
   if (pid == 0)
     {
+      if (!remote_connection_is_stdio ())
+	{
+	  close (listen_desc);
+	  if (gdb_connected ())
+	    close (remote_desc);
+	}
       ptrace (PTRACE_TRACEME, 0, 0, 0);
 
       setpgid (0, 0);
diff --git a/gdb/testsuite/gdb.base/fd-leak.c b/gdb/testsuite/gdb.base/fd-leak.c
new file mode 100644
index 0000000..bb88164
--- /dev/null
+++ b/gdb/testsuite/gdb.base/fd-leak.c
@@ -0,0 +1,42 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2013 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+int
+main (void)
+{
+  int expect_fd = 3, iter;
+
+  for (iter = 0; iter < 20; iter++)
+    {
+      int got = dup (0);
+
+      if (got != expect_fd)
+	{
+	  fprintf (stderr, "In iteration %d expected fd %d but got %d: %s\n",
+	           iter, expect_fd, got, strerror (errno));
+	  return 1;
+	}
+      expect_fd++;
+    }
+
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/fd-leak.exp b/gdb/testsuite/gdb.base/fd-leak.exp
new file mode 100644
index 0000000..dfc70d7
--- /dev/null
+++ b/gdb/testsuite/gdb.base/fd-leak.exp
@@ -0,0 +1,37 @@
+# Copyright 2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+standard_testfile
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
+    return -1
+}
+
+set test "system fd behavior is known"
+set status [remote_exec target "[standard_output_file $testfile]"]
+if { [lindex $status 0] == 0 } {
+    pass $test
+} else {
+    fail $test
+}
+remote_exec target "ls -l /proc/self/fd/"
+# exec "sh" "-c" "ls -l /proc/self/fd/ >/tmp/fd-leak.debug"
+
+clean_restart "$testfile"
+
+if ![runto_main] {
+    untested "could not run to main"
+    return -1
+}


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 13:04   ` Jan Kratochvil
@ 2013-08-29 14:17     ` Pedro Alves
  2013-08-29 14:27       ` [commit 7.6.1 only] " Jan Kratochvil
  2013-08-29 14:40       ` Tom Tromey
  0 siblings, 2 replies; 12+ messages in thread
From: Pedro Alves @ 2013-08-29 14:17 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: gdb-patches

On 08/29/2013 02:03 PM, Jan Kratochvil wrote:
> On Thu, 29 Aug 2013 14:15:45 +0200, Pedro Alves wrote:
>> (We could also just mark the sockets as SOCK_CLOEXEC, I think?
>> Though that's "only" since Linux 2.6.27, so I've no objection with
>> going this route.)
> 
> * There is no real need for SOCK_CLOEXEC, GDB benefits from it for Python
>   threads (possibly calling their own fork+exec) but those do not happen for
>   gdbserver.

I suspect we'll have to revisit this at some point (years from now),
but yeah, agreed.

> 
> * It would not work for old/non-Linux OSes which does not matter much but it
>   is still rather a disadvantage.

*nod*

> gdb/gdbserver/
> 2013-08-29  Jan Kratochvil  <jan.kratochvil@redhat.com>
> 
> 	PR server/15604
> 	* linux-low.c
> 	(linux_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
> 	Close LISTEN_DESC and optionally REMOTE_DESC.
> 	(lynx_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
> 	Close LISTEN_DESC and optionally REMOTE_DESC.
> 	* remote-utils.c (remote_desc, listen_desc): Remove static qualifier.
> 	* server.h (remote_desc, listen_desc): New declaration.
> 	* spu-low.c
> 	(spu_create_inferior) <pid == 0 && !remote_connection_is_stdio ()>:
> 	Close LISTEN_DESC and optionally REMOTE_DESC.

Thanks, this looks good to me.

> +set test "system fd behavior is known"
> +set status [remote_exec target "[standard_output_file $testfile]"]
> +if { [lindex $status 0] == 0 } {
> +    pass $test
> +} else {
> +    fail $test
> +}
> +remote_exec target "ls -l /proc/self/fd/"

Before gdbserver's fix, do we get one extra fd from the dejagnu
leak, and another extra from gdbserver's leak?  What if we made
$testfile count open fds, and then compare that between running
under gdb/gdbserver and just under remote_exec ?

-- 
Pedro Alves


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [commit 7.6.1 only] [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 14:17     ` Pedro Alves
@ 2013-08-29 14:27       ` Jan Kratochvil
  2013-08-29 14:39         ` Pedro Alves
  2013-08-29 14:40       ` Tom Tromey
  1 sibling, 1 reply; 12+ messages in thread
From: Jan Kratochvil @ 2013-08-29 14:27 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

On Thu, 29 Aug 2013 16:17:40 +0200, Pedro Alves wrote:
> Thanks, this looks good to me.

Checked in:
	https://sourceware.org/ml/gdb-cvs/2013-08/msg00161.html


> > +set test "system fd behavior is known"
> > +set status [remote_exec target "[standard_output_file $testfile]"]
> > +if { [lindex $status 0] == 0 } {
> > +    pass $test
> > +} else {
> > +    fail $test
> > +}
> > +remote_exec target "ls -l /proc/self/fd/"
> 
> Before gdbserver's fix, do we get one extra fd from the dejagnu
> leak, and another extra from gdbserver's leak?  What if we made
> $testfile count open fds, and then compare that between running
> under gdb/gdbserver and just under remote_exec ?

BTW not sure if it is clear but this gdb/testsuite/ part was sent
accidentally, there is even written no real test and I have not checked in
anything as I got stuck on the DejaGNU bug.

I have sent a bugreport to <bug-dejagnu@gnu.org> and it got processed today
although the mail has not yet appeared in the archive:
	http://lists.gnu.org/archive/html/bug-dejagnu/

I hope DejaGNU gets fixed soon so the testcase can be later written as
UNSUPPORTED (UNTESTED?) with buggy DejaGNU.


Thanks,
Jan


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [commit 7.6.1 only] [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 14:27       ` [commit 7.6.1 only] " Jan Kratochvil
@ 2013-08-29 14:39         ` Pedro Alves
  0 siblings, 0 replies; 12+ messages in thread
From: Pedro Alves @ 2013-08-29 14:39 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: gdb-patches

On 08/29/2013 03:27 PM, Jan Kratochvil wrote:
> On Thu, 29 Aug 2013 16:17:40 +0200, Pedro Alves wrote:

>>> +set test "system fd behavior is known"
>>> +set status [remote_exec target "[standard_output_file $testfile]"]
>>> +if { [lindex $status 0] == 0 } {
>>> +    pass $test
>>> +} else {
>>> +    fail $test
>>> +}
>>> +remote_exec target "ls -l /proc/self/fd/"
>>
>> Before gdbserver's fix, do we get one extra fd from the dejagnu
>> leak, and another extra from gdbserver's leak?  What if we made
>> $testfile count open fds, and then compare that between running
>> under gdb/gdbserver and just under remote_exec ?
> 
> BTW not sure if it is clear 

It wasn't at first, but I figured it out when I noticed it had
no ChangeLog entry.

> but this gdb/testsuite/ part was sent
> accidentally, there is even written no real test and I have not checked in
> anything as I got stuck on the DejaGNU bug.

Understood.  I was suggesting a possible way to not need to
wait for the dejagnu bug to be fixed.  If what I suggested actually
works, I don't see a downside -- we'd just be checking whether
gdbserver itself introduces any leak, which is all we should
care about?

> 
> I have sent a bugreport to <bug-dejagnu@gnu.org> and it got processed today
> although the mail has not yet appeared in the archive:
> 	http://lists.gnu.org/archive/html/bug-dejagnu/
> 
> I hope DejaGNU gets fixed soon so the testcase can be later written as
> UNSUPPORTED (UNTESTED?) with buggy DejaGNU.

Ack.

-- 
Pedro Alves


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 14:17     ` Pedro Alves
  2013-08-29 14:27       ` [commit 7.6.1 only] " Jan Kratochvil
@ 2013-08-29 14:40       ` Tom Tromey
  2013-08-29 14:51         ` Pedro Alves
  1 sibling, 1 reply; 12+ messages in thread
From: Tom Tromey @ 2013-08-29 14:40 UTC (permalink / raw)
  To: Pedro Alves; +Cc: Jan Kratochvil, gdb-patches

>> * There is no real need for SOCK_CLOEXEC, GDB benefits from it for Python
>> threads (possibly calling their own fork+exec) but those do not happen for
>> gdbserver.

Pedro> I suspect we'll have to revisit this at some point (years from now),
Pedro> but yeah, agreed.

gdbserver on trunk can just use the filestuff.c code.

Tom


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 14:40       ` Tom Tromey
@ 2013-08-29 14:51         ` Pedro Alves
  2013-08-29 15:00           ` Tom Tromey
  0 siblings, 1 reply; 12+ messages in thread
From: Pedro Alves @ 2013-08-29 14:51 UTC (permalink / raw)
  To: Tom Tromey; +Cc: Jan Kratochvil, gdb-patches

On 08/29/2013 03:40 PM, Tom Tromey wrote:
>>> * There is no real need for SOCK_CLOEXEC, GDB benefits from it for Python
>>> threads (possibly calling their own fork+exec) but those do not happen for
>>> gdbserver.
> 
> Pedro> I suspect we'll have to revisit this at some point (years from now),
> Pedro> but yeah, agreed.
> 
> gdbserver on trunk can just use the filestuff.c code.

Yeah, it already does:

 https://sourceware.org/ml/gdb-patches/2013-08/msg00765.html

but it doesn't call socket_mark_cloexec or similars, so we'll
probably still have to revisit this at some point (years
from now).  :-)

-- 
Pedro Alves


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 14:51         ` Pedro Alves
@ 2013-08-29 15:00           ` Tom Tromey
  2013-08-29 17:22             ` Tom Tromey
  0 siblings, 1 reply; 12+ messages in thread
From: Tom Tromey @ 2013-08-29 15:00 UTC (permalink / raw)
  To: Pedro Alves; +Cc: Jan Kratochvil, gdb-patches

Tom> gdbserver on trunk can just use the filestuff.c code.

Pedro> Yeah, it already does:
Pedro>  https://sourceware.org/ml/gdb-patches/2013-08/msg00765.html
Pedro> but it doesn't call socket_mark_cloexec or similars, so we'll
Pedro> probably still have to revisit this at some point (years
Pedro> from now).  :-)

Yeah, I meant the other filestuff.h code, like gdb_socket_cloexec and
gdb_pipe_cloexec.

Tom


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 15:00           ` Tom Tromey
@ 2013-08-29 17:22             ` Tom Tromey
  2013-08-29 17:47               ` Pedro Alves
  0 siblings, 1 reply; 12+ messages in thread
From: Tom Tromey @ 2013-08-29 17:22 UTC (permalink / raw)
  To: Pedro Alves; +Cc: Jan Kratochvil, gdb-patches

Tom> Yeah, I meant the other filestuff.h code, like gdb_socket_cloexec and
Tom> gdb_pipe_cloexec.

Like this.  I haven't tested it using native-gdbserver yet.

Tom

commit d190e7c809a8dba4768cb67b9c46610e8e8e1d07
Author: Tom Tromey <tromey@redhat.com>
Date:   Thu Aug 29 10:13:50 2013 -0600

    use _cloexec functions in gdbserver
    
    This changes gdbserver to use the various _cloexec functions defined
    in common/filestuff.c.
    
    Two wrinkles here: first, I couldn't compile the NTO and SPU changes;
    second, the in process agent can't use gdb_socket_cloexec -- too bad,
    since the setting would be useful there.
    
    	* hostio.c (handle_open): Use gdb_open_cloexec.
    	* linux-low.c (elf_64_file_p, linux_create_inferior)
    	(linux_read_memory, linux_read_auxv): Use gdb_open_cloexec.
    	(linux_async): Use gdb_pipe_cloexec.
    	(linux_qxfer_spu, get_phdr_phnum_from_proc_auxv): Use
    	gdb_open_cloexec.
    	* nto-low.c (do_attach): Use gdb_open_cloexec.
    	* remote-utils.c (remote_prepare): Use gdb_socket_cloexec.
    	(remote_open): Use gdb_open_cloexec.
    	* spu-low.c (spu_proc_xfer_spu): Use gdb_open_cloexec.
    	* tracepointc. (gdb_socket_cloexec): Define in IPA mode.
    	(init_named_socket): Use gdb_socket_cloexec.

diff --git a/gdb/gdbserver/hostio.c b/gdb/gdbserver/hostio.c
index a74c2f8..edef7bc 100644
--- a/gdb/gdbserver/hostio.c
+++ b/gdb/gdbserver/hostio.c
@@ -20,6 +20,7 @@
 
 #include "server.h"
 #include "gdb/fileio.h"
+#include "filestuff.h"
 
 #include <fcntl.h>
 #include <limits.h>
@@ -295,7 +296,7 @@ handle_open (char *own_buf)
 
   /* We do not need to convert MODE, since the fileio protocol
      uses the standard values.  */
-  fd = open (filename, flags, mode);
+  fd = gdb_open_cloexec (filename, flags, mode);
 
   if (fd == -1)
     {
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 7db1fc8..3fa3bf1 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -315,7 +315,7 @@ elf_64_file_p (const char *file, unsigned int *machine)
   Elf64_Ehdr header;
   int fd;
 
-  fd = open (file, O_RDONLY);
+  fd = gdb_open_cloexec (file, O_RDONLY, 0);
   if (fd < 0)
     return -1;
 
@@ -596,7 +596,7 @@ linux_create_inferior (char *program, char **allargs)
       if (remote_connection_is_stdio ())
 	{
 	  close (0);
-	  open ("/dev/null", O_RDONLY);
+	  gdb_open_cloexec ("/dev/null", O_RDONLY, 0);
 	  dup2 (2, 1);
 	  if (write (2, "stdin/stdout redirected\n",
 		     sizeof ("stdin/stdout redirected\n") - 1) < 0)
@@ -4426,7 +4426,7 @@ linux_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
       /* We could keep this file open and cache it - possibly one per
 	 thread.  That requires some juggling, but is even faster.  */
       sprintf (filename, "/proc/%d/mem", pid);
-      fd = open (filename, O_RDONLY | O_LARGEFILE);
+      fd = gdb_open_cloexec (filename, O_RDONLY | O_LARGEFILE, 0);
       if (fd == -1)
 	goto no_proc;
 
@@ -4626,7 +4626,7 @@ linux_read_auxv (CORE_ADDR offset, unsigned char *myaddr, unsigned int len)
 
   xsnprintf (filename, sizeof filename, "/proc/%d/auxv", pid);
 
-  fd = open (filename, O_RDONLY);
+  fd = gdb_open_cloexec (filename, O_RDONLY, 0);
   if (fd < 0)
     return -1;
 
@@ -4859,7 +4859,7 @@ linux_async (int enable)
 
       if (enable)
 	{
-	  if (pipe (linux_event_pipe) == -1)
+	  if (gdb_pipe_cloexec (linux_event_pipe) == -1)
 	    fatal ("creating event pipe failed.");
 
 	  fcntl (linux_event_pipe[0], F_SETFL, O_NONBLOCK);
@@ -5000,7 +5000,7 @@ linux_qxfer_spu (const char *annex, unsigned char *readbuf,
     }
 
   sprintf (buf, "/proc/%ld/fd/%s", pid, annex);
-  fd = open (buf, writebuf? O_WRONLY : O_RDONLY);
+  fd = gdb_open_cloexec (buf, writebuf? O_WRONLY : O_RDONLY, 0);
   if (fd <= 0)
     return -1;
 
@@ -5224,7 +5224,7 @@ get_phdr_phnum_from_proc_auxv (const int pid, const int is_elf64,
 
   xsnprintf (filename, sizeof filename, "/proc/%d/auxv", pid);
 
-  fd = open (filename, O_RDONLY);
+  fd = gdb_open_cloexec (filename, O_RDONLY, 0);
   if (fd < 0)
     return 1;
 
diff --git a/gdb/gdbserver/nto-low.c b/gdb/gdbserver/nto-low.c
index 3670133..91fffbc 100644
--- a/gdb/gdbserver/nto-low.c
+++ b/gdb/gdbserver/nto-low.c
@@ -21,6 +21,7 @@
 #include "server.h"
 #include "gdbthread.h"
 #include "nto-low.h"
+#include "filestuff.h"
 
 #include <limits.h>
 #include <fcntl.h>
@@ -178,7 +179,8 @@ do_attach (pid_t pid)
       init_nto_inferior (&nto_inferior);
     }
   xsnprintf (nto_inferior.nto_procfs_path, PATH_MAX - 1, "/proc/%d/as", pid);
-  nto_inferior.ctl_fd = open (nto_inferior.nto_procfs_path, O_RDWR);
+  nto_inferior.ctl_fd = gdb_open_cloexec (nto_inferior.nto_procfs_path,
+					  O_RDWR, 0);
   if (nto_inferior.ctl_fd == -1)
     {
       TRACE ("Failed to open %s\n", nto_inferior.nto_procfs_path);
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index 5cd6fa1..25f5302 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -68,6 +68,8 @@
 #include <sys/iomgr.h>
 #endif /* __QNX__ */
 
+#include "filestuff.h"
+
 #ifndef HAVE_SOCKLEN_T
 typedef int socklen_t;
 #endif
@@ -262,7 +264,7 @@ remote_prepare (char *name)
     }
 #endif
 
-  listen_desc = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
+  listen_desc = gdb_socket_cloexec (PF_INET, SOCK_STREAM, IPPROTO_TCP);
   if (listen_desc == -1)
     perror_with_name ("Can't open socket");
 
@@ -316,7 +318,7 @@ remote_open (char *name)
 
       if (stat (name, &statbuf) == 0
 	  && (S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode)))
-	remote_desc = open (name, O_RDWR);
+	remote_desc = gdb_open_cloexec (name, O_RDWR, 0);
       else
 	{
 	  errno = EINVAL;
diff --git a/gdb/gdbserver/spu-low.c b/gdb/gdbserver/spu-low.c
index e604b9f..63a2efc 100644
--- a/gdb/gdbserver/spu-low.c
+++ b/gdb/gdbserver/spu-low.c
@@ -239,7 +239,7 @@ spu_proc_xfer_spu (const char *annex, unsigned char *readbuf,
     return 0;
 
   sprintf (buf, "/proc/%ld/fd/%s", ptid_get_lwp (current_ptid), annex);
-  fd = open (buf, writebuf? O_WRONLY : O_RDONLY);
+  fd = gdb_open_cloexec (buf, writebuf? O_WRONLY : O_RDONLY, 0);
   if (fd <= 0)
     return -1;
 
diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c
index 5c0dec7..4c4a751 100644
--- a/gdb/gdbserver/tracepoint.c
+++ b/gdb/gdbserver/tracepoint.c
@@ -19,6 +19,7 @@
 #include "server.h"
 #include "gdbthread.h"
 #include "agent.h"
+#include "filestuff.h"
 
 #include <ctype.h>
 #include <fcntl.h>
@@ -147,6 +148,9 @@ trace_vdebug (const char *fmt, ...)
 # define ust_loaded gdb_agent_ust_loaded
 # define helper_thread_id gdb_agent_helper_thread_id
 # define cmd_buf gdb_agent_cmd_buf
+
+/* We don't want to use this one in IPA.  */
+# define gdb_socket_cloexec socket
 #endif
 
 #ifndef IN_PROCESS_AGENT
@@ -6787,7 +6791,7 @@ init_named_socket (const char *name)
   int result, fd;
   struct sockaddr_un addr;
 
-  result = fd = socket (PF_UNIX, SOCK_STREAM, 0);
+  result = fd = gdb_socket_cloexec (PF_UNIX, SOCK_STREAM, 0);
   if (result == -1)
     {
       warning ("socket creation failed: %s", strerror (errno));


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 17:22             ` Tom Tromey
@ 2013-08-29 17:47               ` Pedro Alves
  2013-08-29 18:27                 ` Tom Tromey
  0 siblings, 1 reply; 12+ messages in thread
From: Pedro Alves @ 2013-08-29 17:47 UTC (permalink / raw)
  To: Tom Tromey; +Cc: Jan Kratochvil, gdb-patches

On 08/29/2013 06:22 PM, Tom Tromey wrote:
> Tom> Yeah, I meant the other filestuff.h code, like gdb_socket_cloexec and
> Tom> gdb_pipe_cloexec.
> 

>     second, the in process agent can't use gdb_socket_cloexec 

But, why ?

> @@ -596,7 +596,7 @@ linux_create_inferior (char *program, char **allargs)
>        if (remote_connection_is_stdio ())
>  	{
>  	  close (0);
> -	  open ("/dev/null", O_RDONLY);
> +	  gdb_open_cloexec ("/dev/null", O_RDONLY, 0);

This is the child opening its stdin.  Doesn't look
correct to close it on the subsequent exec.

>  
>  #include <ctype.h>
>  #include <fcntl.h>
> @@ -147,6 +148,9 @@ trace_vdebug (const char *fmt, ...)
>  # define ust_loaded gdb_agent_ust_loaded
>  # define helper_thread_id gdb_agent_helper_thread_id
>  # define cmd_buf gdb_agent_cmd_buf
> +
> +/* We don't want to use this one in IPA.  */

"because ..." ?

> +# define gdb_socket_cloexec socket
>  #endif

-- 
Pedro Alves


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch gdbserver 7.6.1 only] Fix fd leak regression
  2013-08-29 17:47               ` Pedro Alves
@ 2013-08-29 18:27                 ` Tom Tromey
  0 siblings, 0 replies; 12+ messages in thread
From: Tom Tromey @ 2013-08-29 18:27 UTC (permalink / raw)
  To: Pedro Alves; +Cc: Jan Kratochvil, gdb-patches

Tom> second, the in process agent can't use gdb_socket_cloexec 

Pedro> But, why ?

filestuff.o isn't available there.  I guess it could be?
I will give it a whirl.

>> -	  open ("/dev/null", O_RDONLY);
>> +	  gdb_open_cloexec ("/dev/null", O_RDONLY, 0);

Pedro> This is the child opening its stdin.  Doesn't look
Pedro> correct to close it on the subsequent exec.

Hahaha, barf.

Tom


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2013-08-29 18:27 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-29 11:11 [patch gdbserver 7.6.1 only] Fix fd leak regression Jan Kratochvil
2013-08-29 12:15 ` Pedro Alves
2013-08-29 13:04   ` Jan Kratochvil
2013-08-29 14:17     ` Pedro Alves
2013-08-29 14:27       ` [commit 7.6.1 only] " Jan Kratochvil
2013-08-29 14:39         ` Pedro Alves
2013-08-29 14:40       ` Tom Tromey
2013-08-29 14:51         ` Pedro Alves
2013-08-29 15:00           ` Tom Tromey
2013-08-29 17:22             ` Tom Tromey
2013-08-29 17:47               ` Pedro Alves
2013-08-29 18:27                 ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox