This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFC: close-on-exec internal file descriptors


> Sorry Joel.
> I did not even consider this possibility.

No worries at all!

> Could you try the appended?  I can't even build parts of it, so...
> 
> I think it is pretty ugly, since it is a layer on top of the
> kernel-level cloexec flags.  However, that is another discussion, from
> the earlier reviews.

Yeah, hard to see an alternative based on the decisions made.
Seems OK to me.

I tested the patches, and they look good to me, except for the fact
that we were missing the #include of filestuff.h. Attached is patch
that builds and tests fine on x86_64-darwin and ia64-hpux...

-- 
Joel
>From 7118b53028599be9b5d2957bd1676c48ca87970b Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
Date: Tue, 7 May 2013 02:33:02 -0400
Subject: [PATCH] Do not close pipes used to communicate with child during inferior fork

---
 gdb/common/filestuff.c |   27 +++++++++++++++++++++++++++
 gdb/common/filestuff.h |   10 ++++++++++
 gdb/darwin-nat.c       |    7 +++++++
 gdb/inf-ttrace.c       |   11 +++++++++++
 4 files changed, 55 insertions(+), 0 deletions(-)

diff --git a/gdb/common/filestuff.c b/gdb/common/filestuff.c
index 68f66ca..e7af3a5 100644
--- a/gdb/common/filestuff.c
+++ b/gdb/common/filestuff.c
@@ -177,6 +177,33 @@ notice_open_fds (void)
   fdwalk (do_mark_open_fd, NULL);
 }
 
+/* See filestuff.h.  */
+
+void
+mark_fd_no_cloexec (int fd)
+{
+  do_mark_open_fd (NULL, fd);
+}
+
+/* See filestuff.h.  */
+
+void
+unmark_fd_no_cloexec (int fd)
+{
+  int i, val;
+
+  for (i = 0; VEC_iterate (int, open_fds, i, val); ++i)
+    {
+      if (fd == val)
+	{
+	  VEC_unordered_remove (int, open_fds, i);
+	  return;
+	}
+    }
+
+  gdb_assert_not_reached (_("fd not found in open_fds"));
+}
+
 /* Helper function for close_most_fds that closes the file descriptor
    if appropriate.  */
 
diff --git a/gdb/common/filestuff.h b/gdb/common/filestuff.h
index 0db33f0..b162a0c 100644
--- a/gdb/common/filestuff.h
+++ b/gdb/common/filestuff.h
@@ -24,6 +24,16 @@
 
 extern void notice_open_fds (void);
 
+/* Mark a file descriptor as inheritable across an exec.  */
+
+extern void mark_fd_no_cloexec (int fd);
+
+/* Mark a file descriptor as no longer being inheritable across an
+   exec.  This is only meaningful when FD was previously passed to
+   mark_fd_no_cloexec.  */
+
+extern void unmark_fd_no_cloexec (int fd);
+
 /* Close all open file descriptors other than those marked by
    'notice_open_fds', and stdin, stdout, and stderr.  Errors that
    occur while closing are ignored.  */
diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c
index acdbf36..a2da924 100644
--- a/gdb/darwin-nat.c
+++ b/gdb/darwin-nat.c
@@ -66,6 +66,7 @@
 #include <mach/port.h>
 
 #include "darwin-nat.h"
+#include "common/filestuff.h"
 
 /* Quick overview.
    Darwin kernel is Mach + BSD derived kernel.  Note that they share the
@@ -1516,6 +1517,9 @@ darwin_pre_ptrace (void)
       ptrace_fds[1] = -1;
       error (_("unable to create a pipe: %s"), safe_strerror (errno));
     }
+
+  mark_fd_no_cloexec (ptrace_fds[0]);
+  mark_fd_no_cloexec (ptrace_fds[1]);
 }
 
 static void
@@ -1533,6 +1537,9 @@ darwin_ptrace_him (int pid)
   close (ptrace_fds[0]);
   close (ptrace_fds[1]);
 
+  unmark_fd_no_cloexec (ptrace_fds[0]);
+  unmark_fd_no_cloexec (ptrace_fds[1]);
+
   darwin_init_thread_list (inf);
 
   startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
diff --git a/gdb/inf-ttrace.c b/gdb/inf-ttrace.c
index 96b473d..2ecf482 100644
--- a/gdb/inf-ttrace.c
+++ b/gdb/inf-ttrace.c
@@ -38,6 +38,7 @@
 
 #include "inf-child.h"
 #include "inf-ttrace.h"
+#include "common/filestuff.h"
 
 
 
@@ -558,6 +559,11 @@ do_cleanup_pfds (void *dummy)
   close (inf_ttrace_pfd1[1]);
   close (inf_ttrace_pfd2[0]);
   close (inf_ttrace_pfd2[1]);
+
+  unmark_fd_no_cloexec (inf_ttrace_pfd1[0]);
+  unmark_fd_no_cloexec (inf_ttrace_pfd1[1]);
+  unmark_fd_no_cloexec (inf_ttrace_pfd2[0]);
+  unmark_fd_no_cloexec (inf_ttrace_pfd2[1]);
 }
 
 static void
@@ -572,6 +578,11 @@ inf_ttrace_prepare (void)
       close (inf_ttrace_pfd2[0]);
       perror_with_name (("pipe"));
     }
+
+  mark_fd_no_cloexec (inf_ttrace_pfd1[0]);
+  mark_fd_no_cloexec (inf_ttrace_pfd1[1]);
+  mark_fd_no_cloexec (inf_ttrace_pfd2[0]);
+  mark_fd_no_cloexec (inf_ttrace_pfd2[1]);
 }
 
 /* Prepare to be traced.  */
-- 
1.7.0.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]