aboutsummaryrefslogtreecommitdiff
path: root/resolv/mapv4v6hostent.h
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@redhat.com>2009-11-10 07:36:50 -0800
committerUlrich Drepper <drepper@redhat.com>2009-11-10 07:36:50 -0800
commit51e4196f16a2d98377e3c481a44e133369dc7669 (patch)
treee2d83a34e0bbe6f47dfe733f6062b6508e4d6868 /resolv/mapv4v6hostent.h
parent6515a01fc1d35d329886d5a45435537ee9115bc4 (diff)
downloadglibc-51e4196f16a2d98377e3c481a44e133369dc7669.tar
glibc-51e4196f16a2d98377e3c481a44e133369dc7669.tar.gz
glibc-51e4196f16a2d98377e3c481a44e133369dc7669.tar.bz2
glibc-51e4196f16a2d98377e3c481a44e133369dc7669.zip
Handle running out of buffer space with IPv6 mapping enabled.
With big DNS answers like the one you get for goodtimesdot.com you can get a truncated address list if IPv6 mapping is enabled. Instead tell the caller to resize the buffer.
Diffstat (limited to 'resolv/mapv4v6hostent.h')
-rw-r--r--resolv/mapv4v6hostent.h12
1 files changed, 5 insertions, 7 deletions
diff --git a/resolv/mapv4v6hostent.h b/resolv/mapv4v6hostent.h
index 4151ce3639..c11038adf3 100644
--- a/resolv/mapv4v6hostent.h
+++ b/resolv/mapv4v6hostent.h
@@ -57,13 +57,13 @@ typedef union {
char ac;
} align;
-static void
+static int
map_v4v6_hostent (struct hostent *hp, char **bpp, int *lenp)
{
char **ap;
if (hp->h_addrtype != AF_INET || hp->h_length != INADDRSZ)
- return;
+ return 0;
hp->h_addrtype = AF_INET6;
hp->h_length = IN6ADDRSZ;
for (ap = hp->h_addr_list; *ap; ap++)
@@ -71,11 +71,8 @@ map_v4v6_hostent (struct hostent *hp, char **bpp, int *lenp)
int i = sizeof (align) - ((u_long) *bpp % sizeof (align));
if (*lenp < (i + IN6ADDRSZ))
- {
- /* Out of memory. Truncate address list here. XXX */
- *ap = NULL;
- return;
- }
+ /* Out of memory. */
+ return 1;
*bpp += i;
*lenp -= i;
map_v4v6_address (*ap, *bpp);
@@ -83,4 +80,5 @@ map_v4v6_hostent (struct hostent *hp, char **bpp, int *lenp)
*bpp += IN6ADDRSZ;
*lenp -= IN6ADDRSZ;
}
+ return 0;
}