diff --git a/coregrind/m_gdbserver/remote-utils.c b/coregrind/m_gdbserver/remote-utils.c index 7797ff439..36b891aad 100644 --- a/coregrind/m_gdbserver/remote-utils.c +++ b/coregrind/m_gdbserver/remote-utils.c @@ -279,10 +279,6 @@ void remote_open (char *name) fatal("error writing %d bytes to shared mem %s\n", (int) sizeof(VgdbShared), shared_mem); } - shared_mem_fd = VG_(safe_fd)(shared_mem_fd); - if (shared_mem_fd == -1) { - fatal("safe_fd for vgdb shared_mem %s failed\n", shared_mem); - } { SysRes res = VG_(am_shared_mmap_file_float_valgrind) (sizeof(VgdbShared), VKI_PROT_READ|VKI_PROT_WRITE, @@ -295,6 +291,7 @@ void remote_open (char *name) addr_shared = sr_Res (res); } shared = (VgdbShared*) addr_shared; + VG_(close) (shared_mem_fd); } /* we open the read side FIFO in non blocking mode diff --git a/gdbserver_tests/Makefile.am b/gdbserver_tests/Makefile.am index 6d9951905..5094f5a1b 100644 --- a/gdbserver_tests/Makefile.am +++ b/gdbserver_tests/Makefile.am @@ -72,10 +72,14 @@ EXTRA_DIST = \ nlcontrolc.stderr.exp \ nlcontrolc.stdinB.gdb \ nlcontrolc.stdoutB.exp \ - nlcontrolc.vgtest + nlcontrolc.vgtest \ + nlfork_chain.stderr.exp \ + nlfork_chain.stdout.exp \ + nlfork_chain.vgtest check_PROGRAMS = \ clean_after_fork \ + fork_chain \ sleepers \ t \ watchpoints diff --git a/gdbserver_tests/fork_chain.c b/gdbserver_tests/fork_chain.c new file mode 100644 index 000000000..ae40f6e88 --- /dev/null +++ b/gdbserver_tests/fork_chain.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include +void fork_chain(int level) +{ + int pid; + + printf ("forking level %d\n", level); + fflush (stdout); + pid = fork(); + if (pid == -1) { + perror("fork"); + exit(1); + } + + if (pid == 0) { + if (level > 0) { + fork_chain (level - 1); + } + } else { + int ret; + int status; + while((ret = waitpid(pid, &status, 0)) != pid) { + if (errno != EINTR) { + perror("waitpid"); + exit(1); + } + } + } +} +int main() +{ + fork_chain (20); + return 0; +} diff --git a/gdbserver_tests/nlfork_chain.stderr.exp b/gdbserver_tests/nlfork_chain.stderr.exp new file mode 100644 index 000000000..a0eeaba71 --- /dev/null +++ b/gdbserver_tests/nlfork_chain.stderr.exp @@ -0,0 +1,24 @@ +Nulgrind, the minimal Valgrind tool + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdbserver_tests/nlfork_chain.stdout.exp b/gdbserver_tests/nlfork_chain.stdout.exp new file mode 100644 index 000000000..a263b7e62 --- /dev/null +++ b/gdbserver_tests/nlfork_chain.stdout.exp @@ -0,0 +1,21 @@ +forking level 20 +forking level 19 +forking level 18 +forking level 17 +forking level 16 +forking level 15 +forking level 14 +forking level 13 +forking level 12 +forking level 11 +forking level 10 +forking level 9 +forking level 8 +forking level 7 +forking level 6 +forking level 5 +forking level 4 +forking level 3 +forking level 2 +forking level 1 +forking level 0 diff --git a/gdbserver_tests/nlfork_chain.vgtest b/gdbserver_tests/nlfork_chain.vgtest new file mode 100644 index 000000000..fda4bc376 --- /dev/null +++ b/gdbserver_tests/nlfork_chain.vgtest @@ -0,0 +1,4 @@ +# test that gdbserver properly cleans up its resources in a chain +# of forked processes. +prog: fork_chain +vgopts: --tool=none --vgdb=yes --trace-children=yes --vgdb-prefix=./vgdb-prefix-nlfork_chain