From: Joel Brobecker <brobecker@adacore.com>
To: Tom Tromey <tromey@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: RFC: close-on-exec internal file descriptors
Date: Tue, 07 May 2013 06:46:00 -0000 [thread overview]
Message-ID: <20130507064559.GI5278@adacore.com> (raw)
In-Reply-To: <874negym65.fsf@fleche.redhat.com>
[-- Attachment #1: Type: text/plain, Size: 597 bytes --]
> 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
[-- Attachment #2: 0001-Do-not-close-pipes-used-to-communicate-with-child-du.patch --]
[-- Type: text/x-diff, Size: 3700 bytes --]
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"
\f
@@ -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
next prev parent reply other threads:[~2013-05-07 6:46 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-18 17:45 Tom Tromey
2012-12-18 22:12 ` Andreas Schwab
2012-12-19 14:53 ` Tom Tromey
2013-01-03 16:17 ` Tom Tromey
2013-04-22 23:55 ` Tom Tromey
2013-04-23 1:51 ` Tom Tromey
2013-05-01 14:47 ` Joel Brobecker
2013-05-06 18:53 ` Tom Tromey
2013-05-07 6:46 ` Joel Brobecker [this message]
2013-05-10 17:00 ` Tom Tromey
2013-04-23 15:45 ` Yao Qi
2013-04-24 2:45 ` Tom Tromey
2013-04-24 20:35 ` Jan Kratochvil
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130507064559.GI5278@adacore.com \
--to=brobecker@adacore.com \
--cc=gdb-patches@sourceware.org \
--cc=tromey@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox