From a770296c7aa15057602a4e4f5c7744ccfc65b8aa Mon Sep 17 00:00:00 2001
From: Sander Vrijders <sander.vrijders@ugent.be>
Date: Wed, 30 Aug 2017 13:29:18 +0200
Subject: ipcpd: Add check if name was already registered

This adds a check in the shims if a name was already registered, since
it should not return an error.
---
 src/ipcpd/local/main.c        |  9 +--------
 src/ipcpd/shim-data.c         | 17 +++++++++++++++--
 src/ipcpd/shim-data.h         |  2 +-
 src/ipcpd/shim-eth-llc/main.c | 11 +----------
 src/ipcpd/shim-udp/main.c     | 12 ++----------
 5 files changed, 20 insertions(+), 31 deletions(-)

(limited to 'src')

diff --git a/src/ipcpd/local/main.c b/src/ipcpd/local/main.c
index aab82d25..fb4e312b 100644
--- a/src/ipcpd/local/main.c
+++ b/src/ipcpd/local/main.c
@@ -150,16 +150,9 @@ static int ipcp_local_bootstrap(const struct ipcp_config * conf)
 
 static int ipcp_local_reg(const uint8_t * hash)
 {
-        uint8_t * hash_dup = ipcp_hash_dup(hash);
-        if (hash_dup == NULL) {
-                log_err("Failed to duplicate hash.");
-                return -ENOMEM;
-        }
-
-        if (shim_data_reg_add_entry(local_data.shim_data, hash_dup)) {
+        if (shim_data_reg_add_entry(local_data.shim_data, hash)) {
                 log_dbg("Failed to add " HASH_FMT " to local registry.",
                         HASH_VAL(hash));
-                free(hash_dup);
                 return -1;
         }
 
diff --git a/src/ipcpd/shim-data.c b/src/ipcpd/shim-data.c
index 355cec68..2d6585b5 100644
--- a/src/ipcpd/shim-data.c
+++ b/src/ipcpd/shim-data.c
@@ -24,6 +24,10 @@
 
 #include "config.h"
 
+#define OUROBOROS_PREFIX "shim-data"
+
+#include <ouroboros/endian.h>
+#include <ouroboros/logs.h>
 #include <ouroboros/list.h>
 #include <ouroboros/time_utils.h>
 #include <ouroboros/errno.h>
@@ -260,9 +264,10 @@ static struct dir_entry * find_dir_entry_any(struct shim_data * data,
 }
 
 int shim_data_reg_add_entry(struct shim_data * data,
-                            uint8_t *          hash)
+                            const uint8_t *    hash)
 {
         struct reg_entry * entry;
+        uint8_t *          hash_dup;
 
         assert(data);
         assert(hash);
@@ -270,11 +275,19 @@ int shim_data_reg_add_entry(struct shim_data * data,
         pthread_rwlock_wrlock(&data->reg_lock);
 
         if (find_reg_entry_by_hash(data, hash)) {
+                pthread_rwlock_unlock(&data->reg_lock);
+                log_dbg(HASH_FMT " was already in the directory.",
+                        HASH_VAL(hash));
+                return 0;
+        }
+
+        hash_dup = ipcp_hash_dup(hash);
+        if (hash_dup == NULL) {
                 pthread_rwlock_unlock(&data->reg_lock);
                 return -1;
         }
 
-        entry = reg_entry_create(hash);
+        entry = reg_entry_create(hash_dup);
         if (entry == NULL) {
                 pthread_rwlock_unlock(&data->reg_lock);
                 return -1;
diff --git a/src/ipcpd/shim-data.h b/src/ipcpd/shim-data.h
index 6380eea7..cd3ff16e 100644
--- a/src/ipcpd/shim-data.h
+++ b/src/ipcpd/shim-data.h
@@ -63,7 +63,7 @@ struct shim_data * shim_data_create(void);
 void               shim_data_destroy(struct shim_data * data);
 
 int                shim_data_reg_add_entry(struct shim_data * data,
-                                           uint8_t *          hash);
+                                           const uint8_t *    hash);
 
 int                shim_data_reg_del_entry(struct shim_data * data,
                                            const uint8_t *    hash);
diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c
index 292ecbe7..be29c585 100644
--- a/src/ipcpd/shim-eth-llc/main.c
+++ b/src/ipcpd/shim-eth-llc/main.c
@@ -993,18 +993,9 @@ static int eth_llc_ipcp_bootstrap(const struct ipcp_config * conf)
 
 static int eth_llc_ipcp_reg(const uint8_t * hash)
 {
-        uint8_t * hash_dup;
-
-        hash_dup = ipcp_hash_dup(hash);
-        if (hash_dup == NULL) {
-                log_err("Failed to duplicate hash.");
-                return -ENOMEM;
-        }
-
-        if (shim_data_reg_add_entry(eth_llc_data.shim_data, hash_dup)) {
+        if (shim_data_reg_add_entry(eth_llc_data.shim_data, hash)) {
                 log_err("Failed to add " HASH_FMT " to local registry.",
                         HASH_VAL(hash));
-                free(hash_dup);
                 return -1;
         }
 
diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c
index a94472b2..a64c39c4 100644
--- a/src/ipcpd/shim-udp/main.c
+++ b/src/ipcpd/shim-udp/main.c
@@ -765,22 +765,14 @@ static int ipcp_udp_reg(const uint8_t * hash)
         uint32_t ip_addr;
 #endif
         char hashstr[ipcp_dir_hash_strlen() + 1];
-        uint8_t * hash_dup;
 
         assert(hash);
 
         ipcp_hash_str(hashstr, hash);
 
-        hash_dup = ipcp_hash_dup(hash);
-        if (hash_dup == NULL) {
-                log_err("Failed to duplicate hash.");
-                return -ENOMEM;
-        }
-
-        if (shim_data_reg_add_entry(udp_data.shim_data, hash_dup)) {
+        if (shim_data_reg_add_entry(udp_data.shim_data, hash)) {
                 log_err("Failed to add " HASH_FMT " to local registry.",
                         HASH_VAL(hash));
-                free(hash_dup);
                 return -1;
         }
 
@@ -806,7 +798,7 @@ static int ipcp_udp_reg(const uint8_t * hash)
                         dnsstr, hashstr, DNS_TTL, ipstr);
 
                 if (ddns_send(cmd)) {
-                        shim_data_reg_del_entry(udp_data.shim_data, hash_dup);
+                        shim_data_reg_del_entry(udp_data.shim_data, hash);
                         return -1;
                 }
         }
-- 
cgit v1.2.3