static void report_finding(struct result_info *res, llist *l, probe_ctx *ctx) { SEXP_t *item; SEXP_t se_lport_mem, se_rport_mem, se_lfull_mem, se_ffull_mem, *se_uid_mem = NULL; lnode *n = NULL; if (l) { n = list_get_cur(l); } if (n) { item = probe_item_create(OVAL_LINUX_INET_LISTENING_SERVER, NULL, "protocol", OVAL_DATATYPE_STRING, res->proto, "local_address", OVAL_DATATYPE_STRING, res->laddr, "local_port", OVAL_DATATYPE_SEXP, SEXP_number_newu_64_r(&se_lport_mem, res->lport), "local_full_address", OVAL_DATATYPE_SEXP, SEXP_string_newf_r(&se_lfull_mem, "%s:%u", res->laddr, res->lport), "program_name", OVAL_DATATYPE_STRING, n->cmd, "foreign_address", OVAL_DATATYPE_STRING, res->raddr, "foreign_port", OVAL_DATATYPE_SEXP, SEXP_number_newu_64_r(&se_rport_mem, res->rport), "foreign_full_address", OVAL_DATATYPE_SEXP, SEXP_string_newf_r(&se_ffull_mem, "%s:%u", res->raddr, res->rport), "pid", OVAL_DATATYPE_INTEGER, (int64_t)n->pid, "user_id", OVAL_DATATYPE_SEXP, se_uid_mem = SEXP_number_newu_64(n->uid), NULL); } else { item = probe_item_create(OVAL_LINUX_INET_LISTENING_SERVER, NULL, "protocol", OVAL_DATATYPE_STRING, res->proto, "local_address", OVAL_DATATYPE_STRING, res->laddr, "local_port", OVAL_DATATYPE_SEXP, SEXP_number_newu_64_r(&se_lport_mem, res->lport), "local_full_address", OVAL_DATATYPE_SEXP, SEXP_string_newf_r(&se_lfull_mem, "%s:%u", res->laddr, res->lport), "foreign_address", OVAL_DATATYPE_STRING, res->raddr, "foreign_port", OVAL_DATATYPE_SEXP, SEXP_number_newu_64_r(&se_rport_mem, res->rport), "foreign_full_address", OVAL_DATATYPE_SEXP, SEXP_string_newf_r(&se_ffull_mem, "%s:%u", res->raddr, res->rport), NULL); } probe_item_collect(ctx, item); SEXP_free_r(&se_lport_mem); SEXP_free_r(&se_rport_mem); SEXP_free_r(&se_lfull_mem); SEXP_free_r(&se_ffull_mem); SEXP_free(se_uid_mem); }
/* temporary workaround to generate ids */ static void _gen_item_id(SEXP_t *item) { static uint32_t id = 0; SEXP_t sid, *name_ref, *tmp; SEXP_string_newf_r(&sid, "1%05u%u", getpid(), ++id); name_ref = SEXP_listref_first(item); tmp = SEXP_list_replace(name_ref, 3, &sid); SEXP_vfree(name_ref, tmp, NULL); SEXP_free_r(&sid); }
static void probe_icache_item_setID(SEXP_t *item, SEXP_ID_t item_ID) { SEXP_t *name_ref, *prev_id; SEXP_t uniq_id; uint32_t local_id; /* ((foo_item :id "<int>") ... ) */ assume_d(item != NULL, /* void */); assume_d(SEXP_listp(item), /* void */); #if defined(HAVE_ATOMIC_FUNCTIONS) local_id = __sync_fetch_and_add(&next_ID, 1); #else if (pthread_mutex_lock(&next_ID_mutex) != 0) { dE("Can't lock the next_ID_mutex: %u, %s", errno, strerror(errno)); abort(); } local_id = ++next_ID; if (pthread_mutex_unlock(&next_ID_mutex) != 0) { dE("Can't unlock the next_ID_mutex: %u, %s", errno, strerror(errno)); abort(); } #endif SEXP_string_newf_r(&uniq_id, "1%05u%u", getpid(), local_id); name_ref = SEXP_listref_first(item); prev_id = SEXP_list_replace(name_ref, 3, &uniq_id); SEXP_free(prev_id); SEXP_free_r(&uniq_id); SEXP_free(name_ref); return; }