mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-25 22:40:05 +00:00
getaddrinfo: Avoid stack copy of IPv6 address
This commit is contained in:
parent
60149b2859
commit
76b8266f99
@ -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.
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user