diff --git a/keepalived/check/check_data.c b/keepalived/check/check_data.c index 9e5fa4ec88..58396cf9a6 100644 --- a/keepalived/check/check_data.c +++ b/keepalived/check/check_data.c @@ -1070,15 +1070,30 @@ check_check_script_security(void) bool validate_check_config(void) { - virtual_server_t *vs, *vs_tmp; + virtual_server_t *vs, *vs_tmp, *vs1; virtual_server_group_entry_t *vsge; real_server_t *rs, *rs_tmp, *rs1; checker_t *checker; unsigned weight_sum; - bool rs_removed; + bool vs_removed, rs_removed; using_ha_suspend = false; list_for_each_entry_safe(vs, vs_tmp, &check_data->vs, e_list) { + /* Check the virual server is not a duplicate of any vs earlier in the list */ + vs_removed = false; + list_for_each_entry(vs1, &check_data->vs, e_list) { + if (vs == vs1) + break; + if (vs_iseq(vs, vs1)) { + report_config_error(CONFIG_GENERAL_ERROR, "Virtual server %s is duplicated - removing second vs and all its related rs and checker entities.", FMT_VS(vs)); + free_vs(vs); + vs_removed = true; + break; + } + } + if (vs_removed) + continue; + /* Ensure that ha_suspend is not set for any virtual server using fwmarks */ if (vs->ha_suspend && (vs->vfwmark || (vs->vsg && !list_empty(&vs->vsg->vfwmark)))) { diff --git a/keepalived/check/ipwrapper.c b/keepalived/check/ipwrapper.c index b5337bfacd..e350c666cc 100644 --- a/keepalived/check/ipwrapper.c +++ b/keepalived/check/ipwrapper.c @@ -42,7 +42,7 @@ #include "check_data.h" #endif -static bool __attribute((pure)) +bool __attribute((pure)) vs_iseq(const virtual_server_t *vs_a, const virtual_server_t *vs_b) { if (!vs_a->vsgname != !vs_b->vsgname) diff --git a/keepalived/include/ipwrapper.h b/keepalived/include/ipwrapper.h index fcc32f5a58..58a82011ef 100644 --- a/keepalived/include/ipwrapper.h +++ b/keepalived/include/ipwrapper.h @@ -48,6 +48,7 @@ rs_iseq(const real_server_t *rs_a, const real_server_t *rs_b) { return sockstorage_equal(&rs_a->addr, &rs_b->addr); } +extern bool __attribute__((pure)) vs_iseq(const virtual_server_t *, const virtual_server_t *); /* prototypes */ extern void update_svr_wgt(int64_t, virtual_server_t *, real_server_t *, bool);