This reverts commit 072fc60f29ee3a4ff38f095a9ef149b2e820c8c0. Use of alloca is considered unsafe.
Signed-off-by: Ron Yorston <[email protected]> --- shell/ash.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/shell/ash.c b/shell/ash.c index f4779ee..6627cec 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -11132,6 +11132,19 @@ readtoken1(int c, int syntax, char *eofmark, int striptabs) IF_ASH_BASH_COMPAT(smallint bash_dollar_squote = 0;) +#if __GNUC__ + /* Avoid longjmp clobbering */ + (void) &out; + (void) "ef; + (void) &dblquote; + (void) &varnest; + (void) &arinest; + (void) &parenlevel; + (void) &dqvarnest; + (void) &oldstyle; + (void) &prevsyntax; + (void) &syntax; +#endif startlinno = g_parsefile->linno; bqlist = NULL; quotef = 0; @@ -11596,16 +11609,30 @@ parsesub: { parsebackq: { struct nodelist **nlpp; union node *n; - char *str; + char *volatile str; + struct jmploc jmploc; + struct jmploc *volatile savehandler; size_t savelen; smallint saveprompt = 0; +#ifdef __GNUC__ + (void) &saveprompt; +#endif + if (setjmp(jmploc.loc)) { + free(str); + exception_handler = savehandler; + longjmp(exception_handler->loc, 1); + } + INT_OFF; str = NULL; savelen = out - (char *)stackblock(); if (savelen > 0) { - str = alloca(savelen); + str = ckmalloc(savelen); memcpy(str, stackblock(), savelen); } + savehandler = exception_handler; + exception_handler = &jmploc; + INT_ON; if (oldstyle) { /* We must read until the closing backquote, giving special * treatment to some slashes, and then push the string and @@ -11704,7 +11731,12 @@ parsebackq: { if (str) { memcpy(out, str, savelen); STADJUST(savelen, out); + INT_OFF; + free(str); + str = NULL; + INT_ON; } + exception_handler = savehandler; USTPUTC(CTLBACKQ, out); if (oldstyle) goto parsebackq_oldreturn; -- 2.4.3 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
