Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_sysctl.c
Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | |||||
#include <sys/jail.h> | #include <sys/jail.h> | ||||
#include <sys/lock.h> | #include <sys/lock.h> | ||||
#include <sys/mutex.h> | #include <sys/mutex.h> | ||||
#include <sys/rmlock.h> | #include <sys/rmlock.h> | ||||
#include <sys/sbuf.h> | #include <sys/sbuf.h> | ||||
#include <sys/sx.h> | #include <sys/sx.h> | ||||
#include <sys/sysproto.h> | #include <sys/sysproto.h> | ||||
#include <sys/uio.h> | #include <sys/uio.h> | ||||
#include <sys/vps.h> | |||||
#ifdef KTRACE | #ifdef KTRACE | ||||
#include <sys/ktrace.h> | #include <sys/ktrace.h> | ||||
#endif | #endif | ||||
#include <net/vnet.h> | #include <net/vnet.h> | ||||
#include <security/mac/mac_framework.h> | #include <security/mac/mac_framework.h> | ||||
▲ Show 20 Lines • Show All 422 Lines • ▼ Show 20 Lines | retry: | ||||
if (q != NULL) | if (q != NULL) | ||||
SLIST_INSERT_AFTER(q, oidp, oid_link); | SLIST_INSERT_AFTER(q, oidp, oid_link); | ||||
else | else | ||||
SLIST_INSERT_HEAD(parent, oidp, oid_link); | SLIST_INSERT_HEAD(parent, oidp, oid_link); | ||||
if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE && | if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE && | ||||
#ifdef VIMAGE | #ifdef VIMAGE | ||||
(oidp->oid_kind & CTLFLAG_VNET) == 0 && | (oidp->oid_kind & CTLFLAG_VNET) == 0 && | ||||
(oidp->oid_kind & CTLFLAG_VPS) == 0 && | |||||
#endif | #endif | ||||
(oidp->oid_kind & CTLFLAG_TUN) != 0 && | (oidp->oid_kind & CTLFLAG_TUN) != 0 && | ||||
(oidp->oid_kind & CTLFLAG_NOFETCH) == 0) { | (oidp->oid_kind & CTLFLAG_NOFETCH) == 0) { | ||||
/* only fetch value once */ | /* only fetch value once */ | ||||
oidp->oid_kind |= CTLFLAG_NOFETCH; | oidp->oid_kind |= CTLFLAG_NOFETCH; | ||||
/* try to fetch value from kernel environment */ | /* try to fetch value from kernel environment */ | ||||
sysctl_load_tunable_by_oid_locked(oidp); | sysctl_load_tunable_by_oid_locked(oidp); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,484 Lines • ▼ Show 20 Lines | if (req->newptr && !(oid->oid_kind & CTLFLAG_ANYBODY)) { | ||||
int priv; | int priv; | ||||
if (oid->oid_kind & CTLFLAG_PRISON) | if (oid->oid_kind & CTLFLAG_PRISON) | ||||
priv = PRIV_SYSCTL_WRITEJAIL; | priv = PRIV_SYSCTL_WRITEJAIL; | ||||
#ifdef VIMAGE | #ifdef VIMAGE | ||||
else if ((oid->oid_kind & CTLFLAG_VNET) && | else if ((oid->oid_kind & CTLFLAG_VNET) && | ||||
prison_owns_vnet(req->td->td_ucred)) | prison_owns_vnet(req->td->td_ucred)) | ||||
priv = PRIV_SYSCTL_WRITEJAIL; | priv = PRIV_SYSCTL_WRITEJAIL; | ||||
else if ((oid->oid_kind & CTLFLAG_VPS) && | |||||
prison_owns_vps(req->td->td_ucred)) | |||||
priv = PRIV_SYSCTL_WRITEJAIL; | |||||
#endif | #endif | ||||
else | else | ||||
priv = PRIV_SYSCTL_WRITE; | priv = PRIV_SYSCTL_WRITE; | ||||
error = priv_check(req->td, priv); | error = priv_check(req->td, priv); | ||||
if (error) | if (error) | ||||
goto out; | goto out; | ||||
} | } | ||||
Show All 11 Lines | #endif | ||||
} | } | ||||
#ifdef MAC | #ifdef MAC | ||||
error = mac_system_check_sysctl(req->td->td_ucred, oid, arg1, arg2, | error = mac_system_check_sysctl(req->td->td_ucred, oid, arg1, arg2, | ||||
req); | req); | ||||
if (error != 0) | if (error != 0) | ||||
goto out; | goto out; | ||||
#endif | #endif | ||||
#ifdef VIMAGE | #ifdef VIMAGE | ||||
KASSERT(((oid->oid_kind & (CTLFLAG_VNET|CTLFLAG_VPS)) != | |||||
(CTLFLAG_VNET|CTLFLAG_VPS)), | |||||
("CTLFLAG VNET and VPS set oid %p", oid)); | |||||
if ((oid->oid_kind & CTLFLAG_VNET) && arg1 != NULL) | if ((oid->oid_kind & CTLFLAG_VNET) && arg1 != NULL) | ||||
arg1 = (void *)(curvnet->vnet_data_base + (uintptr_t)arg1); | arg1 = (void *)(curvnet->vnet_data_base + (uintptr_t)arg1); | ||||
if ((oid->oid_kind & CTLFLAG_VPS) && arg1 != NULL) | |||||
arg1 = (void *)(curvps->vps_data_base + (uintptr_t)arg1); | |||||
#endif | #endif | ||||
error = sysctl_root_handler_locked(oid, arg1, arg2, req, &tracker); | error = sysctl_root_handler_locked(oid, arg1, arg2, req, &tracker); | ||||
out: | out: | ||||
SYSCTL_RUNLOCK(&tracker); | SYSCTL_RUNLOCK(&tracker); | ||||
return (error); | return (error); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 75 Lines • ▼ Show 20 Lines | #ifdef KTRACE | ||||
if (KTRPOINT(curthread, KTR_SYSCTL)) | if (KTRPOINT(curthread, KTR_SYSCTL)) | ||||
ktrsysctl(name, namelen); | ktrsysctl(name, namelen); | ||||
#endif | #endif | ||||
memlocked = 0; | memlocked = 0; | ||||
if (req.oldptr && req.oldlen > 4 * PAGE_SIZE) { | if (req.oldptr && req.oldlen > 4 * PAGE_SIZE) { | ||||
memlocked = 1; | memlocked = 1; | ||||
sx_xlock(&sysctlmemlock); | sx_xlock(&sysctlmemlock); | ||||
} | } | ||||
CURVPS_SET(TD_TO_VPS(td)); | |||||
CURVNET_SET(TD_TO_VNET(td)); | CURVNET_SET(TD_TO_VNET(td)); | ||||
for (;;) { | for (;;) { | ||||
req.oldidx = 0; | req.oldidx = 0; | ||||
req.newidx = 0; | req.newidx = 0; | ||||
error = sysctl_root(0, name, namelen, &req); | error = sysctl_root(0, name, namelen, &req); | ||||
if (error != EAGAIN) | if (error != EAGAIN) | ||||
break; | break; | ||||
kern_yield(PRI_USER); | kern_yield(PRI_USER); | ||||
} | } | ||||
CURVNET_RESTORE(); | CURVNET_RESTORE(); | ||||
CURVPS_RESTORE(); | |||||
if (req.lock == REQ_WIRED && req.validlen > 0) | if (req.lock == REQ_WIRED && req.validlen > 0) | ||||
vsunlock(req.oldptr, req.validlen); | vsunlock(req.oldptr, req.validlen); | ||||
if (memlocked) | if (memlocked) | ||||
sx_xunlock(&sysctlmemlock); | sx_xunlock(&sysctlmemlock); | ||||
if (error && error != ENOMEM) | if (error && error != ENOMEM) | ||||
return (error); | return (error); | ||||
Show All 37 Lines |