void __SEXP_free_r (SEXP_t *s_exp, const char *file, uint32_t line, const char *func) #endif { #if !defined(NDEBUG) && defined(SEAP_VERBOSE_DEBUG) dI("s_exp=%p (%s:%u:%s)", s_exp, file, line, func); #endif if (s_exp == NULL) return; if (!SEXP_softrefp(s_exp) && SEXP_typeof(s_exp) != SEXP_TYPE_EMPTY) { SEXP_val_t v_dsc; SEXP_VALIDATE(s_exp); SEXP_val_dsc (&v_dsc, s_exp->s_valp); if (SEXP_rawval_decref (s_exp->s_valp)) { switch (v_dsc.type) { case SEXP_VALTYPE_STRING: oscap_aligned_free(v_dsc.hdr); break; case SEXP_VALTYPE_NUMBER: oscap_aligned_free(v_dsc.hdr); break; case SEXP_VALTYPE_LIST: if (SEXP_LCASTP(v_dsc.mem)->b_addr != NULL) SEXP_rawval_lblk_free ((uintptr_t)SEXP_LCASTP(v_dsc.mem)->b_addr, SEXP_free_r); oscap_aligned_free(v_dsc.hdr); break; default: abort (); } } } #if !defined(NDEBUG) || defined(VALIDATE_SEXP) s_exp->s_valp = 0; s_exp->s_type = NULL; s_exp->__magic0 = SEXP_MAGIC0_INV; s_exp->__magic1 = SEXP_MAGIC1_INV; #endif return; }
static oval_result_t probe_ent_cmp(SEXP_t * ent, SEXP_t * val2) { oval_operation_t op; oval_datatype_t dtype; SEXP_t *stmp, *val1, *vals, *res_lst, *r0; int val_cnt, is_var; oval_check_t ochk; oval_result_t ores, result; ores = OVAL_RESULT_ERROR; result = OVAL_RESULT_ERROR; vals = NULL; val_cnt = probe_ent_getvals(ent, &vals); if (probe_ent_attrexists(ent, "var_ref")) { is_var = 1; } else { if (val_cnt != 1) { SEXP_free(vals); return OVAL_RESULT_ERROR; } is_var = 0; } dtype = probe_ent_getdatatype(ent); stmp = probe_ent_getattrval(ent, "operation"); if (stmp == NULL) op = OVAL_OPERATION_EQUALS; else op = SEXP_number_geti_32(stmp); SEXP_free(stmp); res_lst = SEXP_list_new(NULL); SEXP_list_foreach(val1, vals) { if (SEXP_typeof(val1) != SEXP_typeof(val2)) { dI("Types of values to compare don't match: val1: %d, val2: %d\n", SEXP_typeof(val1), SEXP_typeof(val2)); SEXP_free(vals); SEXP_free(val1); SEXP_free(res_lst); return OVAL_RESULT_ERROR; } ores = probe_ent_cmp_single(val1, dtype, val2, op); SEXP_list_add(res_lst, r0 = SEXP_number_newi_32(ores)); SEXP_free(r0); } if (is_var) { stmp = probe_ent_getattrval(ent, "var_check"); if (stmp == NULL) { ochk = OVAL_CHECK_ALL; } else { ochk = SEXP_number_geti_32(stmp); SEXP_free(stmp); } result = probe_ent_result_bychk(res_lst, ochk); } else { result = ores; } SEXP_free(res_lst); SEXP_free(vals); return result; }