86 lines
2.9 KiB
Diff
86 lines
2.9 KiB
Diff
|
commit 46ce8881ade788db56079622f47f648d4aaa003b
|
||
|
Author: Florian Weimer <fweimer@redhat.com>
|
||
|
Date: Thu May 11 10:01:49 2017 +0200
|
||
|
|
||
|
getaddrinfo: Unconditionally use malloc for address list
|
||
|
|
||
|
getaddrinfo has to call malloc eventually anyway, so the complexity
|
||
|
of avoiding malloc calls is not worth potential savings.
|
||
|
|
||
|
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
|
||
|
index 1ea2b2218d263b28..987a1c1e17f2d5b1 100644
|
||
|
--- a/sysdeps/posix/getaddrinfo.c
|
||
|
+++ b/sysdeps/posix/getaddrinfo.c
|
||
|
@@ -278,9 +278,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req,
|
||
|
} \
|
||
|
else if (h != NULL) \
|
||
|
{ \
|
||
|
- /* Make sure that addrmem can be freed. */ \
|
||
|
- if (!malloc_addrmem) \
|
||
|
- addrmem = NULL; \
|
||
|
if (!convert_hostent_to_gaih_addrtuple (req, _family,h, &addrmem)) \
|
||
|
{ \
|
||
|
_res.options |= old_res_options & DEPRECATED_RES_USE_INET6; \
|
||
|
@@ -288,8 +285,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req,
|
||
|
goto free_and_return; \
|
||
|
} \
|
||
|
*pat = addrmem; \
|
||
|
- /* The conversion uses malloc unconditionally. */ \
|
||
|
- malloc_addrmem = true; \
|
||
|
\
|
||
|
if (localcanon != NULL && canon == NULL) \
|
||
|
canon = strdupa (localcanon); \
|
||
|
@@ -447,7 +442,6 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||
|
}
|
||
|
|
||
|
bool malloc_name = false;
|
||
|
- bool malloc_addrmem = false;
|
||
|
struct gaih_addrtuple *addrmem = NULL;
|
||
|
bool malloc_canonbuf = false;
|
||
|
char *canonbuf = NULL;
|
||
|
@@ -633,8 +627,6 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||
|
goto free_and_return;
|
||
|
}
|
||
|
*pat = addrmem;
|
||
|
- /* The conversion uses malloc unconditionally. */
|
||
|
- malloc_addrmem = true;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
@@ -675,21 +667,11 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||
|
bool added_canon = (req->ai_flags & AI_CANONNAME) == 0;
|
||
|
char *addrs = air->addrs;
|
||
|
|
||
|
- if (__libc_use_alloca (alloca_used
|
||
|
- + air->naddrs * sizeof (struct gaih_addrtuple)))
|
||
|
- addrmem = alloca_account (air->naddrs
|
||
|
- * sizeof (struct gaih_addrtuple),
|
||
|
- alloca_used);
|
||
|
- else
|
||
|
+ addrmem = calloc (air->naddrs, sizeof (*addrmem));
|
||
|
+ if (addrmem == NULL)
|
||
|
{
|
||
|
- addrmem = malloc (air->naddrs
|
||
|
- * sizeof (struct gaih_addrtuple));
|
||
|
- if (addrmem == NULL)
|
||
|
- {
|
||
|
- result = -EAI_MEMORY;
|
||
|
- goto free_and_return;
|
||
|
- }
|
||
|
- malloc_addrmem = true;
|
||
|
+ result = -EAI_MEMORY;
|
||
|
+ goto free_and_return;
|
||
|
}
|
||
|
|
||
|
struct gaih_addrtuple *addrfree = addrmem;
|
||
|
@@ -1232,8 +1214,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||
|
free_and_return:
|
||
|
if (malloc_name)
|
||
|
free ((char *) name);
|
||
|
- if (malloc_addrmem)
|
||
|
- free (addrmem);
|
||
|
+ free (addrmem);
|
||
|
if (malloc_canonbuf)
|
||
|
free (canonbuf);
|
||
|
|