|
@@ -46,16 +46,21 @@ ErrorOr<FlatPtr> Process::sys$pledge(Userspace<const Syscall::SC_pledge_params*>
|
|
|
if (promises) {
|
|
|
if (!parse_pledge(promises->view(), new_promises))
|
|
|
return EINVAL;
|
|
|
- if (m_protected_values.has_promises && (new_promises & ~m_protected_values.promises))
|
|
|
- return EPERM;
|
|
|
+
|
|
|
+ if (!(m_protected_values.promises & (1u << (u32)Pledge::no_error))) {
|
|
|
+ if (m_protected_values.has_promises && (new_promises & ~m_protected_values.promises))
|
|
|
+ return EPERM;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
u32 new_execpromises = 0;
|
|
|
if (execpromises) {
|
|
|
if (!parse_pledge(execpromises->view(), new_execpromises))
|
|
|
return EINVAL;
|
|
|
- if (m_protected_values.has_execpromises && (new_execpromises & ~m_protected_values.execpromises))
|
|
|
- return EPERM;
|
|
|
+ if (!(m_protected_values.promises & (1u << (u32)Pledge::no_error))) {
|
|
|
+ if (m_protected_values.has_execpromises && (new_execpromises & ~m_protected_values.execpromises))
|
|
|
+ return EPERM;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Only apply promises after all validation has occurred, this ensures
|