about summary refs log tree commit diff
path: root/nscd/aicache.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2010-04-09 21:38:20 -0700
committerUlrich Drepper <drepper@redhat.com>2010-04-09 21:38:20 -0700
commitea42a20caed5b343ff20a0d4622ae6c17b77161b (patch)
treed4d57d9ea754be4d720e7946b5e439e4cea45505 /nscd/aicache.c
parent17ad3877276b37af45c380b07b975406cf2e95de (diff)
downloadglibc-ea42a20caed5b343ff20a0d4622ae6c17b77161b.tar.gz
glibc-ea42a20caed5b343ff20a0d4622ae6c17b77161b.tar.xz
glibc-ea42a20caed5b343ff20a0d4622ae6c17b77161b.zip
Fix crash on reloading of gai data in nscd.
Diffstat (limited to 'nscd/aicache.c')
-rw-r--r--nscd/aicache.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/nscd/aicache.c b/nscd/aicache.c
index 992357d2fe..3cb2208035 100644
--- a/nscd/aicache.c
+++ b/nscd/aicache.c
@@ -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.
 
@@ -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;
@@ -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,
@@ -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;