1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-07-06 15:53:12 +02:00

- Applied patch from slePP for bug #0001252: if IPv6 was enabled then in some cases names

were not properly resolved. Original bug reported by kormat.
This commit is contained in:
Bram Matthys
2004-07-22 21:12:42 +00:00
parent 7aad095b33
commit c665636045
2 changed files with 70 additions and 11 deletions
+2
View File
@@ -286,3 +286,5 @@
- Added a missing error message for ModuleGetErrorStr. Additionally added error checking to
ensure NULL is returned when an invalid error code is specified (#0001986) reported by
AngryWolf.
- Applied patch from slePP for bug #0001252: if IPv6 was enabled then in some cases names
were not properly resolved. Original bug reported by kormat.
+68 -11
View File
@@ -51,6 +51,9 @@ static ResRQ *last, *first;
static void rem_cache(aCache *);
static void rem_request(ResRQ *);
static int do_query_name(Link *, char *, ResRQ *);
/* revquery is used when looking up IP -> name -> IP to differentiate between
* IPv6 and IPv4, to make the proper request type --slePP */
static int do_revquery_name(Link *, char *, ResRQ *, int is_ipv6_address);
static int do_query_number(Link *, struct IN_ADDR *, ResRQ *);
static void resend_query(ResRQ *);
static int proc_answer(ResRQ *, HEADER *, char *, char *);
@@ -412,6 +415,20 @@ struct hostent *gethost_byname(char *name, Link *lp)
return NULL;
}
/* This is identical to gethost_byname, except it includes is_ipv6_address
* See do_revquery_name() */
struct hostent *gethost_byname_revquery(char *name, Link *lp, int is_ipv6_address)
{
aCache *cp;
reinfo.re_na_look++;
if ((cp = find_cache_name(name)))
return (struct hostent *)&(cp->he);
if (!lp)
return NULL;
(void)do_revquery_name(lp, name, NULL, is_ipv6_address);
return NULL;
}
struct hostent *gethost_byaddr(char *addr, Link *lp)
{
aCache *cp;
@@ -427,18 +444,14 @@ struct hostent *gethost_byaddr(char *addr, Link *lp)
static int do_query_name(Link *lp, char *name, ResRQ *rptr)
{
char hname[HOSTLEN + 1];
int len;
char hname[HOSTLEN + 1];
strncpyzt(hname, name, sizeof(hname));
len = strlen(hname);
strlcpy(hname, name, sizeof(hname));
if (rptr && !index(hname, '.') && ircd_res.options & RES_DEFNAMES)
{
(void)strncat(hname, dot, sizeof(hname) - len - 1);
len++;
(void)strncat(hname, ircd_res.defdname,
sizeof(hname) - len - 1);
strlcat(hname, dot, sizeof(hname));
strlcat(hname, ircd_res.defdname, sizeof(hname));
}
/*
@@ -453,8 +466,7 @@ static int do_query_name(Link *lp, char *name, ResRQ *rptr)
#else
rptr->type = T_A;
#endif
rptr->name = (char *)MyMalloc(strlen(name) + 1);
(void)strcpy(rptr->name, name);
rptr->name = strdup(name);
}
Debug((DEBUG_DNS, "do_query_name(): %s ", hname));
#ifdef INET6
@@ -464,6 +476,45 @@ static int do_query_name(Link *lp, char *name, ResRQ *rptr)
#endif
}
/* If is_ipv6_address is set, look for AAAA records, if not,
* go looking for A records. This fixes a bug when talking to
* servers that do not provide any non-authoritative information
* to an ANY query (ie. dnscache). --slePP */
static int do_revquery_name(Link *lp, char *name, ResRQ *rptr, int is_ipv6_address)
{
char hname[HOSTLEN + 1];
Debug((DEBUG_DNS, "do_revquery_name: looking for %s", (is_ipv6_address?"IPv6":"IPv4")));
strncpyzt(hname, name, sizeof(hname));
if (rptr && !index(hname, '.') && ircd_res.options & RES_DEFNAMES)
{
strlcat(hname, dot, sizeof(hname));
strlcat(hname, ircd_res.defdname, sizeof(hname));
}
/*
* Store the name passed as the one to lookup and generate other host
* names to pass onto the nameserver(s) for lookups.
*/
if (!rptr)
{
rptr = make_request(lp);
if(is_ipv6_address)
rptr->type = T_AAAA;
else
rptr->type = T_A;
rptr->name = strdup(name);
}
Debug((DEBUG_DNS, "do_revquery_name(): %s ", hname));
if(is_ipv6_address)
return (query_name(hname, C_IN, T_AAAA, rptr));
else
return (query_name(hname, C_IN, T_A, rptr));
}
/*
* Use this to do reverse IP# lookups.
*/
@@ -554,6 +605,7 @@ static int query_name(char *name, int class, int type, ResRQ *rptr)
return r;
}
hptr = (HEADER *) buf;
hptr->rd = 1;
do
{
hptr->id = htons(getrandom16());
@@ -900,6 +952,7 @@ struct hostent *get_res(char *lp)
if (a > 0 && rptr->type == T_PTR)
{
struct hostent *hp2 = NULL;
int is_ipv6_address = 0;
if (BadPtr(rptr->he.h_name)) /* Kludge! 960907/Vesa */
goto getres_err;
@@ -913,7 +966,11 @@ struct hostent *get_res(char *lp)
* type we automatically gain the use of the cache with no
* extra kludges.
*/
if ((hp2 = gethost_byname(rptr->he.h_name, &rptr->cinfo)))
/* We add this IPv6 check to query for T_AAAA or T_A respectively.
* djbdns/dnscache doesn't return A or AAAA to a T_ANY (as it should)
* --slePP */
is_ipv6_address = (strchr(Inet_ia2p((struct IN_ADDR *)&rptr->he.h_addr), ':') != NULL);
if ((hp2 = gethost_byname_revquery(rptr->he.h_name, &rptr->cinfo, is_ipv6_address)))
if (lp)
bcopy((char *)&rptr->cinfo, lp, sizeof(Link));
/*