]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
getaddrinfo: Avoid stack copy of IPv6 address
authorFlorian Weimer <fweimer@redhat.com>
Wed, 21 Jun 2017 11:35:37 +0000 (13:35 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Wed, 21 Jun 2017 11:35:37 +0000 (13:35 +0200)
ChangeLog
sysdeps/posix/getaddrinfo.c

index a3a82841fde22c2c434957a52c066b810bd2765a..2cd20ad38d219321306bf927f6b1cdd581ee97ea 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+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.
index a8bdd9a1829409bd797637b2c4fca4d67a11012d..4ec17961adb194ff47752bca15aad732f9c49152 100644 (file)
@@ -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)