Zero element array behavior is very different from normal array or pointer. This behavior is root of problem in not returning correctly filled array of addresses. This appeared only in rrp mode, where more then one address is returned.
All memcpy's are now correctly converted to copy pointer to char. Signed-off-by: Jan Friesse <[email protected]> --- lib/cfg.c | 9 ++++++--- lib/libcfg.verso | 2 +- services/cfg.c | 6 ++++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/cfg.c b/lib/cfg.c index 054dc43..a3aee9c 100644 --- a/lib/cfg.c +++ b/lib/cfg.c @@ -651,6 +651,7 @@ cs_error_t corosync_cfg_get_node_addrs ( int i; struct iovec iov; void *return_address; + const char *addr_buf; error = hdb_error_to_cs(hdb_handle_get (&cfg_hdb, cfg_handle, (void *)&cfg_instance)); @@ -681,7 +682,9 @@ cs_error_t corosync_cfg_get_node_addrs ( if (res_lib_cfg_get_node_addrs->family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); - for (i=0; i<max_addrs && i<res_lib_cfg_get_node_addrs->num_addrs; i++) { + for (i = 0, addr_buf = (char *)res_lib_cfg_get_node_addrs->addrs; + i < max_addrs && i<res_lib_cfg_get_node_addrs->num_addrs; + i++, addr_buf += TOTEMIP_ADDRLEN) { struct sockaddr_in *in; struct sockaddr_in6 *in6; @@ -690,12 +693,12 @@ cs_error_t corosync_cfg_get_node_addrs ( if (res_lib_cfg_get_node_addrs->family == AF_INET) { in = (struct sockaddr_in *)addrs[i].address; in->sin_family = AF_INET; - memcpy(&in->sin_addr, &res_lib_cfg_get_node_addrs->addrs[i][0], sizeof(struct in_addr)); + memcpy(&in->sin_addr, addr_buf, sizeof(struct in_addr)); } if (res_lib_cfg_get_node_addrs->family == AF_INET6) { in6 = (struct sockaddr_in6 *)addrs[i].address; in6->sin6_family = AF_INET6; - memcpy(&in6->sin6_addr, &res_lib_cfg_get_node_addrs->addrs[i][0], sizeof(struct in6_addr)); + memcpy(&in6->sin6_addr, addr_buf, sizeof(struct in6_addr)); } } *num_addrs = res_lib_cfg_get_node_addrs->num_addrs; diff --git a/lib/libcfg.verso b/lib/libcfg.verso index fcdb2e1..1454f6e 100644 --- a/lib/libcfg.verso +++ b/lib/libcfg.verso @@ -1 +1 @@ -4.0.0 +4.0.1 diff --git a/services/cfg.c b/services/cfg.c index bd6e92f..950f2e9 100644 --- a/services/cfg.c +++ b/services/cfg.c @@ -1039,6 +1039,7 @@ static void message_handler_req_lib_cfg_get_node_addrs (void *conn, const struct req_lib_cfg_get_node_addrs *req_lib_cfg_get_node_addrs = msg; struct res_lib_cfg_get_node_addrs *res_lib_cfg_get_node_addrs = (struct res_lib_cfg_get_node_addrs *)buf; unsigned int nodeid = req_lib_cfg_get_node_addrs->nodeid; + char *addr_buf; if (nodeid == 0) nodeid = api->totem_nodeid_get(); @@ -1051,8 +1052,9 @@ static void message_handler_req_lib_cfg_get_node_addrs (void *conn, res_lib_cfg_get_node_addrs->num_addrs = num_interfaces; if (num_interfaces) { res_lib_cfg_get_node_addrs->family = node_ifs[0].family; - for (i = 0; i<num_interfaces; i++) { - memcpy(&res_lib_cfg_get_node_addrs->addrs[i][0], node_ifs[i].addr, TOTEMIP_ADDRLEN); + for (i = 0, addr_buf = (char *)res_lib_cfg_get_node_addrs->addrs; + i < num_interfaces; i++, addr_buf += TOTEMIP_ADDRLEN) { + memcpy(addr_buf, node_ifs[i].addr, TOTEMIP_ADDRLEN); } } else { -- 1.6.2.5 _______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
