Hello,

I have found a bug in resolv.c in conjunction with the function res_init:
res_init sets __ res_sync to res_sync_func and then calls __res_vinit.
        -> __res_vinit calls __ open_nameservers.
        In __open_nameservers __nameserver and __nameservers are set by the 
contents of resolv.conf. So far so good.
                -> __open_nameserver calls res_sync_func
                In res_sync_func__nameservers is set to rp->nscount, what is 0.
Backin _res_vinit rp->nscount is set to __nameservers then, what is 0. So the 
cat bites its own tail.

Attached is a simple patch, that fixes the problemby setting __res_sync after 
calling __res_vinit.

Before this patch with busybox "nslookup www.google.de" ->

nslookup: can not resolve '(null)': Name or service not known

Name: www.google.de
Address 1: 2a00: 1450:4016:800 :: 101f muc03s01-in-x1f.1e100.net
Address 2: 173.194.35.151 muc03s01-in-f23.1e100.net
Address 3: 173.194.35.159 muc03s01-in-f31.1e100.net
Address 4: 173.194.35.152 muc03s01-in-f24.1e100.net

After the patch "nslookup www.google.de" ->

nslookup www.google.de
Server: 8.8.8.8
Address 1: 8.8.8.8 google-public-dns-a.google.com

Name: www.google.de
Address 1: 2a00: 1450:4016:803 :: 1018 muc03s08-in-x18.1e100.net
Address 2: 173.194.44.56 muc03s08-in-f24.1e100.net
Address 3: 173.194.44.55 muc03s08-in-f23.1e100.net
Address 4: 173.194.44.63 muc03s08-in-f31.1e100.net

This patch ist tested with buildroot-02.13.

Regards, Markus


-- Unsere Aussagen koennen Irrtuemer und Missverstaendnisse enthalten.
Bitte pruefen Sie die Aussagen fuer Ihren Fall, bevor Sie Entscheidungen auf Grundlage dieser Aussagen treffen.
Wiesemann & Theis GmbH, Porschestr. 12, D-42279 Wuppertal
Geschaeftsfuehrer: Dipl.-Ing. Ruediger Theis
Registergericht: Amtsgericht Wuppertal, HRB 6377 Tel. +49-202/2680-0, Fax +49-202/2680-265, http://www.wut.de
Autor: Markus Königshaus <[email protected]>
--- uClibc-0.9.33.2.org/libc/inet/resolv.c	2012-05-15 09:20:09.000000000 +0200
+++ uClibc-0.9.33.2/libc/inet/resolv.c	2013-03-28 11:52:55.000000000 +0100
@@ -3653,12 +3653,18 @@
 	 */
 	if (!_res.id)
 		_res.id = res_randomid();
-	__res_sync = res_sync_func;
+	__res_sync = NULL;
 
 	__UCLIBC_MUTEX_UNLOCK(__resolv_lock);
 
 	__res_vinit(&_res, 1);
 
+	__UCLIBC_MUTEX_LOCK(__resolv_lock);
+	
+	__res_sync = res_sync_func;
+	
+	__UCLIBC_MUTEX_UNLOCK(__resolv_lock);	
+
 	return 0;
 }
 libc_hidden_def(res_init)

_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to