seaudit_log_t *seaudit_log_create(seaudit_handle_fn_t fn, void *callback_arg) { seaudit_log_t *log = NULL; int error; if ((log = calloc(1, sizeof(*log))) == NULL) { return NULL; } log->fn = fn; log->handle_arg = callback_arg; if ((log->messages = apol_vector_create(message_free)) == NULL || (log->malformed_msgs = apol_vector_create(free)) == NULL || (log->models = apol_vector_create(NULL)) == NULL || (log->types = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->classes = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->roles = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->users = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->perms = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->mls_lvl = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->mls_clr = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->hosts = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->bools = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->managers = apol_bst_create(apol_str_strcmp, free)) == NULL) { error = errno; seaudit_log_destroy(&log); errno = error; return NULL; } return log; }
void seaudit_log_clear(seaudit_log_t * log) { if (log == NULL) { errno = EINVAL; return; } apol_vector_destroy(&log->messages); apol_vector_destroy(&log->malformed_msgs); apol_bst_destroy(&log->types); apol_bst_destroy(&log->classes); apol_bst_destroy(&log->roles); apol_bst_destroy(&log->users); apol_bst_destroy(&log->perms); apol_bst_destroy(&log->hosts); apol_bst_destroy(&log->bools); apol_bst_destroy(&log->managers); apol_bst_destroy(&log->mls_lvl); apol_bst_destroy(&log->mls_clr); if ((log->messages = apol_vector_create(message_free)) == NULL || (log->malformed_msgs = apol_vector_create(free)) == NULL || (log->types = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->classes = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->roles = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->users = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->perms = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->mls_lvl = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->mls_clr = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->hosts = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->bools = apol_bst_create(apol_str_strcmp, free)) == NULL || (log->managers = apol_bst_create(apol_str_strcmp, free)) == NULL) { /* hopefully will never get here... */ return; } for (size_t i = 0; i < apol_vector_get_size(log->models); i++) { seaudit_model_t *m = apol_vector_get_element(log->models, i); model_notify_log_changed(m, log); } }
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; }