Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Andreas Schwab authored and Ulrich Drepper committed Nov 10, 2009
1 parent 6515a01 commit 51e4196
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 9 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
@@ -1,7 +1,15 @@
2009-11-10 Andreas Schwab <schwab@redhat.com>

* resolv/mapv4v6hostent.h (map_v4v6_hostent): Return non-zero if
out of buffer space.
* resolv/nss_dns/dns-host.c (getanswer_r): Check for
map_v4v6_hostent running out of space.

2009-11-10 Ulrich Drepper <drepper@redhat.com>

* string/bits/string3.h (memset): If the second parameter is constant
and zero there is likely no transposition.
Patch by Caolan McNamara <caolanm@redhat.com.

2009-11-04 Philippe De Muyter <phdm@macqel.be>

Expand Down
12 changes: 5 additions & 7 deletions resolv/mapv4v6hostent.h
Expand Up @@ -57,30 +57,28 @@ 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++)
{
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);
*ap = *bpp;
*bpp += IN6ADDRSZ;
*lenp -= IN6ADDRSZ;
}
return 0;
}
6 changes: 4 additions & 2 deletions resolv/nss_dns/dns-host.c
Expand Up @@ -878,7 +878,8 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
}
bp += n;
linebuflen -= n;
map_v4v6_hostent (result, &bp, &linebuflen);
if (map_v4v6_hostent (result, &bp, &linebuflen))
goto too_small;
}
*h_errnop = NETDB_SUCCESS;
return NSS_STATUS_SUCCESS;
Expand Down Expand Up @@ -953,7 +954,8 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
}

if (have_to_map)
map_v4v6_hostent (result, &bp, &linebuflen);
if (map_v4v6_hostent (result, &bp, &linebuflen))
goto too_small;
*h_errnop = NETDB_SUCCESS;
return NSS_STATUS_SUCCESS;
}
Expand Down

0 comments on commit 51e4196

Please sign in to comment.