about summary refs log tree commit diff
path: root/include/alloca.h
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 /include/alloca.h
parentd91a8b93aaa8a3d2d9b5fd64e111c5a4eb24d2b9 (diff)
downloadglibc-647776f663e8bb9ee365e0dbabd3702b8cb80bc3.tar.gz
glibc-647776f663e8bb9ee365e0dbabd3702b8cb80bc3.tar.xz
glibc-647776f663e8bb9ee365e0dbabd3702b8cb80bc3.zip
Account for alloca size rounding in extend_alloca
Diffstat (limited to 'include/alloca.h')
-rw-r--r--include/alloca.h10
1 files changed, 7 insertions, 3 deletions
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;				      \