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
This commit is contained in:
David 'Digit' Turner 2010-03-08 15:13:04 -08:00
parent d7ed1ae982
commit d378c68d74
5 changed files with 19 additions and 5 deletions

View File

@ -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:

View File

@ -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 */

View File

@ -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

View File

@ -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_ */

View File

@ -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;
}