summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2011-11-01 18:05:31 +0100
committerAndreas Schwab <schwab@linux-m68k.org>2011-11-01 18:29:34 +0100
commit647776f663e8bb9ee365e0dbabd3702b8cb80bc3 (patch)
tree77affe2269ba680a6239396a9cb589283963fc71
parentd91a8b93aaa8a3d2d9b5fd64e111c5a4eb24d2b9 (diff)
downloadglibc-647776f663e8bb9ee365e0dbabd3702b8cb80bc3.tar.gz
Account for alloca size rounding in extend_alloca
-rw-r--r--ChangeLog6
-rw-r--r--elf/dl-deps.c8
-rw-r--r--include/alloca.h10
3 files changed, 15 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index c8bf9b7923..a70847edb5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2011-11-01 Andreas Schwab <schwab@linux-m68k.org>
+ * include/alloca.h (stackinfo_alloca_round): Define.
+ (extend_alloca): Use it.
+ [_STACK_GROWS_UP]: Correct check for adjacent allocation.
+ * elf/dl-deps.c (_dl_map_object_deps): Don't round alloca size
+ here.
+
* scripts/check-local-headers.sh: Ignore libaudit.h.
* nscd/Makefile (extra-objs): Make recursively expanded.
diff --git a/elf/dl-deps.c b/elf/dl-deps.c
index a1ba3d1d32..565a339331 100644
--- a/elf/dl-deps.c
+++ b/elf/dl-deps.c
@@ -221,15 +221,11 @@ _dl_map_object_deps (struct link_map *map,
if (l->l_searchlist.r_list == NULL && l->l_initfini == NULL
&& l != map && l->l_ldnum > 0)
{
- /* 16-align so extend_alloca has a chance to re-use the space.
- Note that extend_alloca is broken for recent versions of GCC
- on x86: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50938 */
- size_t new_size
- = (l->l_ldnum * sizeof (struct link_map *) + 15) & ~15;
+ size_t new_size = l->l_ldnum * sizeof (struct link_map *);
if (new_size > needed_space_bytes)
needed_space
- = extend_alloca (needed_space, needed_space_bytes, new_size);
+ = extend_alloca (needed_space, needed_space_bytes, new_size);
needed = needed_space;
}
diff --git a/include/alloca.h b/include/alloca.h
index 83504135f4..f741d25d54 100644
--- a/include/alloca.h
+++ b/include/alloca.h
@@ -20,9 +20,13 @@ libc_hidden_proto (__libc_alloca_cutoff)
#include <allocalim.h>
+#ifndef stackinfo_alloca_round
+# define stackinfo_alloca_round(l) (((l) + 15) & -16)
+#endif
+
#if _STACK_GROWS_DOWN
# define extend_alloca(buf, len, newlen) \
- (__typeof (buf)) ({ size_t __newlen = (newlen); \
+ (__typeof (buf)) ({ size_t __newlen = stackinfo_alloca_round (newlen); \
char *__newbuf = __alloca (__newlen); \
if (__newbuf + __newlen == (char *) buf) \
len += __newlen; \
@@ -31,10 +35,10 @@ libc_hidden_proto (__libc_alloca_cutoff)
__newbuf; })
#elif _STACK_GROWS_UP
# define extend_alloca(buf, len, newlen) \
- (__typeof (buf)) ({ size_t __newlen = (newlen); \
+ (__typeof (buf)) ({ size_t __newlen = stackinfo_alloca_round (newlen); \
char *__newbuf = __alloca (__newlen); \
char *__buf = (buf); \
- if (__buf + __newlen == __newbuf) \
+ if (__buf + len == __newbuf) \
{ \
len += __newlen; \
__newbuf = __buf; \