summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_exit.c1
-rw-r--r--sys/kern/kern_prot.c2
-rw-r--r--usr.bin/truss/main.c11
-rw-r--r--usr.bin/truss/setup.c10
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");
OpenPOWER on IntegriCloud