summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/inet/resolv.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c
index 560c56988..26d68d26a 100644
--- a/libc/inet/resolv.c
+++ b/libc/inet/resolv.c
@@ -2259,6 +2259,7 @@ int gethostbyaddr_r (const void *addr, socklen_t len, int type,
struct in6_addr *in6;
struct in6_addr **addr_list6;
#endif /* __UCLIBC_HAS_IPV6__ */
+ char **alias;
unsigned char *packet;
struct resolv_answer a;
int i;
@@ -2319,6 +2320,12 @@ int gethostbyaddr_r (const void *addr, socklen_t len, int type,
buf+=sizeof(*addr_list)*2;
buflen-=sizeof(*addr_list)*2;
+ if (buflen < sizeof(char *)*(ALIAS_DIM))
+ return ERANGE;
+ alias=(char **)buf;
+ buf+=sizeof(*alias)*(ALIAS_DIM);
+ buflen-=sizeof(*alias)*(ALIAS_DIM);
+
#ifdef __UCLIBC_HAS_IPV6__
if (plen < sizeof(*in6))
return ERANGE;
@@ -2367,6 +2374,9 @@ int gethostbyaddr_r (const void *addr, socklen_t len, int type,
addr_list[1] = 0;
+ alias[0] = buf;
+ alias[1] = 0;
+
for (;;) {
BIGLOCK;
@@ -2413,6 +2423,7 @@ int gethostbyaddr_r (const void *addr, socklen_t len, int type,
}
result_buf->h_addr_list = (char **) addr_list;
+ result_buf->h_aliases = alias;
break;
} else {
free(packet);