From: Tom Tromey Date: Fri, 10 May 2013 17:01:00 +0000 (+0000) Subject: 2013-05-10 Joel Brobecker X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=21ff46861c35d99dbbafc42d0854128270ef8f30;p=binutils-gdb.git 2013-05-10 Joel Brobecker Tom Tromey * common/filestuff.c (mark_fd_no_cloexec, unmark_fd_no_cloexec): New functions. * common/filestuff.c (mark_fd_no_cloexec, unmark_fd_no_cloexec): Declare. * darwin-nat.c (darwin_pre_ptrace): Use mark_fd_no_cloexec. (darwin_ptrace_him): Use unmark_fd_no_cloexec. * inf-ttrace.c (do_cleanup_pfds): Use unmark_fd_no_cloexec. (inf_ttrace_prepare): Use mark_fd_no_cloexec. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d43e2bf2318..84159e1dc2d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2013-05-10 Joel Brobecker + Tom Tromey + + * common/filestuff.c (mark_fd_no_cloexec, unmark_fd_no_cloexec): + New functions. + * common/filestuff.c (mark_fd_no_cloexec, unmark_fd_no_cloexec): + Declare. + * darwin-nat.c (darwin_pre_ptrace): Use mark_fd_no_cloexec. + (darwin_ptrace_him): Use unmark_fd_no_cloexec. + * inf-ttrace.c (do_cleanup_pfds): Use unmark_fd_no_cloexec. + (inf_ttrace_prepare): Use mark_fd_no_cloexec. + 2013-05-10 Freddie Chopin Tom Tromey diff --git a/gdb/common/filestuff.c b/gdb/common/filestuff.c index 68f66ca6d0f..e7af3a5cf4a 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 0db33f0d702..b162a0c6e77 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 acdbf365406..a2da9242ee8 100644 --- a/gdb/darwin-nat.c +++ b/gdb/darwin-nat.c @@ -66,6 +66,7 @@ #include #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 642e520faf4..511a67cbcbc 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. */