From 6f60320934749897340f9f6d056f6e57c79fc2f9 Mon Sep 17 00:00:00 2001 From: Manuel Novoa III Date: Tue, 10 Aug 2004 15:12:48 +0000 Subject: On Monday 02 August 2004 08:44 am, Mike Frysinger wrote: > the gethostbyname_r() call itself is not segfaulting, but the memory > returned in the h_aliases array seems to be wrong ... was playing around with the source today and eventually the obvious answer hit me ... while read_etc_hosts_r() generatings an array of strings fo h_aliases and populates it, the dns path does not :) find attached a patch that'll actually generate the h_aliases list in the normal dns code path ... i used the etc_hosts_r() code as a template for some of it ... note that this is just a simple fix ... it fills the alias list with just the hostname gethostbyname_r was passed ... the proper fix i think would be to parse the dns packet down in __dns_lookup() and pass the info back via the resolv_answer struct ... but this fix is better than the current state of things ... that is, h_aliases currently is never initailized in the dns code path :) --- libc/inet/resolv.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'libc') 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 { -- cgit v1.2.3