summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2019-07-23 01:52:18 +0200
committerOndrej Zajicek (work) <santiago@crfreenet.org>2019-07-23 01:52:18 +0200
commit15b0a9229431dc75425c229b2f94e680db49d594 (patch)
tree3928d3d261fd993096bd8c85edd58399870ecee7
parentd843c274781bf9d30bfba93229b9f02a88f26fe2 (diff)
RPKI: Fix reconfiguration when ssh parameters are undefined
-rw-r--r--lib/printf_test.c14
-rw-r--r--lib/string.h9
-rw-r--r--proto/bgp/bgp.c6
-rw-r--r--proto/rpki/rpki.c6
-rw-r--r--sysdep/unix/log.c3
5 files changed, 29 insertions, 9 deletions
diff --git a/lib/printf_test.c b/lib/printf_test.c
index 10d284ac..341fde9c 100644
--- a/lib/printf_test.c
+++ b/lib/printf_test.c
@@ -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();
}
diff --git a/lib/string.h b/lib/string.h
index 0d34f9c5..bd4fd2a0 100644
--- a/lib/string.h
+++ b/lib/string.h
@@ -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
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index 98e66c67..309d2231 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -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 ? */
diff --git a/proto/rpki/rpki.c b/proto/rpki/rpki.c
index 36097dc5..70cd0cdd 100644
--- a/proto/rpki/rpki.c
+++ b/proto/rpki/rpki.c
@@ -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;
diff --git a/sysdep/unix/log.c b/sysdep/unix/log.c
index 9d107709..45f442e7 100644
--- a/sysdep/unix/log.c
+++ b/sysdep/unix/log.c
@@ -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)