From 26f82ad953d596b72322b0516ef426c1e597537548b73eb5b4a3b46a001f06fc Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Thu, 27 Mar 2014 08:44:54 +0000 Subject: [PATCH] Accepting request 227699 from home:Andreas_Schwab:Factory - check-pf-alloca.patch: remove use of alloca while collecting interface addresses OBS-URL: https://build.opensuse.org/request/show/227699 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=345 --- check-pf-alloca.patch | 206 ++++++++++++++++++++++++++-------------- glibc-testsuite.changes | 6 ++ glibc-utils.changes | 6 ++ glibc.changes | 6 ++ 4 files changed, 151 insertions(+), 73 deletions(-) diff --git a/check-pf-alloca.patch b/check-pf-alloca.patch index 8e4e82b..83709a6 100644 --- a/check-pf-alloca.patch +++ b/check-pf-alloca.patch @@ -9,95 +9,155 @@ Index: glibc-2.19/sysdeps/unix/sysv/linux/check_pf.c =================================================================== --- glibc-2.19.orig/sysdeps/unix/sysv/linux/check_pf.c +++ glibc-2.19/sysdeps/unix/sysv/linux/check_pf.c -@@ -139,9 +139,10 @@ make_request (int fd, pid_t pid) - #endif - bool use_malloc = false; - char *buf; -+ size_t alloca_used = 0; - - if (__libc_use_alloca (buf_size)) -- buf = alloca (buf_size); -+ buf = alloca_account (buf_size, alloca_used); - else - { - buf = malloc (buf_size); -@@ -163,6 +164,7 @@ make_request (int fd, pid_t pid) +@@ -106,6 +106,11 @@ cache_valid_p (void) + static struct cached_data * + make_request (int fd, pid_t pid) + { ++ struct cached_data *result = NULL; ++ ++ size_t result_len = 0; ++ size_t result_cap = 32; ++ + struct req { - struct in6addrinfo info; - struct in6ailist *next; -+ bool use_malloc; - } *in6ailist = NULL; - size_t in6ailistlen = 0; + struct nlmsghdr nlh; +@@ -137,19 +142,9 @@ make_request (int fd, pid_t pid) + #else + const size_t buf_size = __getpagesize (); + #endif +- bool use_malloc = false; + char *buf; + +- if (__libc_use_alloca (buf_size)) +- buf = alloca (buf_size); +- else +- { +- buf = malloc (buf_size); +- if (buf != NULL) +- use_malloc = true; +- else +- goto out_fail; +- } ++ buf = alloca (buf_size); + + struct iovec iov = { buf, buf_size }; + +@@ -159,12 +154,7 @@ make_request (int fd, pid_t pid) + goto out_fail; + + bool done = false; +- struct in6ailist +- { +- struct in6addrinfo info; +- struct in6ailist *next; +- } *in6ailist = NULL; +- size_t in6ailistlen = 0; ++ bool seen_ipv4 = false; -@@ -180,10 +182,10 @@ make_request (int fd, pid_t pid) + bool seen_ipv6 = false; - ssize_t read_len = TEMP_FAILURE_RETRY (__recvmsg (fd, &msg, 0)); - if (read_len < 0) -- goto out_fail; -+ goto out_fail2; - - if (msg.msg_flags & MSG_TRUNC) -- goto out_fail; -+ goto out_fail2; - - struct nlmsghdr *nlmh; - for (nlmh = (struct nlmsghdr *) buf; -@@ -239,7 +241,19 @@ make_request (int fd, pid_t pid) +@@ -239,28 +229,36 @@ make_request (int fd, pid_t pid) } } - struct in6ailist *newp = alloca (sizeof (*newp)); -+ struct in6ailist *newp; -+ if (__libc_use_alloca (alloca_used + sizeof (*newp))) +- newp->info.flags = (((ifam->ifa_flags +- & (IFA_F_DEPRECATED +- | IFA_F_OPTIMISTIC)) +- ? in6ai_deprecated : 0) +- | ((ifam->ifa_flags +- & IFA_F_HOMEADDRESS) +- ? in6ai_homeaddress : 0)); +- newp->info.prefixlen = ifam->ifa_prefixlen; +- newp->info.index = ifam->ifa_index; ++ if (result_len == 0 || result_len == result_cap) + { -+ newp = alloca_account (sizeof (*newp), alloca_used); -+ newp->use_malloc = false; ++ result_cap = 2 * result_cap; ++ result = realloc (result, sizeof (*result) ++ + result_cap * sizeof (struct in6addrinfo)); + } -+ else -+ { -+ newp = malloc (sizeof (*newp)); -+ if (newp == NULL) -+ goto out_fail2; -+ newp->use_malloc = true; -+ } - newp->info.flags = (((ifam->ifa_flags - & (IFA_F_DEPRECATED - | IFA_F_OPTIMISTIC)) -@@ -275,7 +289,7 @@ make_request (int fd, pid_t pid) - result = malloc (sizeof (*result) - + in6ailistlen * sizeof (struct in6addrinfo)); - if (result == NULL) -- goto out_fail; -+ goto out_fail2; ++ ++ if (!result) ++ goto out_fail; ++ ++ struct in6addrinfo *info = &result->in6ai[result_len++]; ++ ++ info->flags = (((ifam->ifa_flags ++ & (IFA_F_DEPRECATED ++ | IFA_F_OPTIMISTIC)) ++ ? in6ai_deprecated : 0) ++ | ((ifam->ifa_flags ++ & IFA_F_HOMEADDRESS) ++ ? in6ai_homeaddress : 0)); ++ info->prefixlen = ifam->ifa_prefixlen; ++ info->index = ifam->ifa_index; + if (ifam->ifa_family == AF_INET) + { +- newp->info.addr[0] = 0; +- newp->info.addr[1] = 0; +- newp->info.addr[2] = htonl (0xffff); +- newp->info.addr[3] = *(const in_addr_t *) address; ++ info->addr[0] = 0; ++ info->addr[1] = 0; ++ info->addr[2] = htonl (0xffff); ++ info->addr[3] = *(const in_addr_t *) address; + } + else +- memcpy (newp->info.addr, address, sizeof (newp->info.addr)); +- newp->next = in6ailist; +- in6ailist = newp; +- ++in6ailistlen; ++ memcpy (info->addr, address, sizeof (info->addr)); + } + else if (nlmh->nlmsg_type == NLMSG_DONE) + /* We found the end, leave the loop. */ +@@ -269,42 +267,29 @@ make_request (int fd, pid_t pid) + } + while (! done); +- struct cached_data *result; +- if (seen_ipv6 && in6ailist != NULL) ++ if (seen_ipv6 && result != NULL) + { +- result = malloc (sizeof (*result) +- + in6ailistlen * sizeof (struct in6addrinfo)); +- if (result == NULL) +- goto out_fail; +- result->timestamp = get_nl_timestamp (); result->usecnt = 2; -@@ -286,7 +300,10 @@ make_request (int fd, pid_t pid) - do - { - result->in6ai[--in6ailistlen] = in6ailist->info; + result->seen_ipv4 = seen_ipv4; + result->seen_ipv6 = true; +- result->in6ailen = in6ailistlen; +- +- do +- { +- result->in6ai[--in6ailistlen] = in6ailist->info; - in6ailist = in6ailist->next; -+ struct in6ailist *next = in6ailist->next; -+ if (in6ailist->use_malloc) -+ free (in6ailist); -+ in6ailist = next; - } - while (in6ailist != NULL); +- } +- while (in6ailist != NULL); ++ result->in6ailen = result_len; } -@@ -302,7 +319,15 @@ make_request (int fd, pid_t pid) - free (buf); + else + { ++ free (result); ++ + atomic_add (&noai6ai_cached.usecnt, 2); + noai6ai_cached.seen_ipv4 = seen_ipv4; + noai6ai_cached.seen_ipv6 = seen_ipv6; + result = &noai6ai_cached; + } + +- if (use_malloc) +- free (buf); return result; -out_fail: -+ out_fail2: -+ while (in6ailist != NULL) -+ { -+ struct in6ailist *next = in6ailist->next; -+ if (in6ailist->use_malloc) -+ free (in6ailist); -+ in6ailist = next; -+ } +- if (use_malloc) +- free (buf); + out_fail: - if (use_malloc) - free (buf); ++ ++ free (result); return NULL; + } + diff --git a/glibc-testsuite.changes b/glibc-testsuite.changes index 8fa09da..a395a37 100644 --- a/glibc-testsuite.changes +++ b/glibc-testsuite.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Mar 27 08:40:20 UTC 2014 - schwab@suse.de + +- check-pf-alloca.patch: remove use of alloca while collecting interface + addresses + ------------------------------------------------------------------- Tue Mar 25 09:26:44 UTC 2014 - schwab@suse.de diff --git a/glibc-utils.changes b/glibc-utils.changes index 8fa09da..a395a37 100644 --- a/glibc-utils.changes +++ b/glibc-utils.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Mar 27 08:40:20 UTC 2014 - schwab@suse.de + +- check-pf-alloca.patch: remove use of alloca while collecting interface + addresses + ------------------------------------------------------------------- Tue Mar 25 09:26:44 UTC 2014 - schwab@suse.de diff --git a/glibc.changes b/glibc.changes index 8fa09da..a395a37 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Mar 27 08:40:20 UTC 2014 - schwab@suse.de + +- check-pf-alloca.patch: remove use of alloca while collecting interface + addresses + ------------------------------------------------------------------- Tue Mar 25 09:26:44 UTC 2014 - schwab@suse.de