|  | @@ -598,7 +598,7 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip,
 | 
	
		
			
				|  |  |  	struct resolv_question q;
 | 
	
		
			
				|  |  |  	int retries = 0;
 | 
	
		
			
				|  |  |  	unsigned char * packet = malloc(PACKETSZ);
 | 
	
		
			
				|  |  | -	char * lookup = malloc(MAXDNAME);
 | 
	
		
			
				|  |  | +	char *dns, *lookup = malloc(MAXDNAME);
 | 
	
		
			
				|  |  |  	int variant = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	fd = -1;
 | 
	
	
		
			
				|  | @@ -610,6 +610,7 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	LOCK;
 | 
	
		
			
				|  |  |  	ns %= nscount;
 | 
	
		
			
				|  |  | +	UNLOCK;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	while (retries++ < MAX_RETRIES) {
 | 
	
		
			
				|  |  |  		if (fd != -1)
 | 
	
	
		
			
				|  | @@ -618,7 +619,13 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip,
 | 
	
		
			
				|  |  |  		memset(packet, 0, PACKETSZ);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		memset(&h, 0, sizeof(h));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		/* Mess with globals while under lock */
 | 
	
		
			
				|  |  | +		LOCK;
 | 
	
		
			
				|  |  |  		h.id = ++id;
 | 
	
		
			
				|  |  | +		dns = nsip[ns];
 | 
	
		
			
				|  |  | +		UNLOCK;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  		h.qdcount = 1;
 | 
	
		
			
				|  |  |  		h.rd = 1;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -646,9 +653,9 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip,
 | 
	
		
			
				|  |  |  		len = i + j;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		DPRINTF("On try %d, sending query to port %d of machine %s\n",
 | 
	
		
			
				|  |  | -				retries, NAMESERVER_PORT, nsip[ns]);
 | 
	
		
			
				|  |  | +				retries, NAMESERVER_PORT, dns);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		fd = __connect_dns(nsip[ns]);
 | 
	
		
			
				|  |  | +		fd = __connect_dns(dns);
 | 
	
		
			
				|  |  |  		if (fd < 0) {
 | 
	
		
			
				|  |  |  			if (errno == ENETUNREACH) {
 | 
	
		
			
				|  |  |  				/* routing error, presume not transient */
 | 
	
	
		
			
				|  | @@ -684,9 +691,14 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		DPRINTF("id = %d, qr = %d\n", h.id, h.qr);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		if ((h.id != id) || (!h.qr))
 | 
	
		
			
				|  |  | +		LOCK;
 | 
	
		
			
				|  |  | +		if ((h.id != id) || (!h.qr)) {
 | 
	
		
			
				|  |  | +			UNLOCK;
 | 
	
		
			
				|  |  |  			/* unsolicited */
 | 
	
		
			
				|  |  |  			goto again;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		UNLOCK;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		DPRINTF("Got response %s\n", "(i think)!");
 | 
	
		
			
				|  |  |  		DPRINTF("qrcount=%d,ancount=%d,nscount=%d,arcount=%d\n",
 | 
	
	
		
			
				|  | @@ -738,7 +750,6 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip,
 | 
	
		
			
				|  |  |  		else
 | 
	
		
			
				|  |  |  			free(packet);
 | 
	
		
			
				|  |  |  		free(lookup);
 | 
	
		
			
				|  |  | -		UNLOCK;
 | 
	
		
			
				|  |  |  		return (0);				/* success! */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	  tryall:
 | 
	
	
		
			
				|  | @@ -755,13 +766,14 @@ int __dns_lookup(const char *name, int type, int nscount, char **nsip,
 | 
	
		
			
				|  |  |  		    variant++;
 | 
	
		
			
				|  |  |  		} else {
 | 
	
		
			
				|  |  |  		    /* next server, first search */
 | 
	
		
			
				|  |  | +		    LOCK;
 | 
	
		
			
				|  |  |  		    ns = (ns + 1) % nscount;
 | 
	
		
			
				|  |  | +		    UNLOCK;
 | 
	
		
			
				|  |  |  		    variant = 0;
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  fail:
 | 
	
		
			
				|  |  | -	UNLOCK;
 | 
	
		
			
				|  |  |  	if (fd != -1)
 | 
	
		
			
				|  |  |  	    close(fd);
 | 
	
		
			
				|  |  |  	if (lookup)
 | 
	
	
		
			
				|  | @@ -774,6 +786,7 @@ fail:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #ifdef L_opennameservers
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#warning fixme -- __nameserver, __nameservers, __searchdomain, and __searchdomains need locking
 | 
	
		
			
				|  |  |  int __nameservers;
 | 
	
		
			
				|  |  |  char * __nameserver[MAX_SERVERS];
 | 
	
		
			
				|  |  |  int __searchdomains;
 |