From 15b0a9229431dc75425c229b2f94e680db49d594 Mon Sep 17 00:00:00 2001 From: "Ondrej Zajicek (work)" Date: Tue, 23 Jul 2019 01:52:18 +0200 Subject: RPKI: Fix reconfiguration when ssh parameters are undefined --- lib/printf_test.c | 14 ++++++++++++++ lib/string.h | 9 +++++++++ proto/bgp/bgp.c | 6 ++---- proto/rpki/rpki.c | 6 +++--- sysdep/unix/log.c | 3 +-- 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) -- cgit v1.2.3