diff options
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/inet/getaddrinfo.c | 56 | 
1 files changed, 26 insertions, 30 deletions
diff --git a/libc/inet/getaddrinfo.c b/libc/inet/getaddrinfo.c index 3af422b72..0fe3fdf22 100644 --- a/libc/inet/getaddrinfo.c +++ b/libc/inet/getaddrinfo.c @@ -191,9 +191,6 @@ static unsigned __check_pf(void)  			if (runp->ifa_addr->sa_family == PF_INET)  				seen |= SEEN_IPV4;  #endif /* __UCLIBC_HAS_IPV4__ */ -#if defined __UCLIBC_HAS_IPV4__ && defined __UCLIBC_HAS_IPV6__ -			else /* can't be both at once */ -#endif /* __UCLIBC_HAS_IPV4__ && defined __UCLIBC_HAS_IPV6__ */  #if defined __UCLIBC_HAS_IPV6__  			if (runp->ifa_addr->sa_family == PF_INET6)  				seen |= SEEN_IPV6; @@ -249,12 +246,13 @@ static int addrconfig(sa_family_t af)  /* Using Unix sockets this way is a security risk.  */  static int  gaih_local(const char *name, const struct gaih_service *service, -	    const struct addrinfo *req, struct addrinfo **pai) +		const struct addrinfo *req, struct addrinfo **pai)  {  	struct utsname utsname; +	struct addrinfo *ai = *pai;  	if ((name != NULL) && (req->ai_flags & AI_NUMERICHOST)) -		return GAIH_OKIFUNSPEC | -EAI_NONAME; +		return (GAIH_OKIFUNSPEC | -EAI_NONAME);  	if ((name != NULL) || (req->ai_flags & AI_CANONNAME))  		if (uname(&utsname) < 0) @@ -285,29 +283,28 @@ gaih_local(const char *name, const struct gaih_service *service,  			}  		} -		*pai = malloc(sizeof(struct addrinfo) + sizeof(struct sockaddr_un) -			+ ((req->ai_flags & AI_CANONNAME) -			    ? (strlen(utsname.nodename) + 1): 0)); -		if (*pai == NULL) +		*pai = ai = malloc(sizeof(struct addrinfo) + sizeof(struct sockaddr_un) +				+ ((req->ai_flags & AI_CANONNAME) +				? (strlen(utsname.nodename) + 1) : 0)); +		if (ai == NULL)  			return -EAI_MEMORY; -		(*pai)->ai_next = NULL; -		(*pai)->ai_flags = req->ai_flags; -		(*pai)->ai_family = AF_LOCAL; -		(*pai)->ai_socktype = req->ai_socktype ? req->ai_socktype : SOCK_STREAM; -		(*pai)->ai_protocol = req->ai_protocol; -		(*pai)->ai_addrlen = sizeof(struct sockaddr_un); -		(*pai)->ai_addr = (void *)(*pai) + sizeof(struct addrinfo); - +		ai->ai_next = NULL; +		ai->ai_flags = req->ai_flags; +		ai->ai_family = AF_LOCAL; +		ai->ai_socktype = req->ai_socktype ? req->ai_socktype : SOCK_STREAM; +		ai->ai_protocol = req->ai_protocol; +		ai->ai_addrlen = sizeof(struct sockaddr_un); +		ai->ai_addr = (void *)ai + sizeof(struct addrinfo);  #if SALEN -		((struct sockaddr_un *)(*pai)->ai_addr)->sun_len = sizeof(struct sockaddr_un); +		((struct sockaddr_un *)ai->ai_addr)->sun_len = sizeof(struct sockaddr_un);  #endif /* SALEN */ -		((struct sockaddr_un *)(*pai)->ai_addr)->sun_family = AF_LOCAL; -		memset(((struct sockaddr_un *)(*pai)->ai_addr)->sun_path, 0, UNIX_PATH_MAX); +		((struct sockaddr_un *)ai->ai_addr)->sun_family = AF_LOCAL; +		memset(((struct sockaddr_un *)ai->ai_addr)->sun_path, 0, UNIX_PATH_MAX);  		if (service) { -			struct sockaddr_un *sunp = (struct sockaddr_un *)(*pai)->ai_addr; +			struct sockaddr_un *sunp = (struct sockaddr_un *)ai->ai_addr;  			if (strchr(service->name, '/') != NULL) {  				if (strlen(service->name) >= sizeof(sunp->sun_path)) @@ -324,7 +321,7 @@ gaih_local(const char *name, const struct gaih_service *service,  		   window between the test for the file and the actual creation  		   (done by the caller) in which a file with the same name could  		   be created.  */ -		char *buf = ((struct sockaddr_un *)(*pai)->ai_addr)->sun_path; +		char *buf = ((struct sockaddr_un *)ai->ai_addr)->sun_path;  		if (__path_search(buf, L_tmpnam, NULL, NULL, 0) != 0  		 || __gen_tempname(buf, __GT_NOCREATE) != 0 @@ -333,11 +330,10 @@ gaih_local(const char *name, const struct gaih_service *service,  		}  	} +	ai->ai_canonname = NULL;  	if (req->ai_flags & AI_CANONNAME) -		(*pai)->ai_canonname = strcpy((char *) *pai + sizeof(struct addrinfo) + sizeof(struct sockaddr_un), +		ai->ai_canonname = strcpy((char *)(ai + 1) + sizeof(struct sockaddr_un),  				utsname.nodename); -	else -		(*pai)->ai_canonname = NULL;  	return 0;  }  #endif	/* 0 */ @@ -798,7 +794,7 @@ int  getaddrinfo(const char *name, const char *service,  	     const struct addrinfo *hints, struct addrinfo **pai)  { -	int i = 0, j = 0, last_i = 0; +	int i = 0, j, last_i = 0;  	struct addrinfo *p = NULL, **end;  	const struct gaih *g = gaih, *pg = NULL;  	struct gaih_service gaih_service, *pservice; @@ -847,11 +843,11 @@ getaddrinfo(const char *name, const char *service,  	} else  		pservice = NULL; +	end = NULL;  	if (pai)  		end = &p; -	else -		end = NULL; +	j = 0;  	while (g->gaih) {  		if (hints->ai_family == g->family || hints->ai_family == AF_UNSPEC) {  			if ((hints->ai_flags & AI_ADDRCONFIG) && !addrconfig(g->family)) { @@ -889,8 +885,8 @@ getaddrinfo(const char *name, const char *service,  	if (pai == NULL && last_i == 0)  		return 0; -	if (p) -		freeaddrinfo(p); +	/* if (p) - never happens, see above */ +	/*	freeaddrinfo(p); */  	return last_i ? -(last_i & GAIH_EAI) : EAI_NONAME;  }  | 
