diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2011-11-01 18:05:31 +0100 |
---|---|---|
committer | Andreas Schwab <schwab@linux-m68k.org> | 2011-11-01 18:29:34 +0100 |
commit | 647776f663e8bb9ee365e0dbabd3702b8cb80bc3 (patch) | |
tree | 77affe2269ba680a6239396a9cb589283963fc71 /include/alloca.h | |
parent | d91a8b93aaa8a3d2d9b5fd64e111c5a4eb24d2b9 (diff) | |
download | glibc-647776f663e8bb9ee365e0dbabd3702b8cb80bc3.zip glibc-647776f663e8bb9ee365e0dbabd3702b8cb80bc3.tar.gz glibc-647776f663e8bb9ee365e0dbabd3702b8cb80bc3.tar.bz2 |
Account for alloca size rounding in extend_alloca
Diffstat (limited to 'include/alloca.h')
-rw-r--r-- | include/alloca.h | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/include/alloca.h b/include/alloca.h index 8350413..f741d25 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; \ |