about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2017-05-11 10:01:49 +0200
committerFlorian Weimer <fweimer@redhat.com>2017-05-11 10:01:49 +0200
commit46ce8881ade788db56079622f47f648d4aaa003b (patch)
tree3d162805ea88b3d23c70c6a5381f99ab9480c000
parentfaa9066c4b4a758bb97a8a38173630d821bb6db5 (diff)
downloadglibc-46ce8881ade788db56079622f47f648d4aaa003b.tar.gz
glibc-46ce8881ade788db56079622f47f648d4aaa003b.tar.xz
glibc-46ce8881ade788db56079622f47f648d4aaa003b.zip
getaddrinfo: Unconditionally use malloc for address list
getaddrinfo has to call malloc eventually anyway, so the complexity
of avoiding malloc calls is not worth potential savings.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/posix/getaddrinfo.c29
2 files changed, 10 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index 0528b5a02f..4231a68860 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-05-11  Florian Weimer  <fweimer@redhat.com>
+
+	* sysdeps/posix/getaddrinfo.c (gethosts): Remove malloc_addrmem.
+	(gaih_inet): Likewise.
+
 2017-05-10  Andreas Schwab  <schwab@suse.de>
 
 	* nptl/tst-fork1.c: Include <support/test-driver.c>.
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index a55cc39be7..dc02b11d6e 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -278,9 +278,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req,
     }									      \
   else if (h != NULL)							      \
     {									      \
-      /* Make sure that addrmem can be freed.  */			      \
-      if (!malloc_addrmem)						      \
-	addrmem = NULL;							      \
       if (!convert_hostent_to_gaih_addrtuple (req, _family,h, &addrmem))      \
 	{								      \
 	  _res.options |= old_res_options & DEPRECATED_RES_USE_INET6;	      \
@@ -288,8 +285,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req,
 	  goto free_and_return;						      \
 	}								      \
       *pat = addrmem;							      \
-      /* The conversion uses malloc unconditionally.  */		      \
-      malloc_addrmem = true;						      \
 									      \
       if (localcanon !=	NULL && canon == NULL)				      \
 	canon = strdupa (localcanon);					      \
@@ -447,7 +442,6 @@ gaih_inet (const char *name, const struct gaih_service *service,
     }
 
   bool malloc_name = false;
-  bool malloc_addrmem = false;
   struct gaih_addrtuple *addrmem = NULL;
   bool malloc_canonbuf = false;
   char *canonbuf = NULL;
@@ -633,8 +627,6 @@ gaih_inet (const char *name, const struct gaih_service *service,
 			  goto free_and_return;
 			}
 		      *pat = addrmem;
-		      /* The conversion uses malloc unconditionally.  */
-		      malloc_addrmem = true;
 		    }
 		}
 	      else
@@ -675,21 +667,11 @@ gaih_inet (const char *name, const struct gaih_service *service,
 		  bool added_canon = (req->ai_flags & AI_CANONNAME) == 0;
 		  char *addrs = air->addrs;
 
-		  if (__libc_use_alloca (alloca_used
-					 + air->naddrs * sizeof (struct gaih_addrtuple)))
-		    addrmem = alloca_account (air->naddrs
-					      * sizeof (struct gaih_addrtuple),
-					      alloca_used);
-		  else
+		  addrmem = calloc (air->naddrs, sizeof (*addrmem));
+		  if (addrmem == NULL)
 		    {
-		      addrmem = malloc (air->naddrs
-					* sizeof (struct gaih_addrtuple));
-		      if (addrmem == NULL)
-			{
-			  result = -EAI_MEMORY;
-			  goto free_and_return;
-			}
-		      malloc_addrmem = true;
+		      result = -EAI_MEMORY;
+		      goto free_and_return;
 		    }
 
 		  struct gaih_addrtuple *addrfree = addrmem;
@@ -1232,8 +1214,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
  free_and_return:
   if (malloc_name)
     free ((char *) name);
-  if (malloc_addrmem)
-    free (addrmem);
+  free (addrmem);
   if (malloc_canonbuf)
     free (canonbuf);