diff options
-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; } |