1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-22 04:01:57 +03:00

Backport BIND code to query name as TLD.

This commit is contained in:
Ulrich Drepper
2011-05-07 13:05:19 -04:00
parent 47c3cd7a74
commit f87dfb1f11
6 changed files with 30 additions and 10 deletions

View File

@ -1,3 +1,13 @@
2011-05-07 Ulrich Drepper <drepper@gmail.com>
[BZ #12734]
* resolv/resolv.h: Define RES_NOTLDQUERY.
* resolv/res_init.c (res_setoptions): Recognize no_tld_query and
no-tld-query and set RES_NOTLDQUERY.
* resolv/res_debug.c (p_option): Handle RES_NOTLDQUERY.
* resolv/res_query.c (__libc_res_nsearch): Backport changes from
modern BIND to search name as TLD unless forbidden.
2011-05-07 Petr Baudis <pasky@suse.cz> 2011-05-07 Petr Baudis <pasky@suse.cz>
Ulrich Drepper <drepper@gmail.com> Ulrich Drepper <drepper@gmail.com>

2
NEWS
View File

@ -24,7 +24,7 @@ Version 2.14
11724, 12393, 12420, 12445, 12454, 12460, 12469, 12489, 12509, 12510, 11724, 12393, 12420, 12445, 12454, 12460, 12469, 12489, 12509, 12510,
12518, 12583, 12587, 12597, 12631, 12650, 12653, 12655, 12685, 12714, 12518, 12583, 12587, 12597, 12631, 12650, 12653, 12655, 12685, 12714,
12717, 12723 12717, 12723, 12734
Version 2.13 Version 2.13

View File

@ -189,7 +189,7 @@ do_section(const res_state statp,
buf = malloc(buflen += 1024); buf = malloc(buflen += 1024);
if (buf == NULL) { if (buf == NULL) {
fprintf(file, fprintf(file,
";; memory allocation failure\n"); ";; memory allocation failure\n");
return; return;
} }
continue; continue;
@ -356,7 +356,7 @@ const struct res_sym __p_class_syms[] = {
{C_HS, "HESIOD"}, {C_HS, "HESIOD"},
{C_ANY, "ANY"}, {C_ANY, "ANY"},
{C_NONE, "NONE"}, {C_NONE, "NONE"},
{C_IN, (char *)0} {C_IN, (char *)0}
}; };
libresolv_hidden_data_def (__p_class_syms) libresolv_hidden_data_def (__p_class_syms)
@ -588,6 +588,7 @@ p_option(u_long option) {
case RES_USEBSTRING: return "ip6-bytstring"; case RES_USEBSTRING: return "ip6-bytstring";
case RES_USE_EDNS0: return "edns0"; case RES_USE_EDNS0: return "edns0";
case RES_USE_DNSSEC: return "dnssec"; case RES_USE_DNSSEC: return "dnssec";
case RES_NOTLDQUERY: return "no-tld-query";
/* XXX nonreentrant */ /* XXX nonreentrant */
default: sprintf(nbuf, "?0x%lx?", (u_long)option); default: sprintf(nbuf, "?0x%lx?", (u_long)option);
return (nbuf); return (nbuf);

View File

@ -545,6 +545,11 @@ res_setoptions(res_state statp, const char *options, const char *source) {
} else if (!strncmp(cp, "single-request", } else if (!strncmp(cp, "single-request",
sizeof("single-request") - 1)) { sizeof("single-request") - 1)) {
statp->options |= RES_SNGLKUP; statp->options |= RES_SNGLKUP;
} else if (!strncmp(cp, "no_tld_query",
sizeof("no_tld_query") - 1) ||
!strncmp(cp, "no-tld-query",
sizeof("no-tld-query") - 1)) {
statp->options |= RES_NOTLDQUERY;
} else { } else {
/* XXX - print a warning here? */ /* XXX - print a warning here? */
} }

View File

@ -123,7 +123,7 @@ __libc_res_nquery(res_state statp,
{ {
HEADER *hp = (HEADER *) answer; HEADER *hp = (HEADER *) answer;
int n, use_malloc = 0; int n, use_malloc = 0;
u_int oflags = statp->_flags; u_int oflags = statp->_flags;
size_t bufsize = (type == T_UNSPEC ? 2 : 1) * QUERYSIZE; size_t bufsize = (type == T_UNSPEC ? 2 : 1) * QUERYSIZE;
u_char *buf = alloca (bufsize); u_char *buf = alloca (bufsize);
@ -210,7 +210,7 @@ __libc_res_nquery(res_state statp,
if (statp->options & RES_DEBUG) if (statp->options & RES_DEBUG)
printf(";; res_nquery: retry without EDNS0\n"); printf(";; res_nquery: retry without EDNS0\n");
#endif #endif
goto again; goto again;
} }
#ifdef DEBUG #ifdef DEBUG
if (statp->options & RES_DEBUG) if (statp->options & RES_DEBUG)
@ -344,6 +344,7 @@ __libc_res_nsearch(res_state statp,
int trailing_dot, ret, saved_herrno; int trailing_dot, ret, saved_herrno;
int got_nodata = 0, got_servfail = 0, root_on_list = 0; int got_nodata = 0, got_servfail = 0, root_on_list = 0;
int tried_as_is = 0; int tried_as_is = 0;
int searched = 0;
__set_errno (0); __set_errno (0);
RES_SET_H_ERRNO(statp, HOST_NOT_FOUND); /* True if we never query. */ RES_SET_H_ERRNO(statp, HOST_NOT_FOUND); /* True if we never query. */
@ -406,6 +407,7 @@ __libc_res_nsearch(res_state statp,
for (domain = (const char * const *)statp->dnsrch; for (domain = (const char * const *)statp->dnsrch;
*domain && !done; *domain && !done;
domain++) { domain++) {
searched = 1;
if (domain[0][0] == '\0' || if (domain[0][0] == '\0' ||
(domain[0][0] == '.' && domain[0][1] == '\0')) (domain[0][0] == '.' && domain[0][1] == '\0'))
@ -477,11 +479,11 @@ __libc_res_nsearch(res_state statp,
} }
/* /*
* If the name has any dots at all, and no earlier 'as-is' query * f the query has not already been tried as is then try it
* for the name, and "." is not on the search list, then try an as-is * unless RES_NOTLDQUERY is set and there were no dots.
* query now.
*/ */
if (dots && !(tried_as_is || root_on_list)) { if ((dots || !searched || (statp->options & RES_NOTLDQUERY) == 0)
&& !(tried_as_is || root_on_list)) {
ret = __libc_res_nquerydomain(statp, name, NULL, class, type, ret = __libc_res_nquerydomain(statp, name, NULL, class, type,
answer, anslen, answerp, answer, anslen, answerp,
answerp2, nanswerp2, resplen2); answerp2, nanswerp2, resplen2);

View File

@ -102,7 +102,7 @@ typedef res_sendhookact (*res_send_rhook) (const struct sockaddr_in *__ns,
# define RES_MAXTIME 65535 /* Infinity, in milliseconds. */ # define RES_MAXTIME 65535 /* Infinity, in milliseconds. */
struct __res_state { struct __res_state {
int retrans; /* retransmition time interval */ int retrans; /* retransmition time interval */
int retry; /* number of times to retransmit */ int retry; /* number of times to retransmit */
u_long options; /* option flags - see below. */ u_long options; /* option flags - see below. */
int nscount; /* number of name servers */ int nscount; /* number of name servers */
@ -219,6 +219,8 @@ struct res_sym {
#define RES_SNGLKUPREOP 0x00400000 /* -"-, but open new socket for each #define RES_SNGLKUPREOP 0x00400000 /* -"-, but open new socket for each
request */ request */
#define RES_USE_DNSSEC 0x00800000 /* use DNSSEC using OK bit in OPT */ #define RES_USE_DNSSEC 0x00800000 /* use DNSSEC using OK bit in OPT */
#define RES_NOTLDQUERY 0x01000000 /* Do not look up unqualified name
as a TLD. */
#define RES_DEFAULT (RES_RECURSE|RES_DEFNAMES|RES_DNSRCH|RES_NOIP6DOTINT) #define RES_DEFAULT (RES_RECURSE|RES_DEFNAMES|RES_DNSRCH|RES_NOIP6DOTINT)