From 406cf2d7a347222ef0526d1db0d3cb191c287656 Mon Sep 17 00:00:00 2001
From: dimitri staessens <dimitri.staessens@ugent.be>
Date: Wed, 22 Feb 2017 23:53:04 +0100
Subject: irmd: Check IPCP type before bootstrap

This prevents assertion failures in the IPCP in some cases. IPCPs can
now safely assert the type.
---
 src/irmd/main.c | 7 +++++++
 1 file changed, 7 insertions(+)

(limited to 'src/irmd')

diff --git a/src/irmd/main.c b/src/irmd/main.c
index 7f20faf4..d49193d3 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -397,6 +397,13 @@ static int bootstrap_ipcp(pid_t              api,
                 return -1;
         }
 
+        if (entry->type != (enum ipcp_type) conf->ipcp_type) {
+                pthread_rwlock_unlock(&irmd->reg_lock);
+                pthread_rwlock_unlock(&irmd->state_lock);
+                log_err("Configuration does not match IPCP type.");
+                return -1;
+        }
+
         if (ipcp_bootstrap(entry->api, conf)) {
                 pthread_rwlock_unlock(&irmd->reg_lock);
                 pthread_rwlock_unlock(&irmd->state_lock);
-- 
cgit v1.2.3


From 3c43bb7b6f56f709a2098955726fdc8d4baa75f4 Mon Sep 17 00:00:00 2001
From: dimitri staessens <dimitri.staessens@ugent.be>
Date: Thu, 23 Feb 2017 00:24:08 +0100
Subject: irmd: Check IPCP name when creating an IPCP

---
 src/irmd/main.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

(limited to 'src/irmd')

diff --git a/src/irmd/main.c b/src/irmd/main.c
index d49193d3..f6328979 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -181,6 +181,19 @@ static struct ipcp_entry * get_ipcp_entry_by_api(pid_t api)
         return NULL;
 }
 
+static struct ipcp_entry * get_ipcp_entry_by_name(const char * name)
+{
+        struct list_head * p = NULL;
+
+        list_for_each(p, &irmd->ipcps) {
+                struct ipcp_entry * e = list_entry(p, struct ipcp_entry, next);
+                if (strcmp(name, e->name))
+                        return e;
+        }
+
+        return NULL;
+}
+
 /* Check if the name exists anywhere in a DIF. */
 static pid_t get_ipcp_by_dst_name(char * dst_name)
 {
@@ -228,9 +241,10 @@ static pid_t get_ipcp_by_dst_name(char * dst_name)
 static pid_t create_ipcp(char *         name,
                          enum ipcp_type ipcp_type)
 {
-        struct pid_el *      api = NULL;
-        struct ipcp_entry *  tmp = NULL;
-        struct list_head *   p   = NULL;
+        struct pid_el *     api   = NULL;
+        struct ipcp_entry * tmp   = NULL;
+        struct list_head *  p     = NULL;
+        struct ipcp_entry * entry = NULL;
 
         api = malloc(sizeof(*api));
         if (api == NULL)
@@ -245,6 +259,14 @@ static pid_t create_ipcp(char *         name,
 
         pthread_rwlock_wrlock(&irmd->reg_lock);
 
+        entry = get_ipcp_entry_by_name(name);
+        if (entry != NULL) {
+                pthread_rwlock_unlock(&irmd->reg_lock);
+                pthread_rwlock_unlock(&irmd->state_lock);
+                log_err("IPCP by that name already exists.");
+                return -1;
+        }
+
         api->pid = ipcp_create(name, ipcp_type);
         if (api->pid == -1) {
                 pthread_rwlock_unlock(&irmd->reg_lock);
-- 
cgit v1.2.3