oval_sexp.c   oval_sexp.c 
skipping to change at line 62 skipping to change at line 62
#ifndef _A #ifndef _A
# define _A(x) assert(x) # define _A(x) assert(x)
#endif #endif
SEXP_t *oval_value_to_sexp(struct oval_value *val, oval_datatype_t dtype) SEXP_t *oval_value_to_sexp(struct oval_value *val, oval_datatype_t dtype)
{ {
SEXP_t *val_sexp = NULL; SEXP_t *val_sexp = NULL;
char *val_rptr = NULL; char *val_rptr = NULL;
/* todo: remove calls to SEXP_datatype_set() */
switch (dtype) { switch (dtype) {
case OVAL_DATATYPE_VERSION: case OVAL_DATATYPE_EVR_STRING:
val_rptr = oval_value_get_text (val); case OVAL_DATATYPE_IPV4ADDR:
case OVAL_DATATYPE_IPV6ADDR:
if (val_rptr != NULL) {
val_sexp = SEXP_string_newf("%s", val_rptr);
SEXP_datatype_set(val_sexp, "version");
}
break;
case OVAL_DATATYPE_EVR_STRING:
val_rptr = oval_value_get_text (val);
if (val_rptr != NULL) {
val_sexp = SEXP_string_newf("%s", val_rptr);
SEXP_datatype_set(val_sexp, "evr_str");
}
break;
case OVAL_DATATYPE_STRING: case OVAL_DATATYPE_STRING:
case OVAL_DATATYPE_VERSION:
val_rptr = oval_value_get_text (val); val_rptr = oval_value_get_text (val);
if (val_rptr != NULL) { if (val_rptr != NULL) {
val_sexp = SEXP_string_newf("%s", val_rptr); val_sexp = SEXP_string_newf("%s", val_rptr);
} }
break; break;
case OVAL_DATATYPE_FLOAT: case OVAL_DATATYPE_FLOAT:
val_sexp = SEXP_number_newf(oval_value_get_float(val)); val_sexp = SEXP_number_newf(oval_value_get_float(val));
break; break;
case OVAL_DATATYPE_INTEGER: case OVAL_DATATYPE_INTEGER:
val_sexp = SEXP_number_newi_64(oval_value_get_integer(val)); val_sexp = SEXP_number_newi_64(oval_value_get_integer(val));
skipping to change at line 123 skipping to change at line 106
} }
return val_sexp; return val_sexp;
} }
static SEXP_t *oval_entity_to_sexp(struct oval_entity *ent) static SEXP_t *oval_entity_to_sexp(struct oval_entity *ent)
{ {
SEXP_t *elm, *elm_name; SEXP_t *elm, *elm_name;
SEXP_t *r0, *r1, *r2; SEXP_t *r0, *r1, *r2;
oval_datatype_t datatype; oval_datatype_t datatype;
oval_entity_varref_type_t vr_type;
elm_name = SEXP_list_new(r0 = SEXP_string_newf("%s", oval_entity_get _name(ent)), elm_name = SEXP_list_new(r0 = SEXP_string_newf("%s", oval_entity_get _name(ent)),
/* operation */ /* operation */
r1 = SEXP_string_new(":operation", 10), r1 = SEXP_string_new(":operation", 10),
r2 = SEXP_number_newu_32(oval_entity_get_op eration(ent)), NULL); r2 = SEXP_number_newu_32(oval_entity_get_op eration(ent)), NULL);
SEXP_vfree(r0, r1, r2, NULL);
SEXP_free(r0);
SEXP_free(r1);
SEXP_free(r2);
elm = SEXP_list_new(NULL); elm = SEXP_list_new(NULL);
datatype = oval_entity_get_datatype(ent); datatype = oval_entity_get_datatype(ent);
probe_ent_setdatatype(elm, datatype); probe_ent_setdatatype(elm, datatype);
if (oval_entity_get_varref_type(ent) == OVAL_ENTITY_VARREF_ATTRIBUTE vr_type = oval_entity_get_varref_type(ent);
) { if (vr_type == OVAL_ENTITY_VARREF_ATTRIBUTE
|| vr_type == OVAL_ENTITY_VARREF_ELEMENT) {
/* var_ref */ /* var_ref */
struct oval_variable *var; struct oval_variable *var;
var = oval_entity_get_variable(ent); var = oval_entity_get_variable(ent);
SEXP_list_add(elm_name, r0 = SEXP_string_new(":var_ref", 8)) ; SEXP_list_add(elm_name, r0 = SEXP_string_new(":var_ref", 8)) ;
SEXP_free(r0); SEXP_list_add(elm_name, r1 = SEXP_string_newf("%s", oval_var
iable_get_id(var)));
SEXP_list_add(elm_name, r0 = SEXP_string_newf("%s", oval_var
iable_get_id(var)));
SEXP_free(r0);
SEXP_list_add(elm, elm_name); SEXP_list_add(elm, elm_name);
SEXP_free(elm_name); SEXP_vfree(r0, r1, elm_name, NULL);
} else { } else {
/* value */ /* value */
struct oval_value *val;
SEXP_list_add(elm, elm_name); SEXP_list_add(elm, elm_name);
SEXP_free(elm_name); SEXP_free(elm_name);
val = oval_entity_get_value(ent);
if (datatype != OVAL_DATATYPE_RECORD) { if (datatype != OVAL_DATATYPE_RECORD
&& val != NULL) {
SEXP_t *val_sexp; SEXP_t *val_sexp;
val_sexp = oval_value_to_sexp(oval_entity_get_value( ent), datatype); val_sexp = oval_value_to_sexp(val, datatype);
if (val_sexp != NULL) { if (val_sexp != NULL) {
SEXP_list_add(elm, val_sexp); SEXP_list_add(elm, val_sexp);
SEXP_free(val_sexp); SEXP_free(val_sexp);
} }
} }
} }
return (elm); return (elm);
} }
static int oval_varref_to_sexp(void *sess, struct oval_entity *entity, stru ct oval_syschar *syschar, SEXP_t **out_sexp) static int oval_varref_attr_to_sexp(void *sess, struct oval_entity *entity, struct oval_syschar *syschar, SEXP_t **out_sexp)
{ {
unsigned int val_cnt = 0; unsigned int val_cnt = 0;
SEXP_t *val_lst, *val_sexp, *varref, *id_sexp, *val_cnt_sexp; SEXP_t *val_lst, *val_sexp, *varref, *id_sexp, *val_cnt_sexp;
oval_datatype_t dt; oval_datatype_t dt;
struct oval_variable *var; struct oval_variable *var;
struct oval_value_iterator *vit; struct oval_value_iterator *vit;
struct oval_value *val; struct oval_value *val;
oval_syschar_collection_flag_t flag; oval_syschar_collection_flag_t flag;
char msg[100]; char msg[100];
int ret = 0; int ret = 0;
skipping to change at line 196 skipping to change at line 177
return -1; return -1;
} }
flag = oval_variable_get_collection_flag(var); flag = oval_variable_get_collection_flag(var);
switch (flag) { switch (flag) {
case SYSCHAR_FLAG_COMPLETE: case SYSCHAR_FLAG_COMPLETE:
case SYSCHAR_FLAG_INCOMPLETE: case SYSCHAR_FLAG_INCOMPLETE:
vit = oval_variable_get_values(var); vit = oval_variable_get_values(var);
if (oval_value_iterator_has_more(vit)) if (oval_value_iterator_has_more(vit))
break; break;
oval_value_iterator_free(vit);
/* fall through */ /* fall through */
case SYSCHAR_FLAG_DOES_NOT_EXIST: case SYSCHAR_FLAG_DOES_NOT_EXIST:
snprintf(msg, sizeof(msg), "Referenced variable has no value s (%s).", oval_variable_get_id(var)); snprintf(msg, sizeof(msg), "Referenced variable has no value s (%s).", oval_variable_get_id(var));
ret = 1; ret = 1;
break; break;
default: default:
snprintf(msg, sizeof(msg), "There was a problem processing r eferenced variable (%s).", oval_variable_get_id(var)); snprintf(msg, sizeof(msg), "There was a problem processing r eferenced variable (%s).", oval_variable_get_id(var));
ret = 1; ret = 1;
} }
skipping to change at line 247 skipping to change at line 229
varref = SEXP_list_new(id_sexp, val_cnt_sexp, val_lst, NULL); varref = SEXP_list_new(id_sexp, val_cnt_sexp, val_lst, NULL);
SEXP_free(id_sexp); SEXP_free(id_sexp);
SEXP_free(val_cnt_sexp); SEXP_free(val_cnt_sexp);
SEXP_free(val_lst); SEXP_free(val_lst);
*out_sexp = varref; *out_sexp = varref;
return 0; return 0;
} }
static int oval_varref_elm_to_sexp(void *sess, struct oval_variable *var, o
val_datatype_t dt, SEXP_t **out_sexp)
{
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_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_dlprintf(DBG_E, "Failed to convert OVAL value
to SEXP: "
"datatype: %s, text: %s.\n",
oval_datatype_get_text(dt),
oval_value_get_text(val));
oscap_seterr(OSCAP_EFAMILY_OVAL, OVAL_EOVALINT, "Fai
led to convert OVAL value to SEXP");
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;
}
static SEXP_t *oval_filter_to_sexp(struct oval_filter *filter) static SEXP_t *oval_filter_to_sexp(struct oval_filter *filter)
{ {
SEXP_t *elm, *attr, *r0, *r1; SEXP_t *elm, *attr, *r0, *r1;
oval_filter_action_t act; oval_filter_action_t act;
struct oval_state *ste; struct oval_state *ste;
char *ste_id; char *ste_id;
act = oval_filter_get_filter_action(filter); act = oval_filter_get_filter_action(filter);
ste = oval_filter_get_state(filter); ste = oval_filter_get_state(filter);
ste_id = oval_state_get_id(ste); ste_id = oval_state_get_id(ste);
skipping to change at line 370 skipping to change at line 396
SEXP_free(r0); SEXP_free(r0);
} }
} }
r0 = SEXP_list_new(elm_name, NULL); r0 = SEXP_list_new(elm_name, NULL);
SEXP_free(elm_name); SEXP_free(elm_name);
return (r0); return (r0);
} }
int oval_object2sexp(void *sess, const char *typestr, struct oval_syschar * syschar, SEXP_t **out_sexp) int oval_object_to_sexp(void *sess, const char *typestr, struct oval_syscha r *syschar, SEXP_t **out_sexp)
{ {
unsigned int ent_cnt, varref_cnt; unsigned int ent_cnt, varref_cnt;
int ret = -1; int ret = -1;
SEXP_t *obj_sexp, *obj_name, *elm, *varrefs, *ent_lst, *lst, *stmp; SEXP_t *obj_sexp, *obj_name, *elm, *varrefs, *ent_lst, *lst, *stmp;
SEXP_t *r0, *r1, *r2; SEXP_t *r0, *r1, *r2;
struct oval_object *object; struct oval_object *object;
struct oval_object_content_iterator *cit; struct oval_object_content_iterator *cit;
struct oval_behavior_iterator *bit; struct oval_behavior_iterator *bit;
struct oval_object_content *content; struct oval_object_content *content;
skipping to change at line 410 skipping to change at line 436
* Object content * Object content
*/ */
ent_lst = SEXP_list_new(NULL); ent_lst = SEXP_list_new(NULL);
varrefs = NULL; varrefs = NULL;
ent_cnt = varref_cnt = 0; ent_cnt = varref_cnt = 0;
cit = oval_object_get_object_contents(object); cit = oval_object_get_object_contents(object);
while (oval_object_content_iterator_has_more(cit)) { while (oval_object_content_iterator_has_more(cit)) {
oval_check_t ochk; oval_check_t ochk;
oval_entity_varref_type_t vr_type;
content = oval_object_content_iterator_next(cit); content = oval_object_content_iterator_next(cit);
elm = NULL; elm = NULL;
lst = ent_lst; lst = ent_lst;
switch (oval_object_content_get_type(content)) { switch (oval_object_content_get_type(content)) {
case OVAL_OBJECTCONTENT_ENTITY: case OVAL_OBJECTCONTENT_ENTITY:
entity = oval_object_content_get_entity(content); entity = oval_object_content_get_entity(content);
elm = oval_entity_to_sexp(entity); elm = oval_entity_to_sexp(entity);
if (elm == NULL) if (elm == NULL)
break; break;
ochk = oval_object_content_get_varCheck(content); ochk = oval_object_content_get_varCheck(content);
if (ochk != OVAL_CHECK_UNKNOWN) { if (ochk != OVAL_CHECK_UNKNOWN) {
probe_ent_attr_add(elm, "var_check", probe_ent_attr_add(elm, "var_check",
r0 = SEXP_number_newu_32( ochk)); r0 = SEXP_number_newu_32( ochk));
SEXP_free(r0); SEXP_free(r0);
} }
if (oval_entity_get_varref_type(entity) == OVAL_ENTI vr_type = oval_entity_get_varref_type(entity);
TY_VARREF_ATTRIBUTE) { if (vr_type == OVAL_ENTITY_VARREF_ATTRIBUTE) {
ret = oval_varref_to_sexp(sess, entity, sysc ret = oval_varref_attr_to_sexp(sess, entity,
har, &stmp); syschar, &stmp);
if (ret != 0) { if (ret != 0) {
SEXP_free(elm); SEXP_free(elm);
elm = NULL; elm = NULL;
break; break;
} }
if (varrefs == NULL) { if (varrefs == NULL) {
varrefs = SEXP_list_new(NULL); varrefs = SEXP_list_new(NULL);
} }
SEXP_list_add(varrefs, stmp); SEXP_list_add(varrefs, stmp);
SEXP_free(stmp); SEXP_free(stmp);
// todo: don't add duplicates // todo: don't add duplicates
++varref_cnt; ++varref_cnt;
lst = obj_sexp; lst = obj_sexp;
++ent_cnt; ++ent_cnt;
} else if (vr_type == OVAL_ENTITY_VARREF_ELEMENT) {
SEXP_t *val_lst;
struct oval_variable *var;
oval_datatype_t dt;
var = oval_entity_get_variable(entity);
dt = oval_entity_get_datatype(entity);
ret = oval_varref_elm_to_sexp(sess, var, dt,
&val_lst);
if (ret != 0) {
SEXP_free(elm);
elm = NULL;
break;
}
SEXP_list_add(elm, val_lst);
SEXP_free(val_lst);
} }
break; break;
case OVAL_OBJECTCONTENT_SET: case OVAL_OBJECTCONTENT_SET:
elm = oval_set_to_sexp(oval_object_content_get_setob ject(content)); elm = oval_set_to_sexp(oval_object_content_get_setob ject(content));
break; break;
case OVAL_OBJECTCONTENT_FILTER: case OVAL_OBJECTCONTENT_FILTER:
elm = oval_filter_to_sexp(oval_object_content_get_fi lter(content)); elm = oval_filter_to_sexp(oval_object_content_get_fi lter(content));
break; break;
skipping to change at line 553 skipping to change at line 596
} }
ochk = oval_record_field_get_ent_check(rf); ochk = oval_record_field_get_ent_check(rf);
if (ochk != OVAL_CHECK_UNKNOWN) { if (ochk != OVAL_CHECK_UNKNOWN) {
probe_ent_attr_add(rf_sexp, "entity_check", r0 = SEXP_number _newu_32(ochk)); probe_ent_attr_add(rf_sexp, "entity_check", r0 = SEXP_number _newu_32(ochk));
SEXP_free(r0); SEXP_free(r0);
} }
return rf_sexp; return rf_sexp;
} }
static struct oval_sysent *oval_sysent_from_sexp(struct oval_syschar_model *model, SEXP_t * sexp); static struct oval_sysent *oval_sexp_to_sysent(struct oval_syschar_model *m odel, struct oval_sysitem *item, SEXP_t * sexp);
static struct oval_record_field *oval_record_field_ITEM_from_sexp(SEXP_t *s exp) static struct oval_record_field *oval_record_field_ITEM_from_sexp(SEXP_t *s exp)
{ {
struct oval_sysent *sysent; struct oval_sysent *sysent;
struct oval_record_field *rf; struct oval_record_field *rf;
sysent = oval_sysent_from_sexp(NULL, sexp); sysent = oval_sexp_to_sysent(NULL, NULL, sexp);
if (sysent == NULL) if (sysent == NULL)
return NULL; return NULL;
rf = oval_record_field_new(OVAL_RECORD_FIELD_ITEM); rf = oval_record_field_new(OVAL_RECORD_FIELD_ITEM);
oval_record_field_set_name(rf, oscap_strdup(oval_sysent_get_name(sys ent))); oval_record_field_set_name(rf, oscap_strdup(oval_sysent_get_name(sys ent)));
oval_record_field_set_value(rf, oscap_strdup(oval_sysent_get_value(s ysent))); oval_record_field_set_value(rf, oscap_strdup(oval_sysent_get_value(s ysent)));
oval_record_field_set_datatype(rf, oval_sysent_get_datatype(sysent)) ; oval_record_field_set_datatype(rf, oval_sysent_get_datatype(sysent)) ;
oval_record_field_set_mask(rf, oval_sysent_get_mask(sysent)); oval_record_field_set_mask(rf, oval_sysent_get_mask(sysent));
oval_record_field_set_status(rf, oval_sysent_get_status(sysent)); oval_record_field_set_status(rf, oval_sysent_get_status(sysent));
oval_sysent_free(sysent); oval_sysent_free(sysent);
return rf; return rf;
} }
int oval_state2sexp(void *sess, struct oval_state *state, SEXP_t **out_sexp ) int oval_state_to_sexp(void *sess, struct oval_state *state, SEXP_t **out_s exp)
{ {
SEXP_t *ste, *ste_name, *ste_ent; SEXP_t *ste, *ste_name, *ste_ent;
SEXP_t *r0, *r1, *r2, *r3, *r4; SEXP_t *r0, *r1, *r2, *r3, *r4;
char buffer[128]; char buffer[128];
size_t buflen; size_t buflen;
const char *subtype_name; const char *subtype_name;
struct oval_state_content_iterator *contents; struct oval_state_content_iterator *contents;
subtype_name = oval_subtype2str(oval_state_get_subtype(state)); subtype_name = oval_subtype_to_str(oval_state_get_subtype(state));
if (subtype_name == NULL) { if (subtype_name == NULL) {
_D("FAIL: unknown subtype: %d\n", oval_state_get_subtype(sta te)); _D("FAIL: unknown subtype: %d\n", oval_state_get_subtype(sta te));
return (-1); return (-1);
} }
buflen = snprintf(buffer, sizeof buffer, "%s_state", subtype_name); buflen = snprintf(buffer, sizeof buffer, "%s_state", subtype_name);
_A(buflen < sizeof buffer); _A(buflen < sizeof buffer);
ste_name = SEXP_list_new(r0 = SEXP_string_new(buffer, buflen), ste_name = SEXP_list_new(r0 = SEXP_string_new(buffer, buflen),
skipping to change at line 608 skipping to change at line 651
r3 = SEXP_string_new(":operator", 9), r3 = SEXP_string_new(":operator", 9),
r4 = SEXP_number_newu(oval_state_get_operat or(state)), r4 = SEXP_number_newu(oval_state_get_operat or(state)),
NULL); NULL);
ste = SEXP_list_new(ste_name, NULL); ste = SEXP_list_new(ste_name, NULL);
SEXP_vfree(r0, r1, r2, r3, r4, ste_name, NULL); SEXP_vfree(r0, r1, r2, r3, r4, ste_name, NULL);
contents = oval_state_get_contents(state); contents = oval_state_get_contents(state);
while (oval_state_content_iterator_has_more(contents)) { while (oval_state_content_iterator_has_more(contents)) {
oval_check_t ochk; oval_check_t ochk;
oval_entity_varref_type_t vr_type;
struct oval_entity *ent; struct oval_entity *ent;
struct oval_state_content *content = oval_state_content_iter ator_next(contents); struct oval_state_content *content = oval_state_content_iter ator_next(contents);
struct oval_record_field_iterator *rf_itr; struct oval_record_field_iterator *rf_itr;
ent = oval_state_content_get_entity(content); ent = oval_state_content_get_entity(content);
ste_ent = oval_entity_to_sexp(ent); ste_ent = oval_entity_to_sexp(ent);
if (ste_ent == NULL) { if (ste_ent == NULL) {
goto fail; goto fail;
} }
skipping to change at line 643 skipping to change at line 687
probe_ent_attr_add(ste_ent, "var_check", r0 = SEXP_n umber_newu_32(ochk)); probe_ent_attr_add(ste_ent, "var_check", r0 = SEXP_n umber_newu_32(ochk));
SEXP_free(r0); SEXP_free(r0);
} }
ochk = oval_state_content_get_ent_check(content); ochk = oval_state_content_get_ent_check(content);
if (ochk != OVAL_CHECK_UNKNOWN) { if (ochk != OVAL_CHECK_UNKNOWN) {
probe_ent_attr_add(ste_ent, "entity_check", r0 = SEX P_number_newu_32(ochk)); probe_ent_attr_add(ste_ent, "entity_check", r0 = SEX P_number_newu_32(ochk));
SEXP_free(r0); SEXP_free(r0);
} }
if (oval_entity_get_varref_type(ent) == OVAL_ENTITY_VARREF_A vr_type = oval_entity_get_varref_type(ent);
TTRIBUTE) { if (vr_type == OVAL_ENTITY_VARREF_ATTRIBUTE
|| vr_type == OVAL_ENTITY_VARREF_ELEMENT) {
SEXP_t *val_lst; SEXP_t *val_lst;
struct oval_variable *var; struct oval_variable *var;
struct oval_value_iterator *val_itr;
oval_datatype_t dt; oval_datatype_t dt;
oval_syschar_collection_flag_t flag;
var = oval_entity_get_variable(ent); var = oval_entity_get_variable(ent);
if (oval_probe_query_variable(sess, var) != 0) {
goto fail;
}
dt = oval_entity_get_datatype(ent); dt = oval_entity_get_datatype(ent);
val_lst = SEXP_list_new(NULL);
flag = oval_variable_get_collection_flag(var); if (oval_varref_elm_to_sexp(sess, var, dt, &val_lst)
if (flag == SYSCHAR_FLAG_COMPLETE != 0)
|| flag == SYSCHAR_FLAG_INCOMPLETE) { goto fail;
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_i
tr);
vs = oval_value_to_sexp(val, dt);
if (vs == NULL) {
oscap_dlprintf(DBG_E, "Faile
d to convert OVAL value to SEXP: "
"datatype: %s
, text: %s.\n",
oval_datatype
_get_text(dt),
oval_value_ge
t_text(val));
oscap_seterr(OSCAP_EFAMILY_O
VAL, OVAL_EOVALINT, "Failed to convert OVAL value to SEXP");
oval_value_iterator_free(val
_itr);
SEXP_free(val_lst);
goto fail;
}
SEXP_list_add(val_lst, vs);
SEXP_free(vs);
}
oval_value_iterator_free(val_itr);
}
SEXP_list_add(ste_ent, val_lst); SEXP_list_add(ste_ent, val_lst);
SEXP_free(val_lst); SEXP_free(val_lst);
} }
SEXP_list_add(ste, ste_ent); SEXP_list_add(ste, ste_ent);
SEXP_free(ste_ent); SEXP_free(ste_ent);
} }
oval_state_content_iterator_free(contents); oval_state_content_iterator_free(contents);
*out_sexp = ste; *out_sexp = ste;
return (0); return (0);
fail: fail:
oval_state_content_iterator_free(contents); oval_state_content_iterator_free(contents);
SEXP_vfree(ste, ste_ent, NULL); SEXP_vfree(ste, ste_ent, NULL);
return (-1); return (-1);
} }
static struct oval_message *oval_sexp2msg(const SEXP_t *msg) static struct oval_message *oval_sexp_to_msg(const SEXP_t *msg)
{ {
struct oval_message *message; struct oval_message *message;
SEXP_t *r0; SEXP_t *r0;
oval_message_level_t lvl; oval_message_level_t lvl;
char *str; char *str;
message = oval_message_new(); message = oval_message_new();
r0 = SEXP_list_first(msg); r0 = SEXP_list_first(msg);
lvl = SEXP_number_getu(r0); lvl = SEXP_number_getu(r0);
SEXP_free(r0); SEXP_free(r0);
oval_message_set_level(message, lvl); oval_message_set_level(message, lvl);
r0 = SEXP_list_nth(msg, 2); r0 = SEXP_list_nth(msg, 2);
str = SEXP_string_cstr(r0); str = SEXP_string_cstr(r0);
SEXP_free(r0); SEXP_free(r0);
oval_message_set_text(message, str); oval_message_set_text(message, str);
oscap_free(str); oscap_free(str);
return message; return message;
} }
static struct oval_sysent *oval_sysent_from_sexp(struct oval_syschar_model *model, SEXP_t * sexp) static struct oval_sysent *oval_sexp_to_sysent(struct oval_syschar_model *m odel, struct oval_sysitem *item, SEXP_t * sexp)
{ {
char *key; char *key;
oval_syschar_status_t status; oval_syschar_status_t status;
oval_datatype_t dt; oval_datatype_t dt;
struct oval_sysent *ent; struct oval_sysent *ent;
key = probe_ent_getname(sexp); key = probe_ent_getname(sexp);
if (!key) if (!key)
return NULL; return NULL;
if (strcmp("message", key) == 0 && item != NULL) {
struct oval_message *msg;
oval_message_level_t lvl;
SEXP_t *lvl_sexp, *txt_sexp;
char txt[1024];
lvl_sexp = probe_obj_getattrval(sexp, "level");
lvl = SEXP_number_getu_32(lvl_sexp);
txt_sexp = probe_ent_getval(sexp);
SEXP_string_cstr_r(txt_sexp, txt, sizeof txt);
SEXP_vfree(lvl_sexp, txt_sexp);
/* TODO: sanity checks */
msg = oval_message_new();
oval_message_set_level(msg, lvl);
oval_message_set_text(msg, txt);
oval_sysitem_add_message(item, msg);
return (NULL);
}
status = probe_ent_getstatus(sexp); status = probe_ent_getstatus(sexp);
dt = probe_ent_getdatatype(sexp); dt = probe_ent_getdatatype(sexp);
ent = oval_sysent_new(model); ent = oval_sysent_new(model);
oval_sysent_set_name(ent, key); oval_sysent_set_name(ent, key);
oval_sysent_set_status(ent, status); oval_sysent_set_status(ent, status);
oval_sysent_set_datatype(ent, dt); oval_sysent_set_datatype(ent, dt);
oval_sysent_set_mask(ent, probe_ent_getmask(sexp)); oval_sysent_set_mask(ent, probe_ent_getmask(sexp));
if (status != OVAL_STATUS_EXISTS) if (status != SYSCHAR_STATUS_EXISTS)
return ent; return ent;
if (dt == OVAL_DATATYPE_RECORD) { if (dt == OVAL_DATATYPE_RECORD) {
SEXP_t *srf, *srfs; SEXP_t *srf, *srfs;
probe_ent_getvals(sexp, &srfs); probe_ent_getvals(sexp, &srfs);
SEXP_list_foreach(srf, srfs) { SEXP_list_foreach(srf, srfs) {
struct oval_record_field *rf; struct oval_record_field *rf;
rf = oval_record_field_ITEM_from_sexp(srf); rf = oval_record_field_ITEM_from_sexp(srf);
skipping to change at line 794 skipping to change at line 835
case SEXP_NUM_UINT32: case SEXP_NUM_UINT32:
case SEXP_NUM_UINT64: case SEXP_NUM_UINT64:
snprintf(val, sizeof(val), "%" PRIu64, SEXP_ number_getu_64(sval)); snprintf(val, sizeof(val), "%" PRIu64, SEXP_ number_getu_64(sval));
break; break;
default: default:
dE("Unexpected SEXP number datatype: %d, nam e: '%s'.\n", sndt, key); dE("Unexpected SEXP number datatype: %d, nam e: '%s'.\n", sndt, key);
valp = '\0'; valp = '\0';
break; break;
} }
break; break;
case OVAL_DATATYPE_EVR_STRING:
case OVAL_DATATYPE_IPV4ADDR:
case OVAL_DATATYPE_IPV6ADDR:
case OVAL_DATATYPE_STRING: case OVAL_DATATYPE_STRING:
case OVAL_DATATYPE_EVR_STRING: case OVAL_DATATYPE_VERSION:
valp = SEXP_string_cstr(sval); valp = SEXP_string_cstr(sval);
break; break;
default: default:
dE("Unexpected OVAL datatype: %d, '%s', name: '%s'.\ n", dE("Unexpected OVAL datatype: %d, '%s', name: '%s'.\ n",
dt, oval_datatype_get_text(dt), key); dt, oval_datatype_get_text(dt), key);
valp = '\0'; valp = '\0';
break; break;
} }
oval_sysent_set_value(ent, valp); oval_sysent_set_value(ent, valp);
if (valp != val) if (valp != val)
oscap_free(valp); oscap_free(valp);
SEXP_free(sval); SEXP_free(sval);
} }
return ent; return ent;
} }
static struct oval_sysitem *oval_sysitem_from_sexp(struct oval_syschar_mode l *model, SEXP_t * sexp) static struct oval_sysitem *oval_sexp_to_sysitem(struct oval_syschar_model *model, SEXP_t * sexp)
{ {
_A(sexp); _A(sexp);
static int id_counter = 1; /* TODO better ID generator */ char *name, *id;
SEXP_t *id_sexp;
char *name;
struct oval_sysitem *sysitem = NULL; struct oval_sysitem *sysitem = NULL;
id_sexp = probe_ent_getattrval(sexp, "id");
id = SEXP_string_cstr(id_sexp);
SEXP_free(id_sexp);
sysitem = oval_syschar_model_get_sysitem(model, id);
if (sysitem) {
oscap_free(id);
return sysitem;
}
name = probe_ent_getname(sexp); name = probe_ent_getname(sexp);
if (name == NULL) if (name == NULL) {
oscap_free(id);
return NULL; return NULL;
else { } else {
char *endptr = strrchr(name, '_'); char *endptr = strrchr(name, '_');
if (strcmp(endptr, "_item") != 0) if (strcmp(endptr, "_item") != 0)
goto cleanup; goto cleanup;
*endptr = '\0'; // cut off the '_item' part *endptr = '\0'; // cut off the '_item' part
} }
int type = oval_str2subtype(name); int type = oval_str_to_subtype(name);
_D("Syschar entry type: %d '%s' => %s\n", type, name, (type ? "OK" : "FAILED to decode")); _D("Syschar entry type: %d '%s' => %s\n", type, name, (type ? "OK" : "FAILED to decode"));
#ifndef NDEBUG
char id[16]; if (!type)
abort();
#endif
SEXP_t *sub; SEXP_t *sub;
struct oval_sysent *sysent; struct oval_sysent *sysent;
int status = probe_ent_getstatus(sexp); int status = probe_ent_getstatus(sexp);
sprintf(id, "%d", id_counter++); sysitem = oval_sysitem_new(model, id);
sysitem = oval_sysitem_get_new(model, id);
oval_sysitem_set_status(sysitem, status); oval_sysitem_set_status(sysitem, status);
oval_sysitem_set_subtype(sysitem, type); oval_sysitem_set_subtype(sysitem, type);
//oval_sysitem_set_subtype_name(sysitem, name);
if (status == OVAL_STATUS_EXISTS) { for (int i = 2; (sub = SEXP_list_nth(sexp, i)) != NULL; ++i) {
for (int i = 2; (sub = SEXP_list_nth(sexp, i)) != NULL; ++i) if ((sysent = oval_sexp_to_sysent(model, sysitem, sub)) != NULL)
{ oval_sysitem_add_sysent(sysitem, sysent);
if ((sysent = oval_sysent_from_sexp(model, sub)) != SEXP_free(sub);
NULL)
oval_sysitem_add_sysent(sysitem, sysent);
SEXP_free(sub);
}
} }
cleanup: cleanup:
oscap_free(id);
oscap_free(name); oscap_free(name);
return sysitem; return sysitem;
} }
int oval_sexp2sysch(const SEXP_t *cobj, struct oval_syschar *syschar) int oval_sexp_to_sysch(const SEXP_t *cobj, struct oval_syschar *syschar)
{ {
oval_syschar_collection_flag_t flag; oval_syschar_collection_flag_t flag;
SEXP_t *messages, *msg, *items, *item; SEXP_t *messages, *msg, *items, *item;
struct oval_syschar_model *model; struct oval_syschar_model *model;
_A(cobj != NULL); _A(cobj != NULL);
flag = probe_cobj_get_flag(cobj); flag = probe_cobj_get_flag(cobj);
oval_syschar_set_flag(syschar, flag); oval_syschar_set_flag(syschar, flag);
messages = probe_cobj_get_msgs(cobj); messages = probe_cobj_get_msgs(cobj);
SEXP_list_foreach(msg, messages) { SEXP_list_foreach(msg, messages) {
struct oval_message *omsg; struct oval_message *omsg;
omsg = oval_sexp2msg(msg); omsg = oval_sexp_to_msg(msg);
if (omsg != NULL) if (omsg != NULL)
oval_syschar_add_message(syschar, omsg); oval_syschar_add_message(syschar, omsg);
} }
SEXP_free(messages); SEXP_free(messages);
model = oval_syschar_get_model(syschar); model = oval_syschar_get_model(syschar);
items = probe_cobj_get_items(cobj); items = probe_cobj_get_items(cobj);
SEXP_list_foreach(item, items) { SEXP_list_foreach(item, items) {
struct oval_sysitem *sysitem; struct oval_sysitem *sysitem;
sysitem = oval_sysitem_from_sexp(model, item); sysitem = oval_sexp_to_sysitem(model, item);
if (sysitem != NULL) if (sysitem != NULL)
oval_syschar_add_sysitem(syschar, sysitem); oval_syschar_add_sysitem(syschar, sysitem);
} }
SEXP_free(items); SEXP_free(items);
return 0; return 0;
} }
 End of changes. 53 change blocks. 
119 lines changed or deleted 165 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/