diff options
author | Florian Weimer <fweimer@redhat.com> | 2017-06-21 13:35:37 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2017-06-21 13:35:37 +0200 |
commit | 76b8266f990a2912f42d1b7050840e8c7f14f2c2 (patch) | |
tree | b9e22ec6506e42f91a482ad0caf402805646eeb1 | |
parent | 60149b28590be28051f99d0a343d7fbe002f2a8c (diff) | |
download | glibc-76b8266f990a2912f42d1b7050840e8c7f14f2c2.tar.gz glibc-76b8266f990a2912f42d1b7050840e8c7f14f2c2.tar.xz glibc-76b8266f990a2912f42d1b7050840e8c7f14f2c2.zip |
getaddrinfo: Avoid stack copy of IPv6 address
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/posix/getaddrinfo.c | 45 |
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) |