diff options
-rw-r--r-- | sys/kern/kern_exit.c | 1 | ||||
-rw-r--r-- | sys/kern/kern_prot.c | 2 | ||||
-rw-r--r-- | usr.bin/truss/main.c | 11 | ||||
-rw-r--r-- | usr.bin/truss/setup.c | 10 |
4 files changed, 20 insertions, 4 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 961738d..9c2005c 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -149,6 +149,7 @@ exit1(p, rv) vmsizmon(); #endif STOPEVENT(p, S_EXIT, rv); + wakeup(&p->p_stype); /* Wakeup anyone in procfs' PIOCWAIT */ /* * Check if any loadable modules need anything done at process exit. diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c index 306b36c..e2a4f44 100644 --- a/sys/kern/kern_prot.c +++ b/sys/kern/kern_prot.c @@ -932,6 +932,6 @@ setsugid(p) struct proc *p; { p->p_flag |= P_SUGID; - if (p->p_pfsflags & PF_ISUGID) + if (!(p->p_pfsflags & PF_ISUGID)) p->p_stops = 0; } diff --git a/usr.bin/truss/main.c b/usr.bin/truss/main.c index ab5c0ba..d09ee67 100644 --- a/usr.bin/truss/main.c +++ b/usr.bin/truss/main.c @@ -202,6 +202,9 @@ main(int ac, char **av) { Procfd = start_tracing(pid, S_EXEC | S_SCE | S_SCX | S_CORE | S_EXIT | (nosigs ? 0 : S_SIG)); + if (Procfd == -1) + return 0; + pfs.why = 0; funcs = set_etype(); @@ -251,8 +254,12 @@ main(int ac, char **av) { break; } } - if (ioctl(Procfd, PIOCCONT, val) == -1) - warn("PIOCCONT"); + if (ioctl(Procfd, PIOCCONT, val) == -1) { + if (kill(pid, 0) == -1 && errno == ESRCH) + break; + else + warn("PIOCCONT"); + } } while (pfs.why != S_EXIT); fflush(outfile); if (sigexit) { diff --git a/usr.bin/truss/setup.c b/usr.bin/truss/setup.c index afa0113..5af1fab 100644 --- a/usr.bin/truss/setup.c +++ b/usr.bin/truss/setup.c @@ -133,8 +133,16 @@ start_tracing(int pid, int flags) { sprintf(buf, "/proc/%d/mem", pid); fd = open(buf, O_RDWR); - if (fd == -1) + if (fd == -1) { + /* + * The process may have run away before we could start -- this + * happens with SUGID programs. So we need to see if it still + * exists before we complain bitterly. + */ + if (kill(pid, 0) == -1) + return -1; err(8, "cannot open %s", buf); + } if (ioctl(fd, PIOCSTATUS, &tmp) == -1) { err(10, "cannot get procfs status struct"); |