/** * Gets statistics regarding a policy's booleans. * If this function is given a name, it will attempt to * get statistics about a particular boolean; otherwise * the function gets statistics about all of the policy's booleans. * * @param fp Reference to a file to which to print statistics * @param name Reference to a boolean's name; if NULL, * all booleans will be considered * @param expand Flag indicating whether to print each * boolean's default state * @param policydb Reference to a policy * * @return new reference, or NULL (setting an exception) */ static PyObject* get_booleans(const char *name, const apol_policy_t * policydb) { PyObject *dict = NULL; int error = 0; int rt = 0; const char *bool_name = NULL; int state; qpol_bool_t *bool_datum = NULL; qpol_iterator_t *iter = NULL; qpol_policy_t *q = apol_policy_get_qpol(policydb); size_t n_bools = 0; PyObject *list = PyList_New(0); if (!list) goto err; if (name != NULL) { if (qpol_policy_get_bool_by_name(q, name, &bool_datum)) goto err; if (qpol_bool_get_state(q, bool_datum, &state)) goto err; dict = PyDict_New(); if (!dict) goto err; if (py_insert_string(dict, "name", name)) goto err; if (py_insert_bool(dict, "name", state)) goto err; rt = py_append_obj(list, dict); Py_DECREF(dict); dict = NULL; if (rt) goto err; } else { if (qpol_policy_get_bool_iter(q, &iter)) goto err; if (qpol_iterator_get_size(iter, &n_bools)) goto err; for (; !qpol_iterator_end(iter); qpol_iterator_next(iter)) { if (qpol_iterator_get_item(iter, (void **)&bool_datum)) goto err; if (qpol_bool_get_name(q, bool_datum, &bool_name)) goto err; if (qpol_bool_get_state(q, bool_datum, &state)) goto err; dict = PyDict_New(); if (!dict) goto err; if (py_insert_string(dict, "name", bool_name)) goto err; if (py_insert_bool(dict, "state", state)) goto err; rt = py_append_obj(list, dict); Py_DECREF(dict); dict = NULL; if (rt) goto err; } qpol_iterator_destroy(&iter); } goto cleanup; err: error = errno; PyErr_SetString(PyExc_RuntimeError,strerror(error)); py_decref(list); list = NULL; py_decref(dict); dict = NULL; cleanup: qpol_iterator_destroy(&iter); errno = error; return list; }
static PyObject* get_bool(const qpol_policy_t *q, const qpol_cond_t * cond, int enabled) { qpol_iterator_t *iter = NULL; qpol_cond_expr_node_t *expr = NULL; char *tmp = NULL; const char *bool_name = NULL; int error = 0; uint32_t expr_type = 0; qpol_bool_t *cond_bool = NULL; PyObject *obj, *tuple = NULL; PyObject *boollist = NULL; if (!q || !cond) { errno = EINVAL; return NULL; } if (qpol_cond_get_expr_node_iter(q, cond, &iter) < 0) { goto err; } boollist = PyList_New(0); if (! boollist) goto err; for (; !qpol_iterator_end(iter); qpol_iterator_next(iter)) { if (qpol_iterator_get_item(iter, (void **)&expr)) { goto err; } if (qpol_cond_expr_node_get_expr_type(q, expr, &expr_type)) { goto err; } if (expr_type != QPOL_COND_EXPR_BOOL) { obj = PyUnicode_FromString(apol_cond_expr_type_to_str(expr_type)); if (!obj) goto err; if (py_append_obj(boollist, obj)) goto err; } else { tuple = PyTuple_New(2); if (!tuple) goto err; if (qpol_cond_expr_node_get_bool(q, expr, &cond_bool)) { goto err; } if (qpol_bool_get_name(q, cond_bool, &bool_name)) { goto err; } obj = PyUnicode_FromString(bool_name); if (py_tuple_insert_obj(tuple, 0, obj)) goto err; obj = PyBool_FromLong(enabled); if (py_tuple_insert_obj(tuple, 1, obj)) goto err; if (py_append_obj(boollist, tuple)) goto err; tuple=NULL; } } qpol_iterator_destroy(&iter); return boollist; err: error = errno; qpol_iterator_destroy(&iter); py_decref(tuple); py_decref(boollist); free(tmp); errno = error; return NULL; }
int poldiff_build_bsts(poldiff_t * diff) { apol_vector_t *classes[2] = { NULL, NULL }; apol_vector_t *perms[2] = { NULL, NULL }; apol_vector_t *bools[2] = { NULL, NULL }; size_t i, j; const qpol_class_t *cls; qpol_bool_t *qbool; const char *name; char *new_name; int retval = -1, error = 0; if (diff->class_bst != NULL) { return 0; } if ((diff->class_bst = apol_bst_create(apol_str_strcmp, free)) == NULL || (diff->perm_bst = apol_bst_create(apol_str_strcmp, free)) == NULL || (diff->bool_bst = apol_bst_create(apol_str_strcmp, free)) == NULL) { error = errno; ERR(diff, "%s", strerror(error)); goto cleanup; } for (i = 0; i < 2; i++) { apol_policy_t *p = (i == 0 ? diff->orig_pol : diff->mod_pol); qpol_policy_t *q = apol_policy_get_qpol(p); if (apol_class_get_by_query(p, NULL, &classes[i]) < 0 || apol_perm_get_by_query(p, NULL, &perms[i]) < 0 || apol_bool_get_by_query(p, NULL, &bools[i]) < 0) { error = errno; goto cleanup; } for (j = 0; j < apol_vector_get_size(classes[i]); j++) { cls = apol_vector_get_element(classes[i], j); if (qpol_class_get_name(q, cls, &name) < 0) { error = errno; goto cleanup; } if ((new_name = strdup(name)) == NULL || apol_bst_insert_and_get(diff->class_bst, (void **)&new_name, NULL) < 0) { error = errno; ERR(diff, "%s", strerror(error)); goto cleanup; } } for (j = 0; j < apol_vector_get_size(perms[i]); j++) { name = (char *)apol_vector_get_element(perms[i], j); if ((new_name = strdup(name)) == NULL || apol_bst_insert_and_get(diff->perm_bst, (void **)&new_name, NULL) < 0) { error = errno; ERR(diff, "%s", strerror(error)); goto cleanup; } } for (j = 0; j < apol_vector_get_size(bools[i]); j++) { qbool = (qpol_bool_t *) apol_vector_get_element(bools[i], j); if (qpol_bool_get_name(q, qbool, &name) < 0) { error = errno; goto cleanup; } if ((new_name = strdup(name)) == NULL || apol_bst_insert_and_get(diff->bool_bst, (void **)&new_name, NULL) < 0) { error = errno; ERR(diff, "%s", strerror(error)); goto cleanup; } } } retval = 0; cleanup: apol_vector_destroy(&classes[0]); apol_vector_destroy(&classes[1]); apol_vector_destroy(&perms[0]); apol_vector_destroy(&perms[1]); apol_vector_destroy(&bools[0]); apol_vector_destroy(&bools[1]); errno = error; return retval; }