Reviewed-by: Steven Dake <[email protected]> On 03/22/2011 09:37 AM, Jan Friesse wrote: > 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 {
_______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
