summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgibbs <gibbs@FreeBSD.org>2013-02-20 17:55:17 +0000
committergibbs <gibbs@FreeBSD.org>2013-02-20 17:55:17 +0000
commit6e71d34d7d0fa194ecffe60eaa87326f1849eaef (patch)
treead56ed6c3ad96020c3fe26d73d210689d51902dc
parent25887f42a7f1a07a4d9ecf17f7886847b5d7b97c (diff)
downloadFreeBSD-src-6e71d34d7d0fa194ecffe60eaa87326f1849eaef.zip
FreeBSD-src-6e71d34d7d0fa194ecffe60eaa87326f1849eaef.tar.gz
Avoid panic when tearing down the DTrace pid provider for a
process that has crashed. sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c: In fasttrap_pid_disable(), we cannot PHOLD the proc structure for a process that no longer exists, but we still have other, fasttrap specific, state that must be cleaned up for probes that existed in the dead process. Instead of returning early if the process related to our probes isn't found, conditionalize the locking and carry on with a NULL proc pointer. The rest of the fasttrap code already understands that a NULL proc is possible and does the right things in this case. Sponsored by: Spectra Logic Corporation Reviewed by: rpaulo, gnn MFC after: 1 week
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
index 4599a32..ad3b2d5 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
@@ -1124,14 +1124,12 @@ fasttrap_pid_disable(void *arg, dtrace_id_t id, void *parg)
* provider lock as a point of mutual exclusion to prevent other
* DTrace consumers from disabling this probe.
*/
- if ((p = pfind(probe->ftp_pid)) == NULL) {
- mutex_exit(&provider->ftp_mtx);
- return;
- }
+ if ((p = pfind(probe->ftp_pid)) != NULL) {
#ifdef __FreeBSD__
- _PHOLD(p);
- PROC_UNLOCK(p);
+ _PHOLD(p);
+ PROC_UNLOCK(p);
#endif
+ }
/*
* Disable all the associated tracepoints (for fully enabled probes).
@@ -1168,7 +1166,8 @@ fasttrap_pid_disable(void *arg, dtrace_id_t id, void *parg)
fasttrap_pid_cleanup();
#ifdef __FreeBSD__
- PRELE(p);
+ if (p != NULL)
+ PRELE(p);
#endif
if (!probe->ftp_enabled)
return;
OpenPOWER on IntegriCloud