Просмотр исходного кода

cfg_get_node_addrs: Return correct addresses

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@redhat.com>
Reviewed-by: Steven Dake <sdake@redhat.com>
Jan Friesse 15 лет назад
Родитель
Сommit
033f7ced10
3 измененных файлов с 11 добавлено и 6 удалено
  1. 6 3
      lib/cfg.c
  2. 1 1
      lib/libcfg.verso
  3. 4 2
      services/cfg.c

+ 6 - 3
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;

+ 1 - 1
lib/libcfg.verso

@@ -1 +1 @@
-4.0.0
+4.0.1

+ 4 - 2
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 {