BUG/MINOR: dns: fix missing lock protection on server.

To avoid inconsistencies server's attributes must be read
or updated under lock.
diff --git a/src/dns.c b/src/dns.c
index a8d468c..c1f3bee 100644
--- a/src/dns.c
+++ b/src/dns.c
@@ -486,6 +486,7 @@
 
 				/* Remove any associated server */
 				for (srv = srvrq->proxy->srv; srv != NULL; srv = srv->next) {
+					SPIN_LOCK(SERVER_LOCK, &srv->lock);
 					if (srv->srvrq == srvrq && srv->svc_port == item->port &&
 					    item->data_len == srv->hostname_dn_len &&
 					    !memcmp(srv->hostname_dn, item->target, item->data_len)) {
@@ -497,6 +498,7 @@
 						srv->hostname_dn_len = 0;
 						dns_unlink_resolution(srv->dns_requester);
 					}
+					SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 				}
 			}
 
@@ -516,6 +518,7 @@
 
 			/* Check if a server already uses that hostname */
 			for (srv = srvrq->proxy->srv; srv != NULL; srv = srv->next) {
+				SPIN_LOCK(SERVER_LOCK, &srv->lock);
 				if (srv->srvrq == srvrq && srv->svc_port == item->port &&
 				    item->data_len == srv->hostname_dn_len &&
 				    !memcmp(srv->hostname_dn, item->target, item->data_len)) {
@@ -525,16 +528,20 @@
 						snprintf(weight, sizeof(weight), "%d", item->weight);
 						server_parse_weight_change_request(srv, weight);
 					}
+					SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 					break;
 				}
+				SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 			}
 			if (srv)
 				continue;
 
 			/* If not, try to find a server with undefined hostname */
 			for (srv = srvrq->proxy->srv; srv != NULL; srv = srv->next) {
+				SPIN_LOCK(SERVER_LOCK, &srv->lock);
 				if (srv->srvrq == srvrq && !srv->hostname_dn)
 					break;
+				SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 			}
 			/* And update this server, if found */
 			if (srv) {
@@ -556,6 +563,7 @@
 					srv->check.port = item->port;
 				snprintf(weight, sizeof(weight), "%d", item->weight);
 				server_parse_weight_change_request(srv, weight);
+				SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 			}
 		}
 	}
@@ -1337,6 +1345,7 @@
 		goto err;
 
 	if (srv) {
+		SPIN_LOCK(SERVER_LOCK, &srv->lock);
 		if (srv->dns_requester == NULL) {
 			if ((req = calloc(1, sizeof(*req))) == NULL)
 				goto err;
@@ -1345,6 +1354,7 @@
 		}
 		else
 			req = srv->dns_requester;
+		SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 	}
 	else if (srvrq) {
 		if (srvrq->dns_requester == NULL) {
diff --git a/src/server.c b/src/server.c
index 37f90d8..555d6da 100644
--- a/src/server.c
+++ b/src/server.c
@@ -3712,8 +3712,14 @@
 	if (!srv)
 		return NULL;
 
+	SPIN_LOCK(SERVER_LOCK, &srv->lock);
+
 	be = srv->proxy;
 	for (tmpsrv = be->srv; tmpsrv; tmpsrv = tmpsrv->next) {
+		/* we found the current server is the same, ignore it */
+		if (srv == tmpsrv)
+			continue;
+
 		/* We want to compare the IP in the record with the IP of the servers in the
 		 * same backend, only if:
 		 *   * DNS resolution is enabled on the server
@@ -3721,15 +3727,20 @@
 		 *     one used for the server found in the backend
 		 *   * the server found in the backend is not our current server
 		 */
+		SPIN_LOCK(SERVER_LOCK, &tmpsrv->lock);
 		if ((tmpsrv->hostname_dn == NULL) ||
 		    (srv->hostname_dn_len != tmpsrv->hostname_dn_len) ||
 		    (strcmp(srv->hostname_dn, tmpsrv->hostname_dn) != 0) ||
-		    (srv->puid == tmpsrv->puid))
+		    (srv->puid == tmpsrv->puid)) {
+			SPIN_UNLOCK(SERVER_LOCK, &tmpsrv->lock);
 			continue;
+		}
 
 		/* If the server has been taken down, don't consider it */
-		if (tmpsrv->next_admin & SRV_ADMF_RMAINT)
+		if (tmpsrv->next_admin & SRV_ADMF_RMAINT) {
+			SPIN_UNLOCK(SERVER_LOCK, &tmpsrv->lock);
 			continue;
+		}
 
 		/* At this point, we have 2 different servers using the same DNS hostname
 		 * for their respective resolution.
@@ -3739,10 +3750,15 @@
 		      memcmp(ip, &((struct sockaddr_in *)&tmpsrv->addr)->sin_addr, 4) == 0) ||
 		     (tmpsrv->addr.ss_family == AF_INET6 &&
 		      memcmp(ip, &((struct sockaddr_in6 *)&tmpsrv->addr)->sin6_addr, 16) == 0))) {
+			SPIN_UNLOCK(SERVER_LOCK, &tmpsrv->lock);
+			SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 			return tmpsrv;
 		}
+		SPIN_UNLOCK(SERVER_LOCK, &tmpsrv->lock);
 	}
 
+	SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
+
 	return NULL;
 }