]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
RPKI: Fix reconfiguration when ssh parameters are undefined
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Mon, 22 Jul 2019 23:52:18 +0000 (01:52 +0200)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Mon, 22 Jul 2019 23:52:18 +0000 (01:52 +0200)
lib/printf_test.c
lib/string.h
proto/bgp/bgp.c
proto/rpki/rpki.c
sysdep/unix/log.c

index 10d284acb514acc1cd611e1c873aa915e94e826f..341fde9cfbc3efa2e62eb72b0c9776a6d5faf8e7 100644 (file)
@@ -89,6 +89,19 @@ t_time(void)
   return 1;
 }
 
+static int
+t_bstrcmp(void)
+{
+  bt_assert(bstrcmp("aa", "aa") == 0);
+  bt_assert(bstrcmp("aa", "bb") == -1);
+  bt_assert(bstrcmp("bb", "aa") == 1);
+  bt_assert(bstrcmp(NULL, NULL) == 0);
+  bt_assert(bstrcmp(NULL, "bb") == -1);
+  bt_assert(bstrcmp("bb", NULL) == 1);
+
+  return 1;
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -97,6 +110,7 @@ main(int argc, char *argv[])
   bt_test_suite(t_simple, "printf without varargs");
   bt_test_suite(t_router_id, "print router id");
   bt_test_suite(t_time, "print time");
+  bt_test_suite(t_bstrcmp, "bstrcmp");
 
   return bt_exit_value();
 }
index 0d34f9c5769aa2b6c1bcd5c67f91048af8f64ee0..bd4fd2a02d8a1290a442495790f9c1132f7be6c2 100644 (file)
@@ -60,6 +60,15 @@ memset32(void *D, u32 val, uint n)
     dst[i] = val;
 }
 
+static inline int
+bstrcmp(const char *s1, const char *s2)
+{
+  if (s1 && s2)
+    return strcmp(s1, s2);
+  else
+    return !s2 - !s1;
+}
+
 #define ROUTER_ID_64_LENGTH 23
 
 #endif
index 98e66c67421efe620fa12e07ab88e6aaf5706259..309d223103c79f1d3c0b103c8409a553850b47ec 100644 (file)
@@ -2011,12 +2011,10 @@ bgp_reconfigure(struct proto *P, struct proto_config *CF)
                     ((byte *) new) + sizeof(struct proto_config),
                     // password item is last and must be checked separately
                     OFFSETOF(struct bgp_config, password) - sizeof(struct proto_config))
-    && ((!old->password && !new->password)
-       || (old->password && new->password && !strcmp(old->password, new->password)))
+    && !bstrcmp(old->password, new->password)
     && ((!old->remote_range && !new->remote_range)
        || (old->remote_range && new->remote_range && net_equal(old->remote_range, new->remote_range)))
-    && ((!old->dynamic_name && !new->dynamic_name)
-       || (old->dynamic_name && new->dynamic_name && !strcmp(old->dynamic_name, new->dynamic_name)))
+    && !bstrcmp(old->dynamic_name, new->dynamic_name)
     && (old->dynamic_name_digits == new->dynamic_name_digits);
 
   /* FIXME: Move channel reconfiguration to generic protocol code ? */
index 36097dc515fa7ac295c2fec40dbeea23fecc5caf..70cd0cdd1060bec03851466abc9e213a36022661 100644 (file)
@@ -687,9 +687,9 @@ rpki_reconfigure_cache(struct rpki_proto *p UNUSED, struct rpki_cache *cache, st
   {
     struct rpki_tr_ssh_config *ssh_old = (void *) old->tr_config.spec;
     struct rpki_tr_ssh_config *ssh_new = (void *) new->tr_config.spec;
-    if ((strcmp(ssh_old->bird_private_key, ssh_new->bird_private_key) != 0) ||
-       (strcmp(ssh_old->cache_public_key, ssh_new->cache_public_key) != 0) ||
-       (strcmp(ssh_old->user, ssh_new->user) != 0))
+    if (bstrcmp(ssh_old->bird_private_key, ssh_new->bird_private_key) ||
+       bstrcmp(ssh_old->cache_public_key, ssh_new->cache_public_key) ||
+       bstrcmp(ssh_old->user, ssh_new->user))
     {
       CACHE_TRACE(D_EVENTS, cache, "Settings of SSH transport configuration changed");
       try_fast_reconnect = 1;
index 9d1077094a684cf9d7c489d110d494493a5018df..45f442e709c79735694dbd1cd60d9cf331c49367 100644 (file)
@@ -387,8 +387,7 @@ log_switch(int initial, list *logs, char *new_syslog_name)
   current_log_list = logs;
 
 #ifdef HAVE_SYSLOG_H
-  if (current_syslog_name && new_syslog_name &&
-      !strcmp(current_syslog_name, new_syslog_name))
+  if (!bstrcmp(current_syslog_name, new_syslog_name))
     return;
 
   if (current_syslog_name)