mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +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>
|
2017-06-21 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
Add the __inet_pton_length helper function.
|
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);
|
char *scope_delim = strchr (name, SCOPE_DELIMITER);
|
||||||
int e;
|
int e;
|
||||||
|
if (scope_delim == NULL)
|
||||||
{
|
e = inet_pton (AF_INET6, name, at->addr);
|
||||||
bool malloc_namebuf = false;
|
else
|
||||||
char *namebuf = (char *) name;
|
e = __inet_pton_length (AF_INET6, name, scope_delim - name,
|
||||||
|
at->addr);
|
||||||
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 (e > 0)
|
if (e > 0)
|
||||||
{
|
{
|
||||||
if (req->ai_family == AF_UNSPEC || req->ai_family == AF_INET6)
|
if (req->ai_family == AF_UNSPEC || req->ai_family == AF_INET6)
|
||||||
|
Loading…
Reference in New Issue
Block a user