* net.cc (cygwin_getaddrinfo): Check ai_flags for valid values.
Handle AI_NUMERICSERV. Handle AI_ADDRCONFIG behaviour on Vista. * include/netdb.h (AI_NUMERICSERV): Add missing flag.
This commit is contained in:
		| @@ -1,3 +1,9 @@ | |||||||
|  | 2007-01-31  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
|  | 	* net.cc (cygwin_getaddrinfo): Check ai_flags for valid values. | ||||||
|  | 	Handle AI_NUMERICSERV.  Handle AI_ADDRCONFIG behaviour on Vista. | ||||||
|  | 	* include/netdb.h (AI_NUMERICSERV): Add missing flag. | ||||||
|  |  | ||||||
| 2007-01-30  Corinna Vinschen  <corinna@vinschen.de> | 2007-01-30  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
| 	* fhandler_disk_file.cc (fhandler_disk_file::closedir): Add dir name | 	* fhandler_disk_file.cc (fhandler_disk_file::closedir): Add dir name | ||||||
|   | |||||||
| @@ -147,6 +147,7 @@ extern __declspec(dllimport) int h_errno; | |||||||
| #define AI_PASSIVE      1 | #define AI_PASSIVE      1 | ||||||
| #define AI_CANONNAME    2 | #define AI_CANONNAME    2 | ||||||
| #define AI_NUMERICHOST  4 | #define AI_NUMERICHOST  4 | ||||||
|  | #define AI_NUMERICSERV  8 | ||||||
| /* Only available since Vista. Ignored on older systems. */ | /* Only available since Vista. Ignored on older systems. */ | ||||||
| #define AI_ALL          256 | #define AI_ALL          256 | ||||||
| #define AI_ADDRCONFIG   1024 | #define AI_ADDRCONFIG   1024 | ||||||
|   | |||||||
| @@ -3875,9 +3875,42 @@ cygwin_getaddrinfo (const char *hostname, const char *servname, | |||||||
|   myfault efault; |   myfault efault; | ||||||
|   if (efault.faulted (EFAULT)) |   if (efault.faulted (EFAULT)) | ||||||
|     return EAI_SYSTEM; |     return EAI_SYSTEM; | ||||||
|  |   /* Both subsequent getaddrinfo implementations let all possible values | ||||||
|  |      in ai_flags slip through and just ignore unknowen values.  So we have | ||||||
|  |      to check manually here. */ | ||||||
|  |   if (hints && (hints->ai_flags | ||||||
|  |   		& ~(AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_ALL | ||||||
|  | 		    | AI_NUMERICSERV | AI_ADDRCONFIG | AI_V4MAPPED))) | ||||||
|  |     return EAI_BADFLAGS; | ||||||
|  |   /* AI_NUMERICSERV is not supported in our replacement getaddrinfo, nor | ||||||
|  |      is it supported by Winsock prior to Vista.  We just check the servname | ||||||
|  |      parameter by ourselves here. */ | ||||||
|  |   if (hints && (hints->ai_flags & AI_NUMERICSERV)) | ||||||
|  |     { | ||||||
|  |       char *p; | ||||||
|  |       if (servname && *servname && (strtoul (servname, &p, 10), *p)) | ||||||
|  | 	return EAI_NONAME; | ||||||
|  |     } | ||||||
|   load_ipv6 (); |   load_ipv6 (); | ||||||
|   if (getaddrinfo) |   if (getaddrinfo) | ||||||
|  |     { | ||||||
|  |       struct addrinfo nhints; | ||||||
|  |  | ||||||
|  |       /* AI_ADDRCONFIG is not supported prior to Vista.  Rather it's | ||||||
|  | 	 the default and only possible setting. | ||||||
|  | 	 On Vista, the default behaviour is as if AI_ADDRCONFIG is set, | ||||||
|  | 	 apparently for performance reasons.  To get the POSIX default | ||||||
|  | 	 behaviour, the AI_ALL flag has to be set. */ | ||||||
|  |       if (wincap.has_gaa_on_link_prefix () | ||||||
|  | 	  && hints && (hints->ai_flags & AI_ADDRCONFIG) | ||||||
|  | 	  && hints->ai_family == PF_UNSPEC) | ||||||
|  |         { | ||||||
|  | 	  nhints = *hints; | ||||||
|  | 	  hints = &nhints; | ||||||
|  | 	  nhints.ai_flags |= AI_ALL; | ||||||
|  | 	} | ||||||
|       return w32_to_gai_err (getaddrinfo (hostname, servname, hints, res)); |       return w32_to_gai_err (getaddrinfo (hostname, servname, hints, res)); | ||||||
|  |     } | ||||||
|   return ipv4_getaddrinfo (hostname, servname, hints, res); |   return ipv4_getaddrinfo (hostname, servname, hints, res); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user