From 49fb847ff3dc8b7de91eb3a54524e60b145f9bf4 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sat, 4 Feb 2017 20:08:02 +0100 Subject: irmd: Handle death of IPCP gracefully If an IPCP SEGVs abruptly, the sanitizer in the IRMd would also cause a SEGV because of looping over a registry linked list inside another safe loop over the same list. A function is added to the registry to avoid this. --- src/irmd/main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/irmd/main.c') diff --git a/src/irmd/main.c b/src/irmd/main.c index 02ffb21b..98e79aa8 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -985,9 +985,9 @@ static struct irm_flow * flow_accept(pid_t api, char ** dst_ae_name, e = api_table_get(&irmd->api_table, api); if (e == NULL) { - LOG_DBG("Process gone while accepting flow."); pthread_rwlock_unlock(&irmd->reg_lock); pthread_rwlock_unlock(&irmd->state_lock); + LOG_DBG("Process gone while accepting flow."); return NULL; } @@ -1000,6 +1000,7 @@ static struct irm_flow * flow_accept(pid_t api, char ** dst_ae_name, if (reg_entry_get_state(re) != REG_NAME_FLOW_ARRIVED) { pthread_rwlock_unlock(&irmd->reg_lock); pthread_rwlock_unlock(&irmd->state_lock); + LOG_ERR("Entry in wrong state."); return NULL; } pthread_rwlock_unlock(&irmd->reg_lock); @@ -1671,7 +1672,7 @@ void * irm_sanitize(void * o) continue; LOG_DBG("Dead AP-I removed from: %d %s.", a->pid, e->name); - reg_entry_del_api(e, a->pid); + reg_entry_del_pid_el(e, a); } } -- cgit v1.2.3