[uClibc] resolv.c doesn't try all search domains

Jan Lana Jan.Lana at Sun.COM
Thu Dec 2 11:36:39 UTC 2004


I'm sorry, resolv.c has more problems. There is a better patch.

regards,
- jenda

On Thu, Dec 02, 2004 at 11:39:39AM +0100, Jan Lana wrote:
> Hi,
> 
> uClibc resolver doesn't lookup all search domains.
> For example, if you have computer 'jenda.prague.my.cz' and resolv.conf:
> search my.cz
> nameserver xx.xx.xx.xx
> 
> try this:
> ping jenda.prague.my.cz 	#works
> ping jenda.prague		#unknown host
> 
> libc/inet/resolv.c doesn't want to try search domains if the domain name
> contains '.'. I don't find any reason for the behaviour in literature
> and it is inconsistent with the glibc.
> 
> Patch is attached.
> 
> regards,
> - jenda

> diff -ur uClibc.orig/libc/inet/resolv.c uClibc/libc/inet/resolv.c
> --- uClibc.orig/libc/inet/resolv.c	2004-09-07 12:34:35.000000000 +0200
> +++ uClibc/libc/inet/resolv.c	2004-12-02 12:00:06.000000000 +0100
> @@ -717,7 +717,7 @@
>  
>  		strncpy(lookup,name,MAXDNAME);
>  		BIGLOCK;
> -		if (variant < __searchdomains && strchr(lookup, '.') == NULL)
> +		if (variant < __searchdomains)
>  		{
>  		    strncat(lookup,".", MAXDNAME);
>  		    strncat(lookup,__searchdomain[variant], MAXDNAME);
> @@ -884,7 +884,7 @@
>  		    sdomains=__searchdomains;
>  		    BIGUNLOCK;
>  
> -		    if (variant < ((sdomains - 1) && strchr(lookup, '.') == NULL)) {
> +		    if (variant < sdomains - 1) {
>  			/* next search */
>  			variant++;
>  		    } else {

> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://uclibc.org/mailman/listinfo/uclibc

-------------- next part --------------
diff -ur uClibc.orig/libc/inet/resolv.c uClibc/libc/inet/resolv.c
--- uClibc.orig/libc/inet/resolv.c	2004-09-07 12:34:35.000000000 +0200
+++ uClibc/libc/inet/resolv.c	2004-12-02 13:21:14.000000000 +0100
@@ -672,7 +672,7 @@
 	int retries = 0;
 	unsigned char * packet = malloc(PACKETSZ);
 	char *dns, *lookup = malloc(MAXDNAME);
-	int variant = 0;
+	int variant = -1;
 	struct sockaddr_in sa;
 #ifdef __UCLIBC_HAS_IPV6__
 	int v6;
@@ -716,13 +716,14 @@
 			goto fail;
 
 		strncpy(lookup,name,MAXDNAME);
-		BIGLOCK;
-		if (variant < __searchdomains && strchr(lookup, '.') == NULL)
-		{
-		    strncat(lookup,".", MAXDNAME);
-		    strncat(lookup,__searchdomain[variant], MAXDNAME);
-		}
-		BIGUNLOCK;
+		if (variant >= 0) {
+                        BIGLOCK;
+                        if (variant < __searchdomains) {
+                                strncat(lookup,".", MAXDNAME);
+                                strncat(lookup,__searchdomain[variant], MAXDNAME);
+                        }
+                        BIGUNLOCK;
+                }
 		DPRINTF("lookup name: %s\n", lookup);
 		q.dotted = (char *)lookup;
 		q.qtype = type;
@@ -866,7 +867,7 @@
 		/* if there are other nameservers, give them a go,
 		   otherwise return with error */
 		{
-		    variant = 0;
+		    variant = -1;
                     LOCK;
                     ns = (ns + 1) % nscount;
                     if (ns == 0)
@@ -884,7 +885,7 @@
 		    sdomains=__searchdomains;
 		    BIGUNLOCK;
 
-		    if (variant < ((sdomains - 1) && strchr(lookup, '.') == NULL)) {
+		    if (variant < sdomains - 1) {
 			/* next search */
 			variant++;
 		    } else {
@@ -895,7 +896,7 @@
                           retries++;
 
 			UNLOCK;
-			variant = 0;
+			variant = -1;
 		    }
 		}
 	}


More information about the uClibc mailing list