struct kmem_cache *dtrace_state_cachep;
struct kmem_cache *dtrace_pdata_cachep;
+struct user_namespace *init_user_namespace;
+
static dtrace_pattr_t dtrace_provider_attr = {
{ DTRACE_STABILITY_STABLE, DTRACE_STABILITY_STABLE, DTRACE_CLASS_COMMON },
{ DTRACE_STABILITY_PRIVATE, DTRACE_STABILITY_PRIVATE, DTRACE_CLASS_UNKNOWN },
{
dtrace_provider_id_t id;
int rc = 0;
+ struct cred *cred;
/*
* Register the device for the DTrace core.
offsetof(dtrace_probe_t, dtpr_nextname),
offsetof(dtrace_probe_t, dtpr_prevname));
+ /*
+ * FIXME, this is a very nonstandard pattern for OOM-checking but
+ * unavoidable given the absence of OOM-checking elsewhere in this
+ * function.
+ */
+ cred = prepare_kernel_cred(NULL);
+ if (cred) {
+ init_user_namespace = cred->user_ns;
+ put_cred(cred);
+ }
+
/*
* Ensure that the X configuration parameter has a legal value.
*/
return 0;
if (((ppriv & ~match) & DTRACE_PRIV_OWNER) != 0 &&
- !uid_eq(uid, make_kuid(NULL, prp->dtpr_provider->dtpv_priv.dtpp_uid)))
+ !uid_eq(uid, make_kuid(init_user_namespace,
+ prp->dtpr_provider->dtpv_priv.dtpp_uid)))
return 0;
}
pkey.dtpk_id = DTRACE_IDNONE;
mutex_lock(&dtrace_lock);
- match = dtrace_match(&pkey, DTRACE_PRIV_ALL, make_kuid(NULL, 0),
+ match = dtrace_match(&pkey, DTRACE_PRIV_ALL,
+ make_kuid(init_user_namespace, 0),
dtrace_probe_lookup_match, &id);
mutex_unlock(&dtrace_lock);
if (cr != NULL) {
provider->dtpv_priv.dtpp_uid =
- from_kuid(NULL, get_cred(cr)->uid);
+ from_kuid(init_user_namespace, get_cred(cr)->uid);
put_cred(cr);
}
extern dtrace_dynvar_t dtrace_dynhash_sink;
+extern struct user_namespace *init_user_namespace;
+
extern int dtrace_dstate_init(dtrace_dstate_t *, size_t);
extern void dtrace_dstate_fini(dtrace_dstate_t *);
extern void dtrace_vstate_fini(dtrace_vstate_t *);