[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