[PATCH 1/2] Revert "ash: use alloca to get rid of setjmp"
Denys Vlasenko
vda.linux at googlemail.com
Sun Jul 19 21:07:13 UTC 2015
I would rather keep it.
What is the "most horrible" thing which can happen here?
On Thu, Jul 16, 2015 at 11:50 AM, Ron Yorston <rmy at frippery.org> wrote:
> This reverts commit 072fc60f29ee3a4ff38f095a9ef149b2e820c8c0.
> Use of alloca is considered unsafe.
>
> Signed-off-by: Ron Yorston <rmy at pobox.com>
> ---
> 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
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
More information about the busybox
mailing list