From 7287e5649b122ec134f58e157e7908e2285dfa42 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Wed, 10 Aug 2016 10:46:47 +0200 Subject: ipcpd: Fix locking problem in local IPCP A lock was not being taken to check the state, but then it was released if the state was not IPCP_NULL, resulting in a segfault. --- src/ipcpd/local/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ipcpd/local/main.c b/src/ipcpd/local/main.c index 99580a45..a6076800 100644 --- a/src/ipcpd/local/main.c +++ b/src/ipcpd/local/main.c @@ -261,14 +261,14 @@ static int ipcp_local_bootstrap(struct dif_config * conf) return -1; } + pthread_rwlock_wrlock(&_ipcp->state_lock); + if (_ipcp->state != IPCP_INIT) { pthread_rwlock_unlock(&_ipcp->state_lock); LOG_ERR("IPCP in wrong state."); return -1; } - pthread_rwlock_wrlock(&_ipcp->state_lock); - _ipcp->state = IPCP_ENROLLED; pthread_create(&_ap_instance->sduloop, -- cgit v1.2.3 From 822dfbd3c41e9815361d1199afc9775b091d7456 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Wed, 10 Aug 2016 11:10:02 +0200 Subject: irmd: Remove IPCP from list upon error If an IPCP crashes (due to a segfault for instance), it is removed from the spawned apis list. However, if it was an IPCP it should also be removed from the IPCPs list, since else on shutdown, the irmd will try to destroy the IPCP that crashed. --- src/irmd/main.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/irmd/main.c b/src/irmd/main.c index 8503fcfa..35208909 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -1337,6 +1337,8 @@ void * irm_flow_cleaner() struct timespec now; struct list_head * pos = NULL; struct list_head * n = NULL; + struct list_head * h = NULL; + struct list_head * t = NULL; struct timespec timeout = {IRMD_CLEANUP_TIMER / BILLION, IRMD_CLEANUP_TIMER % BILLION}; @@ -1415,6 +1417,17 @@ void * irm_flow_cleaner() LOG_INFO("Spawned process %d terminated " "with exit status %d.", api->api, status); + + list_for_each_safe(h, t, &irmd->ipcps) { + struct ipcp_entry * e = + list_entry(h, struct ipcp_entry, + next); + if (e->api == api->api) { + list_del(&e->next); + ipcp_entry_destroy(e); + } + } + list_del(&api->next); free(api); } -- cgit v1.2.3 From 6e854784ebc67af1eb8cdc3209f574e0af5e574d Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Wed, 10 Aug 2016 11:25:45 +0200 Subject: tools: irm: Create IPCP on bootstrap if unexisting If the admin tries to bootstrap an IPCP that does not yet exist, it will first create the IPCP, then bootstrap it since it has all required information. --- src/tools/irm/irm_ipcp_bootstrap.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/tools/irm/irm_ipcp_bootstrap.c b/src/tools/irm/irm_ipcp_bootstrap.c index d5fa97da..34c5d223 100644 --- a/src/tools/irm/irm_ipcp_bootstrap.c +++ b/src/tools/irm/irm_ipcp_bootstrap.c @@ -184,12 +184,17 @@ int do_bootstrap_ipcp(int argc, char ** argv) } len = irm_list_ipcps(name, &apis); - if (len <= 0) - return -1; + if (len <= 0) { + if (!irm_create_ipcp(name, conf.type)) + return -1; + len = irm_list_ipcps(name, &apis); + } for (i = 0; i < len; i++) if (irm_bootstrap_ipcp(apis[i], &conf)) return -1; + free(apis); + return 0; } -- cgit v1.2.3