summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2010-03-08 15:13:04 -0800
committerDavid 'Digit' Turner <digit@google.com>2010-03-08 15:22:13 -0800
commitd378c68d74cb4fdac450650fe816c9d649c8edaf (patch)
tree0d5c15b4606982f26009bdc5c572415ac9dd18d3
parentd7ed1ae98249af8a58ce97784a29f048d77789a9 (diff)
downloadbionic-d378c68d74cb4fdac450650fe816c9d649c8edaf.zip
bionic-d378c68d74cb4fdac450650fe816c9d649c8edaf.tar.gz
bionic-d378c68d74cb4fdac450650fe816c9d649c8edaf.tar.bz2
Fix spurious DNS lookups in the C library.
The problem was that the 'defdname' field of res_state structure was not properly initialized in __res_vinit(). This field is used to store the default domain name, which is normally build from calling gethostname() (see line 549 of res_init.c). Unfortunately, in the typical Android case, gethostname() returns an error (the hostname is configured) and a random stack string is used later to build the DNS search list (see lines 556+ in res_init.c) For the sake of illustration, let's say the search list is set to a random value like 'xWLK'. The end result is that when trying to result an unknown domain name (e.g. 'www.ptn'), the query fails then the resolver tries to make a new query with the DNS search list path(s) appended (e.g. 'www.ptn.xWLK'). The patch simply initializes 'defdname' to an empty string to avoid this when the net.dns.search system property is not set. Also contains whitespace/formatting fixes
-rw-r--r--libc/docs/CHANGES.TXT4
-rw-r--r--libc/netbsd/resolv/res_cache.c2
-rw-r--r--libc/netbsd/resolv/res_init.c6
-rw-r--r--libc/private/arpa_nameser.h8
-rw-r--r--libc/unistd/gethostname.c4
5 files changed, 19 insertions, 5 deletions
diff --git a/libc/docs/CHANGES.TXT b/libc/docs/CHANGES.TXT
index c053714..4f87547 100644
--- a/libc/docs/CHANGES.TXT
+++ b/libc/docs/CHANGES.TXT
@@ -76,6 +76,10 @@ Differences between current and Android 2.1:
- <time.h>: Fix timezone management implementation to properly update
'tm_gmtoff' field in 'struct tm' structure.
+- DNS: get rid of spurious random DNS queries when trying to resolve
+ an unknown domain name. Due to an initialization bug, a random DNS search
+ list was generated for each thread is net.dns.search is not defined.
+
-------------------------------------------------------------------------------
Differences between Android 2.1 and 2.0.1:
diff --git a/libc/netbsd/resolv/res_cache.c b/libc/netbsd/resolv/res_cache.c
index 2c912de..2621a7b 100644
--- a/libc/netbsd/resolv/res_cache.c
+++ b/libc/netbsd/resolv/res_cache.c
@@ -251,7 +251,7 @@ _bprint( char* p, char* end, const char* format, ... )
return p;
va_start(args, format);
- n = snprintf( p, avail, format, args);
+ n = vsnprintf( p, avail, format, args);
va_end(args);
/* certain C libraries return -1 in case of truncation */
diff --git a/libc/netbsd/resolv/res_init.c b/libc/netbsd/resolv/res_init.c
index 751603d..81e570f 100644
--- a/libc/netbsd/resolv/res_init.c
+++ b/libc/netbsd/resolv/res_init.c
@@ -198,6 +198,8 @@ int load_domain_search_list(res_state statp) {
if (pp > statp->dnsrch)
return 1;
}
+ statp->defdname[0] = '\0'; /* no default domain name on Android */
+ statp->dnsrch[0] = NULL;
return 0;
}
#endif
@@ -381,7 +383,7 @@ __res_vinit(res_state statp, int preinit) {
/* Add the domain search list */
havesearch = load_domain_search_list(statp);
-#else /* IGNORE resolv.conf */
+#else /* !ANDROID_CHANGES - IGNORE resolv.conf in Android */
#define MATCH(line, name) \
(!strncmp(line, name, sizeof(name) - 1) && \
(line[sizeof(name) - 1] == ' ' || \
@@ -534,7 +536,7 @@ __res_vinit(res_state statp, int preinit) {
statp->nsort = nsort;
(void) fclose(fp);
}
-#endif /* ANDROID_CHANGES */
+#endif /* !ANDROID_CHANGES */
/*
* Last chance to get a nameserver. This should not normally
* be necessary
diff --git a/libc/private/arpa_nameser.h b/libc/private/arpa_nameser.h
index 2d2a739..438dc04 100644
--- a/libc/private/arpa_nameser.h
+++ b/libc/private/arpa_nameser.h
@@ -566,4 +566,12 @@ __END_DECLS
#include "arpa_nameser_compat.h"
#endif
+#if 0
+# include <logd.h>
+# define XLOG(...) \
+ __libc_android_log_print(ANDROID_LOG_DEBUG,"libc",__VA_ARGS__)
+#else
+#define XLOG(...) do {} while (0)
+#endif
+
#endif /* !_ARPA_NAMESER_H_ */
diff --git a/libc/unistd/gethostname.c b/libc/unistd/gethostname.c
index 369d21e..5d3d7d9 100644
--- a/libc/unistd/gethostname.c
+++ b/libc/unistd/gethostname.c
@@ -41,11 +41,11 @@ int gethostname(char* buff, size_t buflen)
int namelen = strlen(name.nodename);
if ((int)buflen < namelen+1) {
- errno = EINVAL;
+ errno = EINVAL;
result = -1;
} else {
memcpy( buff, name.nodename, namelen+1 );
- }
+ }
}
return result;
}