条件语句
在SELinux中允许根据不同的条件来启用不同的规则,这样的语句称为条件语句,在策略库中使用cond_node结构来表示,所有的条件语句组成一个链表,用cond_av_list结构表示。对于这两个结构体,它们定义在security/selinux/ss/conditional.h中,具体定义如下所示:
struct {
int ;
struct *;
struct *;
struct *;
struct *;
};
如上所示,对于cond_node结构,各字段的含义如表所示:
| 类型 | 字段 | 含义 |
| int | cur_state | 条件表达式的当前状态 |
| struct cond_expr * | expr | 条件语句所使用的条件表达式 |
| struct cond_av_list * | true_list | 对应if语句中的策略规则 |
| struct cond_av_list * | false_list | 对应else语句中的策略规则 |
| struct cond_node | next | 指向下一个节点 |
至于条件表达式,在SELinux中使用cond_expr结构表示,其定义在security/selinux/ss/conditional.h中,具体定义如下所示:
struct {
#define 1 /* plain bool */
#define 2 /* !bool */
#define 3 /* bool || bool */
#define 4 /* bool && bool */
#define 5 /* bool ^ bool */
#define 6 /* bool == bool */
#define 7 /* bool != bool */
#define
;
;
struct *;
};
如上所示,各个宏定义了相应的逻辑操作符。事实上,一个条件表达式就是一个逆波兰表达式形式的操作符和操作数的列表,其相关数据结构之间关系如图所示:

对于条件语句,其相关操作如表所示,这些函数均定义在security/selinux/ss/conditional.c中。
| 函数名称 | 函数功能 |
| cond_evaluate_expr() | 计算逆波兰表达式形式的条件表达式的值 |
| evaluate_cond_node() | 根据布尔变量的当前值计算条件语句中条件表达式的值,如果条件表达式的状态发生改变,则根据当前状态值来启用或禁止相应的规则 |
| cond_policydb_init() | 初始化策略库中的条件访问向量 |
| cond_av_list_destroy() | 释放条件访问向量列表 |
| cond_node_destroy() | 释放指定的条件语句 |
| cond_list_destroy() | 释放条件访问向量列表中的条件语句 |
| cond_policydb_destroy() | 释放策略库中条件语句相关内容 |
| cond_index_bool() | 根据指定的数据设置策略库中相应的布尔值 |
| bool_isvalid() | 判断一个布尔值是否有效 |
| cond_read_bool() | 从二进制策略文件中读取一个布尔值,并将其插入到指定的哈希表中。成功时返回0 |
| cond_insertf() | 向策略库的条件访问向量表中插入指定的规则,成功时返回0 |
| cond_read_av_list() | 从二进制策略文件中读取指定数量的访问向量,并将其放入访问向量列表中 |
| expr_isvaild() | 判断一个条件表达式是否有效 |
| cond_read_node() | 根据二进制策略文件初始化一个条件语句 |
| cond_read_list() | 从二进制策略文件中读取指定数量的条件语句并将其以链表的形式放入策略数据库中 |
| cond_write_bool() | 将一个布尔值写入策略文件中 |
| cond_write_av_list() | 将一个条件访问向量链表写入到策略文件中 |
| cond_write_node() | 将条件语句的相关内容写入到策略文件中,写入的顺序与条件策略结构体元素定义的顺序基本相同 |
| cond_write_list() | 将条件语句列表写入到策略文件中,在写入各个条件语句之前,先将条件语句的数量写入到策略文件中 |
| cond_compute_av() | 根据条件访问向量确定是否授予额外的权限,若是,则将相应的权限添加到访问向量决策中。 |