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

Reply via email to