summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Novoa III <mjn3@codepoet.org>2004-08-10 15:12:48 +0000
committerManuel Novoa III <mjn3@codepoet.org>2004-08-10 15:12:48 +0000
commit6f60320934749897340f9f6d056f6e57c79fc2f9 (patch)
tree9aa77688786ccf16716ebab8bf59f078ed2e6f7c
parent7e8a7b341932d9b277a64948bce0cc244ebfddb0 (diff)
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 :)
-rw-r--r--libc/inet/resolv.c17
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 {