int bool_change_append(seaudit_log_t * log, seaudit_bool_message_t * boolm, const char *name, int value) { char *s = strdup(name); seaudit_bool_message_change_t *bc = NULL; int error; if (s == NULL || apol_bst_insert_and_get(log->bools, (void **)&s, NULL) < 0) { error = errno; free(s); ERR(log, "%s", strerror(error)); errno = error; return -1; } if ((bc = calloc(1, sizeof(*bc))) == NULL || apol_vector_append(boolm->changes, bc) < 0) { error = errno; free(s); ERR(log, "%s", strerror(error)); errno = error; return -1; } bc->boolean = s; bc->value = value; return 0; }
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; }