zx_job_set_policy
名称
job_set_policy —— 设置作业的安全和资源策略。
概要
#include <zircon/syscalls.h>
#include <zircon/syscalls/policy.h>
zx_status_t zx_job_set_policy(zx_handle_t job_handle, uint32_t options,
uint32_t topic, const void* policy, uint32_t count);
描述
为空作业设置一个或多个安全和/或资源策略。 该作业的有效策略是父作业的有效策略与policy中指定的策略的组合。 现有策略策与新策略之间发生冲突时产生的影响由options值所控制:
- ZX_JOB_POL_RELATIVE:未由父策略明确覆盖的条件所指定的策略被实施。
- ZX_JOB_POL_ABSOLUTE:要么policy中的所有条件被实施,要么此系统调用失败。 在此系统调用成功后,任何新的子进程或子作业都将应用这个新有效策略。
topic指定了policy的格式。它支持的值仅是ZX_JOB_POL_BASIC,表示policy是count个如下类型的项的数组:
typedef struct zx_policy_basic {
uint32_t condition;
uint32_t policy;
} zx_policy_basic_t;
其中condition是下列值之一:
- ZX_POL_BAD_HANDLE:此作业下的进程尝试发起带有无效句柄的系统调用。 在这种情况下,ZX_POL_ACTION_ALLOW和ZX_POL_ACTION_DENY是等效的:如果系统调用返回,它将始终返回ZX_ERR_BAD_HANDLE错误。
- ZX_POL_WRONG_OBJECT:此作业下的进程尝试使用不支持此类操作的句柄发起系统调用。
- ZX_POL_VMAR_WX:此作业下的进程尝试使用写入+执行的权限来进行地址区域的映射。
- ZX_POL_NEW_VMO:此作业下的进程尝试创建新的vm对象。
- ZX_POL_NEW_CHANNEL:此作业下的进程尝试创建新的channel对象。
- ZX_POL_NEW_EVENT:此作业下的进程尝试创建新的event对象。
- ZX_POL_NEW_EVENTPAIR:此作业下的进程程尝试创建新的eventpair对象。
- ZX_POL_NEW_PORT:此作业下的进程程尝试创建新的port对象。
- ZX_POL_NEW_SOCKET:此作业下的进程程尝试创建新的socket对象。
- ZX_POL_NEW_FIFO:此作业下的进程程尝试创建新的fifo对象。
- ZX_POL_NEW_TIMER:此作业下的进程程尝试创建新的timer对象。
- ZX_POL_NEW_PROCESS:此作业下的进程程尝试创建新的process对象。
- ZX_POL_NEW_ANY是一个特殊condition值,代表所有上述ZX_NEW条件值,例如ZX_POL_NEW_VMO,ZX_POL_NEW_CHANNEL,ZX_POL_NEW_EVENT,ZX_POL_NEW_EVENTPAIR,ZX_POL_NEW_PORT,ZX_POL_NEW_SOCKET,ZX_POL_NEW_FIFO,以及任何未来的新的ZX_NEW策略。 它也包括不需要父对象来创建的任何新内核对象。
其中policy是下列值之一:
- ZX_POL_ACTION_ALLOW:允许condition。
- ZX_POL_ACTION_DENY:阻止condition。 <!— Optionally it can be augmented via OR with
- ZX_POL_ACTION_EXCEPTION generate an exception via the debug port. An exception generated this way acts as a breakpoint. The thread may be resumed after the exception.
- ZX_POL_ACTION_KILL terminate the process. It also implies ZX_POL_ACTION_DENY. —> 作为选项,policy可以通过OR操作来增强:
- ZX_POL_ACTION_EXCEPTION:通过调试端口产生异常。 以这种方式生成的异常充当断点,并且异常发送后可以恢复该线程。
- ZX_POL_ACTION_KILL:终止进程,这也同时蕴含着ZX_POL_ACTION_DENY 。
权限
TODO(ZX-2399)
返回值
zx_job_set_policy() 调用成功返回ZX_OK。如果调用失败,则返回负的错误码。
注释
当使用ZX_INFO_HANDLE_VALID主题调用zx_object_get_info()
时,ZX_POL_BAD_HANDLE策略不会实施。
所有其他主题和所有其他系统调用都受到策略的限制。
错误码
ZX_ERR_INVALID_ARGS:下列情况之一,policy是无效指针;count是0;policy不是ZX_JOB_POL_RELATIVE或ZX_JOB_POL_ABSOLUTE;topic不是ZX_JOB_POL_BASIC。
ZX_ERR_BAD_HANDLE:job_handle是无效句柄。
ZX_ERR_WRONG_TYPE:job_handle不是作业类型句柄。
ZX_ERR_ACCESS_DENIED:job_handle没有ZX_POL_RIGHT_SET权限。
ZX_ERR_BAD_STATE:作业已有子作业或进程处于存活状态。
ZX_ERR_OUT_OF_RANGE:count大于ZX_POL_MAX或condition大于ZX_POL_MAX。
ZX_ERR_ALREADY_EXISTS:现有策略与新设置的策略冲突。
ZX_ERR_NOT_SUPPORTED:policy中的项具有无效值。
ZX_ERR_NO_MEMORY:由于内存不足导致的失败。而用户空间无法处理这个(不太可能发生的)错误。在将来的构建版本中,将不再出现此错误。