summaryrefslogtreecommitdiff
path: root/src/irmd/main.c
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@intec.ugent.be>2017-02-04 20:08:02 +0100
committerdimitri staessens <dimitri.staessens@intec.ugent.be>2017-02-04 20:11:27 +0100
commit49fb847ff3dc8b7de91eb3a54524e60b145f9bf4 (patch)
tree96e97ca4e3c4dbeb83bf2851cdc41442e7f0720d /src/irmd/main.c
parent9301dcbc95c95a82eba9e831f49253dcad73abb2 (diff)
downloadouroboros-49fb847ff3dc8b7de91eb3a54524e60b145f9bf4.tar.gz
ouroboros-49fb847ff3dc8b7de91eb3a54524e60b145f9bf4.zip
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.
Diffstat (limited to 'src/irmd/main.c')
-rw-r--r--src/irmd/main.c5
1 files changed, 3 insertions, 2 deletions
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);
}
}