diff options
Diffstat (limited to 'usr/src/uts/common/dtrace/dtrace.c')
| -rw-r--r-- | usr/src/uts/common/dtrace/dtrace.c | 23 | 
1 files changed, 19 insertions, 4 deletions
| diff --git a/usr/src/uts/common/dtrace/dtrace.c b/usr/src/uts/common/dtrace/dtrace.c index 50ad857549..23fb7cece3 100644 --- a/usr/src/uts/common/dtrace/dtrace.c +++ b/usr/src/uts/common/dtrace/dtrace.c @@ -7780,7 +7780,7 @@ dtrace_cred2priv(cred_t *cr, uint32_t *privp, uid_t *uidp, zoneid_t *zoneidp)  		priv = DTRACE_PRIV_ALL;  	} else {  		*uidp = crgetuid(cr); -		*zoneidp = crgetzoneid(cr); +		*zoneidp = crgetzonedid(cr);  		priv = 0;  		if (PRIV_POLICY_ONLY(cr, PRIV_DTRACE_KERNEL, B_FALSE)) @@ -8276,7 +8276,7 @@ dtrace_register(const char *name, const dtrace_pattr_t *pap, uint32_t priv,  	provider->dtpv_priv.dtpp_flags = priv;  	if (cr != NULL) {  		provider->dtpv_priv.dtpp_uid = crgetuid(cr); -		provider->dtpv_priv.dtpp_zoneid = crgetzoneid(cr); +		provider->dtpv_priv.dtpp_zoneid = crgetzonedid(cr);  	}  	provider->dtpv_pops = *pops; @@ -8887,6 +8887,7 @@ dtrace_probe_enable(const dtrace_probedesc_t *desc, dtrace_enabling_t *enab)  	uint32_t priv;  	uid_t uid;  	zoneid_t zoneid; +	dtrace_state_t *state = enab->dten_vstate->dtvs_state;  	ASSERT(MUTEX_HELD(&dtrace_lock));  	dtrace_ecb_create_cache = NULL; @@ -8901,8 +8902,22 @@ dtrace_probe_enable(const dtrace_probedesc_t *desc, dtrace_enabling_t *enab)  	}  	dtrace_probekey(desc, &pkey); -	dtrace_cred2priv(enab->dten_vstate->dtvs_state->dts_cred.dcr_cred, -	    &priv, &uid, &zoneid); +	dtrace_cred2priv(state->dts_cred.dcr_cred, &priv, &uid, &zoneid); + +	if ((priv & DTRACE_PRIV_ZONEOWNER) && +	    state->dts_options[DTRACEOPT_ZONE] != DTRACEOPT_UNSET) { +		/* +		 * If we have the privilege of instrumenting all zones but we +		 * have been told to instrument but one, we will spoof this up +		 * depriving ourselves of DTRACE_PRIV_ZONEOWNER for purposes +		 * of dtrace_match().  (Note that DTRACEOPT_ZONE is not for +		 * security but rather for performance: it allows the global +		 * zone to instrument USDT probes in a local zone without +		 * requiring all zones to be instrumented.) +		 */ +		priv &= ~DTRACE_PRIV_ZONEOWNER; +		zoneid = state->dts_options[DTRACEOPT_ZONE]; +	}  	return (dtrace_match(&pkey, priv, uid, zoneid, dtrace_ecb_create_enable,  	    enab)); | 
