File fix-segfault-up-stacked-resource.patch of Package drbd-utils.5899

diff -Naur drbd-utils-8.9.6.orig/user/v9/drbdadm.h drbd-utils-8.9.6/user/v9/drbdadm.h
--- drbd-utils-8.9.6.orig/user/v9/drbdadm.h	2016-06-23 18:20:40.608796513 +0800
+++ drbd-utils-8.9.6/user/v9/drbdadm.h	2016-06-23 18:21:18.828684887 +0800
@@ -388,6 +388,7 @@
 extern void global_validate_maybe_expand_die_if_invalid(int expand, enum pp_flags flags);
 extern struct d_option *new_opt(char *name, char *value);
 extern int hostname_in_list(const char *name, struct names *names);
+extern bool hostnames_equal(const char *a, const char *b);
 extern char *_names_to_str(char* buffer, struct names *names);
 extern char *_names_to_str_c(char* buffer, struct names *names, char c);
 #define NAMES_STR_SIZE 255
diff -Naur drbd-utils-8.9.6.orig/user/v9/drbdadm_postparse.c drbd-utils-8.9.6/user/v9/drbdadm_postparse.c
--- drbd-utils-8.9.6.orig/user/v9/drbdadm_postparse.c	2016-06-23 18:20:40.608796513 +0800
+++ drbd-utils-8.9.6/user/v9/drbdadm_postparse.c	2016-06-23 18:21:13.644700061 +0800
@@ -98,6 +98,21 @@
 	}
 }
 
+struct d_host_info *find_host_info_by_fakename(struct d_resource* res, char *name)
+{
+	struct d_host_info *host;
+	char *concat_name;
+
+	for_each_host(host, &res->all_hosts) {
+		concat_name = strdup(names_to_str_c(&host->on_hosts, '_'));
+		if (hostnames_equal(name, concat_name))
+			return host;
+	}
+
+	return NULL;
+}
+
+
 struct d_host_info *find_host_info_by_name(struct d_resource* res, char *name)
 {
 	struct d_host_info *host;
@@ -403,7 +418,11 @@
 			if (conn->peer) {
 				host_info = conn->peer;
 			} else {
-				host_info = find_host_info_by_name(res, candidate->name);
+				if (candidate->faked_hostname) {
+					host_info = find_host_info_by_fakename(res, candidate->name);
+				} else {
+					host_info = find_host_info_by_name(res, candidate->name);
+				}
 				conn->peer = host_info;
 			}
 			path->peer_address = candidate->address.addr ? &candidate->address : &host_info->address;
openSUSE Build Service is sponsored by