From a2d1f1c1376dc3d33b160020ad97cac4471476ea Mon Sep 17 00:00:00 2001 From: Kris Van Hees Date: Mon, 30 Sep 2013 09:19:20 -0400 Subject: [PATCH] dtrace: Ensure that provider names are unique in the context of a PID Orabug: 17476663 Signed-off-by: Kris Van Hees --- dtrace/dtrace_dof.c | 13 ++++++++++++- dtrace/fasttrap_dev.c | 11 +++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/dtrace/dtrace_dof.c b/dtrace/dtrace_dof.c index 08a2e43639a02..ea9cfd1cebb0d 100644 --- a/dtrace/dtrace_dof.c +++ b/dtrace/dtrace_dof.c @@ -1729,8 +1729,19 @@ static void dtrace_helper_provide_one(dof_helper_t *dhp, dof_sec_t *sec, dt_dbg_dof(" Creating provider %s for PID %d\n", strtab + prov->dofpv_name, pid); - if ((parg = mops->dtms_provide_pid(meta->dtm_arg, &dhpv, pid)) == NULL) + /* + * This used to just 'return;' when parg is NULL, but that causes the + * cleanup code (dtrace_helper_provider_remove[_one]) to make a call + * to dtms_remove_pid() for a provider that never got created. + * + * If we fail to provide this provider, mark it as something to ignore, + * so we don't try to process it during cleanup. + */ + parg = mops->dtms_provide_pid(meta->dtm_arg, &dhpv, pid); + if (parg == NULL) { + sec->dofs_type = DOF_SECT_NONE; return; + } meta->dtm_count++; diff --git a/dtrace/fasttrap_dev.c b/dtrace/fasttrap_dev.c index bbcded659bd46..8325f08ed6911 100644 --- a/dtrace/fasttrap_dev.c +++ b/dtrace/fasttrap_dev.c @@ -37,6 +37,8 @@ #include "dtrace_dev.h" #include "fasttrap_impl.h" +#define FIX_FORCE_UNIQUE_PROVNAME_PER_PID + #define FASTTRAP_MAX_DEFAULT 250000 static uint32_t fasttrap_max; static uint64_t fasttrap_pid_count; @@ -1169,9 +1171,18 @@ static fasttrap_provider_t *fasttrap_provider_lookup(pid_t pid, for (fp = bucket->ftb_data; fp != NULL; fp = fp->ftp_next) { if (fp->ftp_pid == pid && strcmp(fp->ftp_name, name) == 0 && !fp->ftp_retired) { +#ifdef FIX_FORCE_UNIQUE_PROVNAME_PER_PID + /* + * We disallow multiple providers with the same name + * for a given PID. + */ + mutex_unlock(&bucket->ftb_mtx); + return NULL; +#else mutex_lock(&fp->ftp_mtx); mutex_unlock(&bucket->ftb_mtx); return fp; +#endif } } -- 2.50.1