|
|
@@ -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;
|
|
|
}
|