Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}