static void terule_basic_syn(void) { apol_terule_query_t *tq = apol_terule_query_create(); CU_ASSERT_PTR_NOT_NULL_FATAL(tq); int retval; retval = apol_terule_query_set_rules(sp, tq, QPOL_RULE_TYPE_TRANS | QPOL_RULE_TYPE_CHANGE | QPOL_RULE_TYPE_MEMBER); CU_ASSERT_EQUAL_FATAL(retval, 0); apol_vector_t *v = NULL; retval = apol_syn_terule_get_by_query(sp, tq, &v); CU_ASSERT_EQUAL_FATAL(retval, 0); CU_ASSERT_PTR_NOT_NULL(v); size_t num_trans = 0, num_changes = 0, num_members = 0; qpol_policy_t *q = apol_policy_get_qpol(sp); size_t i; for (i = 0; i < apol_vector_get_size(v); i++) { const qpol_syn_terule_t *syn = (const qpol_syn_terule_t *)apol_vector_get_element(v, i); uint32_t rule_type; retval = qpol_syn_terule_get_rule_type(q, syn, &rule_type); CU_ASSERT_EQUAL_FATAL(retval, 0); CU_ASSERT(rule_type == QPOL_RULE_TYPE_TRANS || rule_type == QPOL_RULE_TYPE_CHANGE || rule_type == QPOL_RULE_TYPE_MEMBER); if (rule_type == QPOL_RULE_TYPE_TRANS) { num_trans++; } else if (rule_type == QPOL_RULE_TYPE_CHANGE) { num_changes++; } else if (rule_type == QPOL_RULE_TYPE_MEMBER) { num_members++; } } CU_ASSERT(num_trans == 6 && num_changes == 3 && num_members == 4); apol_vector_destroy(&v); retval = apol_terule_query_append_class(sp, tq, "cursor"); CU_ASSERT_EQUAL_FATAL(retval, 0); retval = apol_syn_terule_get_by_query(sp, tq, &v); CU_ASSERT_EQUAL_FATAL(retval, 0); CU_ASSERT(v != NULL && apol_vector_get_size(v) == 0); apol_vector_destroy(&v); apol_terule_query_destroy(&tq); }
static int perform_te_query(const apol_policy_t * policy, const options_t * opt, apol_vector_t ** v) { apol_terule_query_t *teq = NULL; unsigned int rules = 0; int error = 0; size_t i; if (!policy || !opt || !v) { PyErr_SetString(PyExc_RuntimeError,strerror(EINVAL)); errno = EINVAL; return -1; } if (opt->all || opt->type) { rules = (QPOL_RULE_TYPE_TRANS | QPOL_RULE_TYPE_CHANGE | QPOL_RULE_TYPE_MEMBER); } else { *v = NULL; return 0; /* no search to do */ } teq = apol_terule_query_create(); if (!teq) { PyErr_SetString(PyExc_RuntimeError,strerror(ENOMEM)); errno = ENOMEM; return -1; } apol_terule_query_set_rules(policy, teq, rules); apol_terule_query_set_regex(policy, teq, opt->useregex); if (opt->src_name) apol_terule_query_set_source(policy, teq, opt->src_name, opt->indirect); if (opt->tgt_name) apol_terule_query_set_target(policy, teq, opt->tgt_name, opt->indirect); if (opt->bool_name) apol_terule_query_set_bool(policy, teq, opt->bool_name); if (opt->class_name) { if (opt->class_vector == NULL) { if (apol_terule_query_append_class(policy, teq, opt->class_name)) { error = errno; goto err; } } else { for (i = 0; i < apol_vector_get_size(opt->class_vector); ++i) { char *class_name; class_name = apol_vector_get_element(opt->class_vector, i); if (!class_name) continue; if (apol_terule_query_append_class(policy, teq, class_name)) { error = errno; goto err; } } } } if (!(opt->semantic) && qpol_policy_has_capability(apol_policy_get_qpol(policy), QPOL_CAP_SYN_RULES)) { if (apol_syn_terule_get_by_query(policy, teq, v)) { goto err; } } else { if (apol_terule_get_by_query(policy, teq, v)) { goto err; } } apol_terule_query_destroy(&teq); return 0; err: error = errno; PyErr_SetString(PyExc_RuntimeError,strerror(error)); apol_vector_destroy(v); apol_terule_query_destroy(&teq); errno = error; return -1; }