#include "Pledge.h" #include "sys/Syscall.h" #include "thread/Scheduler.h" Result sys_pledge(Registers*, SyscallArgs args) { int promises = TRY(parse_promises(args[0])); int execpromises = TRY(parse_promises(args[1])); auto* current = Scheduler::current(); if (promises >= 0) { int actual_promises = promises & ~(1 << (int)Promise::p_error); int old_promises = current->promises & ~(1 << (int)Promise::p_error); if (actual_promises & ~old_promises) { if (current->promises & ~(1 << (int)Promise::p_error)) return 0; return err(EPERM); } } if (execpromises >= 0) { int actual_execpromises = execpromises & ~(1 << (int)Promise::p_error); int old_execpromises = current->execpromises & ~(1 << (int)Promise::p_error); if (actual_execpromises & ~old_execpromises) { if (current->execpromises & ~(1 << (int)Promise::p_error)) return 0; return err(EPERM); } } if (promises >= 0) current->promises = promises; if (execpromises >= 0) current->execpromises = execpromises; return 0; }