static inline oval_result_t _evaluate_sysent(struct oval_syschar_model *syschar_model, struct oval_sysent *item_entity, struct oval_entity *state_entity, oval_operation_t state_entity_operation, struct oval_state_content *content) { if (oval_sysent_get_status(item_entity) == SYSCHAR_STATUS_DOES_NOT_EXIST) { return OVAL_RESULT_FALSE; } else if (oval_entity_get_varref_type(state_entity) == OVAL_ENTITY_VARREF_ATTRIBUTE) { return _evaluate_sysent_with_variable(syschar_model, state_entity, item_entity, state_entity_operation, content); } else { struct oval_value *state_entity_val; char *state_entity_val_text; oval_datatype_t state_entity_val_datatype; if ((state_entity_val = oval_entity_get_value(state_entity)) == NULL) { oscap_seterr(OSCAP_EFAMILY_OVAL, "OVAL internal error: found NULL entity value"); return -1; } if ((state_entity_val_text = oval_value_get_text(state_entity_val)) == NULL) { oscap_seterr(OSCAP_EFAMILY_OVAL, "OVAL internal error: found NULL entity value text"); return -1; } state_entity_val_datatype = oval_value_get_datatype(state_entity_val); return oval_ent_cmp_str(state_entity_val_text, state_entity_val_datatype, item_entity, state_entity_operation); } }
static void _syschar_add_bindings(struct oval_syschar *sc, struct oval_string_map *vm) { struct oval_iterator *var_itr; var_itr = oval_string_map_values(vm); while (oval_collection_iterator_has_more(var_itr)) { struct oval_variable *var; struct oval_value_iterator *val_itr; struct oval_variable_binding *binding; var = oval_collection_iterator_next(var_itr); binding = oval_variable_binding_new(var, NULL); val_itr = oval_variable_get_values(var); while (oval_value_iterator_has_more(val_itr)) { struct oval_value *val; char *txt; val = oval_value_iterator_next(val_itr); txt = oval_value_get_text(val); txt = oscap_strdup(txt); oval_variable_binding_add_value(binding, txt); } oval_value_iterator_free(val_itr); oval_syschar_add_variable_binding(sc, binding); } oval_collection_iterator_free(var_itr); }
static inline oval_result_t _evaluate_sysent_with_variable(struct oval_syschar_model *syschar_model, struct oval_entity *state_entity, struct oval_sysent *item_entity, oval_operation_t state_entity_operation, struct oval_state_content *content) { oval_syschar_collection_flag_t flag; oval_result_t ent_val_res; struct oval_variable *state_entity_var; if ((state_entity_var = oval_entity_get_variable(state_entity)) == NULL) { oscap_seterr(OSCAP_EFAMILY_OVAL, "OVAL internal error: found NULL variable"); return -1; } if (0 != oval_syschar_model_compute_variable(syschar_model, state_entity_var)) { return -1; } flag = oval_variable_get_collection_flag(state_entity_var); switch (flag) { case SYSCHAR_FLAG_COMPLETE: case SYSCHAR_FLAG_INCOMPLETE:{ struct oresults var_ores; struct oval_value_iterator *val_itr; ores_clear(&var_ores); val_itr = oval_variable_get_values(state_entity_var); while (oval_value_iterator_has_more(val_itr)) { struct oval_value *var_val; char *state_entity_val_text = NULL; oval_result_t var_val_res; var_val = oval_value_iterator_next(val_itr); state_entity_val_text = oval_value_get_text(var_val); if (state_entity_val_text == NULL) { dE("Found NULL variable value text.\n"); ores_add_res(&var_ores, OVAL_RESULT_ERROR); break; } oval_datatype_t state_entity_val_datatype = oval_value_get_datatype(var_val); var_val_res = oval_ent_cmp_str(state_entity_val_text, state_entity_val_datatype, item_entity, state_entity_operation); ores_add_res(&var_ores, var_val_res); } oval_value_iterator_free(val_itr); oval_check_t var_check = oval_state_content_get_var_check(content); ent_val_res = ores_get_result_bychk(&var_ores, var_check); } break; case SYSCHAR_FLAG_ERROR: case SYSCHAR_FLAG_DOES_NOT_EXIST: case SYSCHAR_FLAG_NOT_COLLECTED: case SYSCHAR_FLAG_NOT_APPLICABLE: ent_val_res = OVAL_RESULT_ERROR; break; default: ent_val_res = -1; } return ent_val_res; }
static int oval_varref_elm_to_sexp(void *sess, struct oval_variable *var, oval_datatype_t dt, SEXP_t **out_sexp, struct oval_syschar *syschar) { SEXP_t *val_lst; struct oval_value_iterator *val_itr; oval_syschar_collection_flag_t flag; if (oval_probe_query_variable(sess, var) != 0) return -1; flag = oval_variable_get_collection_flag(var); if (flag == SYSCHAR_FLAG_DOES_NOT_EXIST) { char msg[100]; snprintf(msg, sizeof(msg), "Referenced variable has no values (%s).", oval_variable_get_id(var)); dI("%s", msg); if (syschar != NULL) { oval_syschar_add_new_message(syschar, msg, OVAL_MESSAGE_LEVEL_WARNING); oval_syschar_set_flag(syschar, SYSCHAR_FLAG_DOES_NOT_EXIST); } return 1; } if (flag != SYSCHAR_FLAG_COMPLETE && flag != SYSCHAR_FLAG_INCOMPLETE) { *out_sexp = SEXP_list_new(NULL); return 0; } val_lst = SEXP_list_new(NULL); val_itr = oval_variable_get_values(var); while (oval_value_iterator_has_more(val_itr)) { struct oval_value *val; SEXP_t *vs; val = oval_value_iterator_next(val_itr); vs = oval_value_to_sexp(val, dt); if (vs == NULL) { oscap_seterr(OSCAP_EFAMILY_OVAL, "Failed to convert OVAL value to SEXP: " "datatype: %s, text: %s.", oval_datatype_get_text(dt), oval_value_get_text(val)); oval_value_iterator_free(val_itr); SEXP_free(val_lst); return -1; } SEXP_list_add(val_lst, vs); SEXP_free(vs); } oval_value_iterator_free(val_itr); *out_sexp = val_lst; return 0; }
SEXP_t *oval_value_to_sexp(struct oval_value *val, oval_datatype_t dtype) { SEXP_t *val_sexp = NULL; char *val_rptr = NULL; switch (dtype) { case OVAL_DATATYPE_EVR_STRING: case OVAL_DATATYPE_DEBIAN_EVR_STRING: case OVAL_DATATYPE_IPV4ADDR: case OVAL_DATATYPE_IPV6ADDR: case OVAL_DATATYPE_STRING: case OVAL_DATATYPE_VERSION: val_rptr = oval_value_get_text (val); if (val_rptr != NULL) { val_sexp = SEXP_string_newf("%s", val_rptr); } break; case OVAL_DATATYPE_FLOAT: val_sexp = SEXP_number_newf(oval_value_get_float(val)); break; case OVAL_DATATYPE_INTEGER: val_sexp = SEXP_number_newi_64(oval_value_get_integer(val)); break; case OVAL_DATATYPE_BOOLEAN: val_sexp = SEXP_number_newb(oval_value_get_boolean(val)); break; case OVAL_DATATYPE_BINARY: case OVAL_DATATYPE_FILESET_REVISION: case OVAL_DATATYPE_IOS_VERSION: // todo: oscap_seterr(OSCAP_EFAMILY_OVAL, "Unsupported datatype: %s.", dtype); val_sexp = NULL; break; default: oscap_seterr(OSCAP_EFAMILY_OVAL, "Unknown datatype: %s.", dtype); val_sexp = NULL; break; } return val_sexp; }
static void _oval_result_test_initialize_bindings(struct oval_result_test *rslt_test) { __attribute__nonnull__(rslt_test); struct oval_test *oval_test = oval_result_test_get_test(rslt_test); struct oval_string_map *vm; struct oval_state_iterator *ste_itr; struct oval_iterator *var_itr; vm = oval_string_map_new(); /* Gather bindings pertaining to the referenced states */ /* TODO: cache bindings collected for each state */ ste_itr = oval_test_get_states(oval_test); while (oval_state_iterator_has_more(ste_itr)) { struct oval_state *ste; ste = oval_state_iterator_next(ste_itr); oval_ste_collect_var_refs(ste, vm); } oval_state_iterator_free(ste_itr); var_itr = oval_string_map_values(vm); while (oval_collection_iterator_has_more(var_itr)) { struct oval_variable *var; struct oval_value_iterator *val_itr; struct oval_variable_binding *binding; var = oval_collection_iterator_next(var_itr); binding = oval_variable_binding_new(var, NULL); val_itr = oval_variable_get_values(var); while (oval_value_iterator_has_more(val_itr)) { struct oval_value *val; char *txt; val = oval_value_iterator_next(val_itr); txt = oval_value_get_text(val); txt = oscap_strdup(txt); oval_variable_binding_add_value(binding, txt); } oval_value_iterator_free(val_itr); oval_result_test_add_binding(rslt_test, binding); } oval_collection_iterator_free(var_itr); /* Gather bindings pertaining to the collected object */ struct oval_object *oval_object = oval_test_get_object(oval_test); if (oval_object) { char *object_id = oval_object_get_id(oval_object); struct oval_result_system *sys = oval_result_test_get_system(rslt_test); struct oval_syschar_model *syschar_model = oval_result_system_get_syschar_model(sys); struct oval_syschar *syschar = oval_syschar_model_get_syschar(syschar_model, object_id); /* no syschar if system characteristics was a subset of definitions */ if(syschar) { struct oval_variable_binding_iterator *bindings = oval_syschar_get_variable_bindings(syschar); while (oval_variable_binding_iterator_has_more(bindings)) { struct oval_variable *var; char *var_id; struct oval_variable_binding *binding = oval_variable_binding_iterator_next(bindings); var = oval_variable_binding_get_variable(binding); var_id = oval_variable_get_id(var); /* Don't add bindings that were already * collected from states. Assumtion is made * that object's own bindings don't contain * duplicates. */ if (oval_string_map_get_value(vm, var_id) == NULL) { struct oval_definition_model *definition_model = oval_syschar_model_get_definition_model(syschar_model); struct oval_variable_binding *binding_copy = oval_variable_binding_clone(binding, definition_model); oval_result_test_add_binding(rslt_test, binding_copy); } } oval_variable_binding_iterator_free(bindings); } } oval_string_map_free(vm, NULL); rslt_test->bindings_initialized = true; }