[Openais] [PATCH 1/3] cfg_get_node_addrs: Return correct addresses

Steven Dake sdake at redhat.com
Tue Mar 22 10:18:07 PDT 2011


Reviewed-by: Steven Dake <sdake at redhat.com>

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 <jfriesse at redhat.com>
> ---
>  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 {



More information about the Openais mailing list