* cygwin.din: Export gethostbyname2.

* net.cc: define _CYGWIN_IN_H and include resolv.h.
	(realloc_ent): New function.
	(dup_ent): Call realloc_ent.
	(memcpy4to6): New function.
	(dn_length1): New function.
	(gethostby_helper): New function.
	(gethostbyname2): New function.
	* posix.sgml: Add gethostbyname2.
	* include/cygwin/version.h: Bump API minor number.
	* libc/minires.c (get_options): Look for "inet6" and apply bounds
	to "retry" and "retrans".
	(res_ninit): Set the default options at the beginning.
	(dn_expand): Fix "off by one".
This commit is contained in:
Corinna Vinschen
2009-03-06 16:31:26 +00:00
parent 45e20e47ba
commit 6f57cb4a52
6 changed files with 384 additions and 24 deletions

View File

@ -1,6 +1,6 @@
/* minires.c. Stub synchronous resolver for Cygwin.
Copyright 2006, 2008 Red Hat, Inc.
Copyright 2006, 2008, 2009 Red Hat, Inc.
Written by Pierre A. Humblet <Pierre.Humblet@ieee.org>
@ -99,6 +99,11 @@ static void get_options(res_state statp, int i, char **words)
DPRINTF(statp->options & RES_DEBUG, "%s: 1\n", words[i]);
continue;
}
if (!strcasecmp("inet6", words[i])) {
statp->options |= RES_USE_INET6;
DPRINTF(statp->options & RES_DEBUG, "%s: 1\n", words[i]);
continue;
}
if (!strcasecmp("osquery", words[i])) {
statp->use_os = 1;
DPRINTF(statp->options & RES_DEBUG, "%s: 1\n", words[i]);
@ -114,16 +119,22 @@ static void get_options(res_state statp, int i, char **words)
continue;
}
*/
if (!strcasecmp("retry", words[i])) {
if (!strcasecmp("retry", words[i])
|| !strcasecmp("attempts", words[i])) {
if (value < 1)
value = 1;
else if (value > RES_MAXRETRY)
value = RES_MAXRETRY;
statp->retry = value;
DPRINTF(statp->options & RES_DEBUG, "%s: %d\n", words[i], value);
continue;
}
if (!strcasecmp("retrans", words[i])) {
if (!strcasecmp("retrans", words[i])
|| !strcasecmp("timeout", words[i])) {
if (value < 1)
value = 1;
else if (value > RES_MAXRETRANS)
value = RES_MAXRETRANS;
statp->retrans = value;
DPRINTF(statp->options & RES_DEBUG, "%s: %d\n", words[i], value);
continue;
@ -270,6 +281,9 @@ int res_ninit(res_state statp)
int i;
statp->res_h_errno = NETDB_SUCCESS;
/* Only debug may be set before calling init */
statp->options &= RES_DEBUG;
statp->options |= RES_INIT | RES_DEFAULT;
statp->nscount = 0;
statp->os_query = NULL;
statp->retrans = RES_TIMEOUT; /* timeout in seconds */
@ -299,9 +313,6 @@ int res_ninit(res_state statp)
statp->nsaddr_list[i].sin_port = htons(NAMESERVER_PORT);
bzero(statp->nsaddr_list[i].sin_zero, sizeof(statp->nsaddr_list[i].sin_zero));
}
/* Only debug may be set before calling init */
statp->options &= RES_DEBUG;
statp->options |= RES_INIT | RES_DEFAULT;
return 0;
}
@ -806,7 +817,7 @@ int dn_expand(const unsigned char *msg, const unsigned char *eomorig,
exp_dn++;
else do {
if (len <= MAXLABEL) {
if ((length -= (len + 1)) > 0 /* Need space for final . */
if ((length -= (len + 1)) >= 0 /* Need space for final . */
&& comp_dn + len <= eomorig) {
do { *exp_dn++ = *comp_dn++; } while (--len != 0);
*exp_dn++ = '.';
@ -836,7 +847,6 @@ expand_fail:
return -1;
}
/*****************************************************************
*
dn_comp
@ -926,8 +936,7 @@ int dn_comp(const char * exp_dn, u_char * comp_dn, int length,
}
/*****************************************************************
*
dn_skipname
* dn_skipname
Measures the compressed domain name length and returns it.
*****************************************************************/
@ -949,3 +958,38 @@ int dn_skipname(const unsigned char *comp_dn, const unsigned char *eom)
return comp_dn - comp_dn_orig;
}
/*****************************************************************
* dn_length1 For internal use
Return length of uncompressesed name incl final 0.
*****************************************************************/
int dn_length1(const unsigned char *msg, const unsigned char *eomorig,
const unsigned char *comp_dn)
{
unsigned int len, length = 0;
errno = EINVAL;
if (comp_dn >= eomorig)
goto expand_fail;
else while ((len = *comp_dn++) != 0) {
if (len <= MAXLABEL) {
if ((comp_dn += len) <= eomorig)
length += len + 1;
else
goto expand_fail;
}
else if (len >= (128+64)) {
comp_dn = msg + (((len & ~(128+64)) << 8) + *comp_dn);
if (comp_dn >= eomorig)
goto expand_fail;
}
else
goto expand_fail;
}
return length;
expand_fail:
return -1;
}