* 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:
		| @@ -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; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user