If we are not in the range 224.0.0.0 -> 239.255.255.255 then exit with a configuration error. (mcastaddr is not a correct multicast address.)
-Angus Signed-off-by: Angus Salkeld <asalk...@redhat.com> --- exec/totemconfig.c | 4 ++++ exec/totemip.c | 18 ++++++++++++++++++ include/corosync/totem/totemip.h | 1 + 3 files changed, 23 insertions(+), 0 deletions(-) diff --git a/exec/totemconfig.c b/exec/totemconfig.c index 381cf4f..ad1b116 100644 --- a/exec/totemconfig.c +++ b/exec/totemconfig.c @@ -453,6 +453,10 @@ int totem_config_validate ( error_reason = "Not all bind address belong to the same IP family"; goto parse_error; } + if (totemip_is_mcast (&totem_config->interfaces[i].mcast_addr) != 0) { + error_reason = "mcastaddr is not a correct multicast address."; + goto parse_error; + } } } diff --git a/exec/totemip.c b/exec/totemip.c index f6613e8..d6bb34a 100644 --- a/exec/totemip.c +++ b/exec/totemip.c @@ -123,6 +123,24 @@ void totemip_copy_endian_convert(struct totem_ip_address *addr1, memcpy(addr1->addr, addr2->addr, TOTEMIP_ADDRLEN); } +/* + * Multicast address range is 224.0.0.0 to 239.255.255.255 this + * translates to the first 4 bits == 1110 (0xE). + * http://en.wikipedia.org/wiki/Multicast_address + */ +int32_t totemip_is_mcast(struct totem_ip_address *ip_addr) +{ + uint32_t addr = 0; + + if (ip_addr->family == AF_INET) { + addr = ntohl(*(int32_t*)ip_addr->addr); + if ((addr >> 28) != 0xE) { + return -1; + } + } + return 0; +} + /* For sorting etc. params are void * for qsort's benefit */ int totemip_compare(const void *a, const void *b) { diff --git a/include/corosync/totem/totemip.h b/include/corosync/totem/totemip.h index 9f45b5f..e7f1d18 100644 --- a/include/corosync/totem/totemip.h +++ b/include/corosync/totem/totemip.h @@ -68,6 +68,7 @@ struct totem_ip_address extern int totemip_equal(const struct totem_ip_address *addr1, const struct totem_ip_address *addr2); extern int totemip_compare(const void *a, const void *b); +extern int totemip_is_mcast(struct totem_ip_address *addr); extern void totemip_copy(struct totem_ip_address *addr1, const struct totem_ip_address *addr2); extern void totemip_copy_endian_convert(struct totem_ip_address *addr1, -- 1.7.2.2 _______________________________________________ Openais mailing list Openais@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/openais