[PATCH 2/2] ash: use alloca to get rid of setjmp

Denys Vlasenko vda.linux at googlemail.com
Mon Jul 13 02:25:19 UTC 2015


Applied, thanks.

On Wed, Jul 1, 2015 at 5:46 PM, Ron Yorston <rmy at frippery.org> wrote:
> Now that the only thing protected by setjmp/longjmp is the saved string,
> we can allocate it on the stack to get rid of the jump.
>
> Based on commit bd35d8e from git://git.kernel.org/pub/scm/utils/dash/dash.git
> by Herbert Xu.
>
> function                                             old     new   delta
> readtoken1                                          3182    3116     -66
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-66)             Total: -66 bytes
>
> Signed-off-by: Ron Yorston <rmy at pobox.com>
> ---
>  shell/ash.c | 36 ++----------------------------------
>  1 file changed, 2 insertions(+), 34 deletions(-)
>
> diff --git a/shell/ash.c b/shell/ash.c
> index 1b33fbd..531e9e2 100644
> --- a/shell/ash.c
> +++ b/shell/ash.c
> @@ -11133,19 +11133,6 @@ 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;
> @@ -11610,30 +11597,16 @@ parsesub: {
>  parsebackq: {
>         struct nodelist **nlpp;
>         union node *n;
> -       char *volatile str;
> -       struct jmploc jmploc;
> -       struct jmploc *volatile savehandler;
> +       char *str;
>         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 = ckmalloc(savelen);
> +               str = alloca(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
> @@ -11732,12 +11705,7 @@ 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