Skip to content

Commit

Permalink
Fix crash on reloading of gai data in nscd.
Browse files Browse the repository at this point in the history
  • Loading branch information
Ulrich Drepper committed Apr 10, 2010
1 parent 17ad387 commit ea42a20
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 18 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
2010-04-09 Ulrich Drepper <drepper@redhat.com>

* nscd/aicache.c (addhstaiX): Correct passing memory to address
list to gethostbyname4_r functions.

* resolv/nss_dns/dns-host.c (gaih_getanswer_slice): Optimize
copying of h_name.

2010-04-09 Roland McGrath <roland@redhat.com>

* Makerules ($(common-objpfx)libc-abis.h): Depend on libc-abis.stamp.
Expand Down
10 changes: 6 additions & 4 deletions nscd/aicache.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Cache handling for host lookup.
Copyright (C) 2004-2008, 2009 Free Software Foundation, Inc.
Copyright (C) 2004-2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
Expand Down Expand Up @@ -111,7 +111,7 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
int old_res_options = _res.options;
_res.options &= ~RES_USE_INET6;

size_t tmpbuf6len = 512;
size_t tmpbuf6len = 1024;
char *tmpbuf6 = alloca (tmpbuf6len);
size_t tmpbuf4len = 0;
char *tmpbuf4 = NULL;
Expand All @@ -133,9 +133,11 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
"gethostbyname4_r");
if (fct4 != NULL)
{
struct gaih_addrtuple *at = NULL;
struct gaih_addrtuple atmem;
struct gaih_addrtuple *at;
while (1)
{
at = &atmem;
rc6 = 0;
herrno = 0;
status[1] = DL_CALL_FCT (fct4, (key, &at, tmpbuf6, tmpbuf6len,
Expand All @@ -153,7 +155,7 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
goto next_nip;

/* We found the data. Count the addresses and the size. */
for (const struct gaih_addrtuple *at2 = at; at2 != NULL;
for (const struct gaih_addrtuple *at2 = at = &atmem; at2 != NULL;
at2 = at2->next)
{
++naddrs;
Expand Down
16 changes: 2 additions & 14 deletions resolv/nss_dns/dns-host.c
Original file line number Diff line number Diff line change
Expand Up @@ -1050,7 +1050,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
++had_error;
continue;
}
if (*firstp)
if (*firstp && canon == NULL)
{
h_name = buffer;
buffer += h_namelen;
Expand Down Expand Up @@ -1166,19 +1166,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
if (ttl != 0 && ttlp != NULL)
*ttlp = ttl;

if (canon != NULL)
{
(*pat)->name = canon;

/* Reclaim buffer space. */
if (h_name + h_namelen == buffer)
{
buffer = h_name;
buflen += h_namelen;
}
}
else
(*pat)->name = h_name;
(*pat)->name = canon ?: h_name;

*firstp = 0;
}
Expand Down

0 comments on commit ea42a20

Please sign in to comment.