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 */