summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2017-05-11 10:01:49 +0200
committerFlorian Weimer <fweimer@redhat.com>2018-01-04 11:19:35 +0100
commit8a4bf46fe7256b2713e568589b89c2275975586c (patch)
treee7e8c2a94faf27c69ca35a85ce3ec0ae2c117934
parentbaf35427d678c86abff1c53594cd923cbcc961da (diff)
downloadglibc-8a4bf46fe7256b2713e568589b89c2275975586c.tar.gz
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. (cherry picked from commit 46ce8881ade788db56079622f47f648d4aaa003b)
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/posix/getaddrinfo.c29
2 files changed, 10 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index a8408db947..82dc47cfdd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-05-11 Florian Weimer <fweimer@redhat.com>
+
+ * sysdeps/posix/getaddrinfo.c (gethosts): Remove malloc_addrmem.
+ (gaih_inet): Likewise.
+
2017-08-23 H.J. Lu <hongjiu.lu@intel.com>
* sysdeps/x86_64/fpu/libm-test-ulps: Regenerated.
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 43eb31365e..f6a3f4f15f 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);