diff options
author | Mike Frysinger <vapier@gentoo.org> | 2006-07-31 20:21:45 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2006-07-31 20:21:45 +0000 |
commit | 68d61aada26faf8ba03112af9c85b3f7fb769730 (patch) | |
tree | 449e627b5c6d977797e89fa744ae26366534614f /libc/inet/resolv.c | |
parent | e907413137f5026a5c3b9bddb3f80771f928eb41 (diff) |
fix h_alias handling in gethostbyaddr_r() just like in gethostbyname_r()
otherwise we get messed up alias memory and this simple test case will
segfault:
python -c 'import socket; print socket.gethostbyaddr("80.68.88.204")[2];'
see bug report in blackfin tracker for more info:
http://blackfin.uclinux.org/tracker/index.php?func=detail&aid=1503&group_id=17&atid=141
Diffstat (limited to 'libc/inet/resolv.c')
-rw-r--r-- | libc/inet/resolv.c | 11 |
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); |