Author: jhb
Date: Tue Dec 28 18:56:55 2010
New Revision: 216768
URL: http://svn.freebsd.org/changeset/base/216768

Log:
  MFC 203532: Fix gcore so that it can have the '-s' flag without hanging.

Modified:
  stable/8/usr.bin/gcore/gcore.c
Directory Properties:
  stable/8/usr.bin/gcore/   (props changed)

Modified: stable/8/usr.bin/gcore/gcore.c
==============================================================================
--- stable/8/usr.bin/gcore/gcore.c      Tue Dec 28 18:37:10 2010        
(r216767)
+++ stable/8/usr.bin/gcore/gcore.c      Tue Dec 28 18:56:55 2010        
(r216768)
@@ -65,7 +65,6 @@ __FBSDID("$FreeBSD$");
 
 #include <err.h>
 #include <fcntl.h>
-#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -75,7 +74,6 @@ __FBSDID("$FreeBSD$");
 int pflags;
 
 static void    killed(int);
-static void    restart_target(void);
 static void    usage(void) __dead2;
 
 static pid_t pid;
@@ -152,36 +150,28 @@ main(int argc, char *argv[])
        fd = open(corefile, O_RDWR|O_CREAT|O_TRUNC, DEFFILEMODE);
        if (fd < 0)
                err(1, "%s", corefile);
-       if ((pflags & PFLAGS_RESUME) != 0) {
-               signal(SIGHUP, killed);
-               signal(SIGINT, killed);
-               signal(SIGTERM, killed);
-               if (kill(pid, SIGSTOP) == -1)
-                       err(1, "%d: stop signal", pid);
-               atexit(restart_target);
-       }
+       /*
+        * The semantics of the 's' flag is to stop the target process.
+        * Previous versions of gcore would manage this by trapping SIGHUP,
+        * SIGINT and SIGTERM (to be passed to the target pid), and then
+        * signal the child to stop.
+        *
+        * However, this messes up if the selected dumper uses ptrace calls
+        * that leave the child already stopped. The waitpid call in elfcore
+        * never returns.
+        *
+        * The best thing to do here is to externalize the 's' flag and let
+        * each dumper dispose of what that means, if anything. For the elfcore
+        * dumper, the 's' flag is a no-op since the ptrace attach stops the
+        * process in question already.
+        */
+
        dumper->dump(efd, fd, pid);
        (void)close(fd);
        (void)close(efd);
        exit(0);
 }
 
-static void
-killed(int sig)
-{
-
-       restart_target();
-       signal(sig, SIG_DFL);
-       kill(getpid(), sig);
-}
-
-static void
-restart_target(void)
-{
-
-       kill(pid, SIGCONT);
-}
-
 void
 usage(void)
 {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to