summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorIngo van Lil <inguin@gmx.de>2010-07-28 14:52:08 +0200
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2010-07-28 15:36:03 +0200
commit05ef2d67dcfca516e49e133d9f7e3c62feed2358 (patch)
tree69d4592030fa83b8ae992a51c777fe97738cc379 /libc
parentcafbb2a0a0ac469393dc3192ba67ffbe1ddb5d4e (diff)
Immediately try next nameserver on recv() failure
If there is a problem communicating with a nameserver the __dns_lookup() function will not immediately advance to the next nameserver but instead continue waiting until the timeout expires. This will cause a 30 second delay even if no nameserver is configured in resolv.conf and no DNS is running on localhost. Signed-off-by: Ingo van Lil <inguin@gmx.de> Acked-by: Roman I Khimov <khimov@altell.ru> Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Diffstat (limited to 'libc')
-rw-r--r--libc/inet/resolv.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c
index 320aec4f5..6a9b80791 100644
--- a/libc/inet/resolv.c
+++ b/libc/inet/resolv.c
@@ -1432,9 +1432,11 @@ int attribute_hidden __dns_lookup(const char *name,
if (packet_len < HFIXEDSZ) {
/* too short!
+ * If the peer did shutdown then retry later,
+ * try next peer on error.
* it's just a bogus packet from somewhere */
bogus_packet:
- if (reply_timeout)
+ if (packet_len >= 0 && reply_timeout)
goto wait_again;
goto try_next_server;
}