|
@@ -45,6 +45,11 @@
|
|
|
* 2-Feb-2002 Erik Andersen <andersee@debian.org>
|
|
|
* Added gethostent(), sethostent(), and endhostent()
|
|
|
*
|
|
|
+ * 17-Aug-2002 Manuel Novoa III <mjn3@codepoet.org>
|
|
|
+ * Fixed __read_etc_hosts_r to return alias list, and modified buffer
|
|
|
+ * allocation accordingly. See MAX_ALIASES and ALIAS_DIM below.
|
|
|
+ * This fixes the segfault in the Python 2.2.1 socket test.
|
|
|
+ *
|
|
|
*/
|
|
|
|
|
|
#define __FORCE_GLIBC
|
|
@@ -73,6 +78,11 @@
|
|
|
#define MAX_SERVERS 3
|
|
|
#define MAX_SEARCH 4
|
|
|
|
|
|
+#define MAX_ALIASES 5
|
|
|
+
|
|
|
+
|
|
|
+#define ALIAS_DIM (2 + MAX_ALIASES + 1)
|
|
|
+
|
|
|
#undef DEBUG
|
|
|
|
|
|
|
|
@@ -910,7 +920,7 @@ struct hostent *gethostbyname(const char *name)
|
|
|
static struct hostent h;
|
|
|
static char buf[sizeof(struct in_addr) +
|
|
|
sizeof(struct in_addr *)*2 +
|
|
|
- 256 + 32];
|
|
|
+ sizeof(char *)*(ALIAS_DIM) + 256 + 32];
|
|
|
struct hostent *hp;
|
|
|
|
|
|
gethostbyname_r(name, &h, buf, sizeof(buf), &hp, &h_errno);
|
|
@@ -937,7 +947,7 @@ struct hostent *gethostbyname2(const char *name, int family)
|
|
|
static struct hostent h;
|
|
|
static char buf[sizeof(struct in6_addr) +
|
|
|
sizeof(struct in6_addr *)*2 +
|
|
|
- 256 + 32];
|
|
|
+ sizeof(char *)*(ALIAS_DIM) + 256 + 32];
|
|
|
struct hostent *hp;
|
|
|
|
|
|
gethostbyname2_r(name, family, &h, buf, sizeof(buf), &hp, &h_errno);
|
|
@@ -1067,7 +1077,6 @@ int res_query(const char *dname, int class, int type,
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-
|
|
|
#ifdef L_gethostbyaddr
|
|
|
struct hostent *gethostbyaddr (const void *addr, socklen_t len, int type)
|
|
|
{
|
|
@@ -1078,7 +1087,7 @@ struct hostent *gethostbyaddr (const void *addr, socklen_t len, int type)
|
|
|
#else
|
|
|
sizeof(struct in6_addr) + sizeof(struct in6_addr *)*2 +
|
|
|
#endif
|
|
|
- 256 + 32];
|
|
|
+ sizeof(char *)*(ALIAS_DIM) + 256 + 32];
|
|
|
struct hostent *hp;
|
|
|
|
|
|
gethostbyaddr_r(addr, len, type, &h, buf, sizeof(buf), &hp, &h_errno);
|
|
@@ -1112,11 +1121,16 @@ int __read_etc_hosts_r(FILE * fp, const char * name, int type,
|
|
|
struct in6_addr **addr_list6=NULL;
|
|
|
#endif
|
|
|
char *cp;
|
|
|
-#define MAX_ALIAS 5
|
|
|
- char *alias[MAX_ALIAS];
|
|
|
+ char **alias;
|
|
|
int aliases, i;
|
|
|
int ret=HOST_NOT_FOUND;
|
|
|
|
|
|
+ if (buflen < sizeof(char *)*(ALIAS_DIM))
|
|
|
+ return ERANGE;
|
|
|
+ alias=(char **)buf;
|
|
|
+ buf+=sizeof(char **)*(ALIAS_DIM);
|
|
|
+ buflen-=sizeof(char **)*(ALIAS_DIM);
|
|
|
+
|
|
|
if (action!=GETHOSTENT) {
|
|
|
#ifdef __UCLIBC_HAS_IPV6__
|
|
|
char *p=buf;
|
|
@@ -1153,6 +1167,7 @@ int __read_etc_hosts_r(FILE * fp, const char * name, int type,
|
|
|
buf=p;
|
|
|
}
|
|
|
#endif
|
|
|
+
|
|
|
if (buflen < 80)
|
|
|
return ERANGE;
|
|
|
|
|
@@ -1176,11 +1191,12 @@ int __read_etc_hosts_r(FILE * fp, const char * name, int type,
|
|
|
*cp++ = '\0';
|
|
|
if (!*cp)
|
|
|
continue;
|
|
|
- if (aliases < MAX_ALIAS)
|
|
|
+ if (aliases < (2+MAX_ALIASES))
|
|
|
alias[aliases++] = cp;
|
|
|
while (*cp && !isspace(*cp))
|
|
|
cp++;
|
|
|
}
|
|
|
+ alias[aliases] = 0;
|
|
|
|
|
|
if (aliases < 2)
|
|
|
continue;
|
|
@@ -1208,6 +1224,7 @@ int __read_etc_hosts_r(FILE * fp, const char * name, int type,
|
|
|
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 + 2;
|
|
|
*result=result_buf;
|
|
|
ret=NETDB_SUCCESS;
|
|
|
#ifdef __UCLIBC_HAS_IPV6__
|
|
@@ -1219,6 +1236,7 @@ int __read_etc_hosts_r(FILE * fp, const char * name, int type,
|
|
|
result_buf->h_addrtype = AF_INET6;
|
|
|
result_buf->h_length = sizeof(*in6);
|
|
|
result_buf->h_addr_list = (char**) addr_list6;
|
|
|
+ result_buf->h_aliases = alias + 2;
|
|
|
*result=result_buf;
|
|
|
ret=NETDB_SUCCESS;
|
|
|
#endif
|
|
@@ -1282,6 +1300,7 @@ struct hostent *gethostent (void)
|
|
|
#else
|
|
|
sizeof(struct in6_addr) + sizeof(struct in6_addr *)*2 +
|
|
|
#endif
|
|
|
+ sizeof(char *)*(ALIAS_DIM) +
|
|
|
80 + 2];
|
|
|
struct hostent *host;
|
|
|
|