about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2017-06-21 13:35:37 +0200
committerFlorian Weimer <fweimer@redhat.com>2017-06-21 13:35:37 +0200
commit76b8266f990a2912f42d1b7050840e8c7f14f2c2 (patch)
treeb9e22ec6506e42f91a482ad0caf402805646eeb1
parent60149b28590be28051f99d0a343d7fbe002f2a8c (diff)
downloadglibc-76b8266f990a2912f42d1b7050840e8c7f14f2c2.tar.gz
glibc-76b8266f990a2912f42d1b7050840e8c7f14f2c2.tar.xz
glibc-76b8266f990a2912f42d1b7050840e8c7f14f2c2.zip
getaddrinfo: Avoid stack copy of IPv6 address
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/posix/getaddrinfo.c45
2 files changed, 10 insertions, 40 deletions
diff --git a/ChangeLog b/ChangeLog
index a3a82841fd..2cd20ad38d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2017-06-21  Florian Weimer  <fweimer@redhat.com>
 
+	* sysdeps/posix/getaddrinfo.c (gaih_inet): Call __inet_pton_length
+	to parse addresses with IPv6 scope IDs.
+
+2017-06-21  Florian Weimer  <fweimer@redhat.com>
+
 	Add the __inet_pton_length helper function.
 	* resolv/resolv-internal.h (__inet_pton_length): Declare.
 	* resolv/inet_pton (__inet_pton_length): Rename from __inet_pton.
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index a8bdd9a182..4ec17961ad 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -539,46 +539,11 @@ gaih_inet (const char *name, const struct gaih_service *service,
 	{
 	  char *scope_delim = strchr (name, SCOPE_DELIMITER);
 	  int e;
-
-	  {
-	    bool malloc_namebuf = false;
-	    char *namebuf = (char *) name;
-
-	    if (__glibc_unlikely (scope_delim != NULL))
-	      {
-		if (malloc_name)
-		  *scope_delim = '\0';
-		else
-		  {
-		    if (__libc_use_alloca (alloca_used
-					   + scope_delim - name + 1))
-		      {
-			namebuf = alloca_account (scope_delim - name + 1,
-						  alloca_used);
-			*((char *) __mempcpy (namebuf, name,
-					      scope_delim - name)) = '\0';
-		      }
-		    else
-		      {
-			namebuf = __strndup (name, scope_delim - name);
-			if (namebuf == NULL)
-			  {
-			    assert (!malloc_name);
-			    return -EAI_MEMORY;
-			  }
-			malloc_namebuf = true;
-		      }
-		  }
-	      }
-
-	    e = inet_pton (AF_INET6, namebuf, at->addr);
-
-	    if (malloc_namebuf)
-	      free (namebuf);
-	    else if (scope_delim != NULL && malloc_name)
-	      /* Undo what we did above.  */
-	      *scope_delim = SCOPE_DELIMITER;
-	  }
+	  if (scope_delim == NULL)
+	    e = inet_pton (AF_INET6, name, at->addr);
+	  else
+	    e = __inet_pton_length (AF_INET6, name, scope_delim - name,
+				    at->addr);
 	  if (e > 0)
 	    {
 	      if (req->ai_family == AF_UNSPEC || req->ai_family == AF_INET6)