#include <security/mac_framework.h>
#endif
+int pshm_cache_purge_all(proc_t p);
+int psem_cache_purge_all(proc_t p);
+
int
-reboot(struct proc *p, register struct reboot_args *uap, __unused int32_t *retval)
+reboot(struct proc *p, struct reboot_args *uap, __unused int32_t *retval)
{
- char message[128];
+ char message[256];
int error=0;
size_t dummy=0;
#if CONFIG_MACF
message[0] = '\0';
- if ((error = suser(kauth_cred_get(), &p->p_acflag)))
- return(error);
-
+ if ((error = suser(kauth_cred_get(), &p->p_acflag))) {
+#if (DEVELOPMENT || DEBUG)
+ /* allow non-root user to call panic on dev/debug kernels */
+ if (!(uap->opt & RB_PANIC))
+ return error;
+#else
+ return error;
+#endif
+ }
+
if (uap->opt & RB_COMMAND)
return ENOSYS;
if (uap->opt & RB_PANIC) {
-#if !(DEVELOPMENT || DEBUG)
- if (p != initproc) {
- return EPERM;
- }
-#endif
error = copyinstr(uap->command, (void *)message, sizeof(message), (size_t *)&dummy);
}
#if CONFIG_MACF
+#if (DEVELOPMENT || DEBUG)
+ if (uap->opt & RB_PANIC) {
+ /* on dev/debug kernels: allow anyone to call panic */
+ goto skip_cred_check;
+ }
+#endif
if (error)
return (error);
my_cred = kauth_cred_proc_ref(p);
error = mac_system_check_reboot(my_cred, uap->opt);
kauth_cred_unref(&my_cred);
+#if (DEVELOPMENT || DEBUG)
+skip_cred_check:
+#endif
#endif
if (!error) {
OSBitOrAtomic(P_REBOOT, &p->p_flag); /* No more signals for this proc */
}
return(error);
}
+
+int
+usrctl(struct proc *p, __unused struct usrctl_args *uap, __unused int32_t *retval)
+{
+ if (p != initproc) {
+ return EPERM;
+ }
+
+ int error = 0;
+ error = pshm_cache_purge_all(p);
+ if (error)
+ return error;
+
+ error = psem_cache_purge_all(p);
+ return error;
+}