diff options
Diffstat (limited to 'libc/inet')
-rw-r--r-- | libc/inet/resolv.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index 0c9b52415..148fd4a4a 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -1846,6 +1846,7 @@ int gethostbyname_r(const char * name, { struct in_addr *in; struct in_addr **addr_list; + char **alias; unsigned char *packet; struct resolv_answer a; int i; @@ -1899,17 +1900,27 @@ int gethostbyname_r(const char * name, addr_list[0] = in; addr_list[1] = 0; - + + if (buflen < sizeof(char *)*(ALIAS_DIM)) + return ERANGE; + alias=(char **)buf; + buf+=sizeof(char **)*(ALIAS_DIM); + buflen-=sizeof(char **)*(ALIAS_DIM); + if (buflen<256) return ERANGE; strncpy(buf, name, buflen); + alias[0] = buf; + alias[1] = NULL; + /* First check if this is already an address */ if (inet_aton(name, in)) { result_buf->h_name = buf; result_buf->h_addrtype = AF_INET; result_buf->h_length = sizeof(*in); result_buf->h_addr_list = (char **) addr_list; + result_buf->h_aliases = alias; *result=result_buf; *h_errnop = NETDB_SUCCESS; return NETDB_SUCCESS; @@ -1954,6 +1965,10 @@ int gethostbyname_r(const char * name, result_buf->h_addrtype = AF_INET; result_buf->h_length = sizeof(*in); result_buf->h_addr_list = (char **) addr_list; +#ifdef __UCLIBC_MJN3_ONLY__ +#warning TODO -- generate the full list +#endif + result_buf->h_aliases = alias; /* TODO: generate the full list */ free(packet); break; } else { |