[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