From dce1f33c02c855e9d5f588716d7e9ddaea3887ba Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Wed, 1 Jul 2015 21:44:50 +0100 Subject: 35667: fix command substitution that starts but doesn't finish in alias --- Src/lex.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'Src/lex.c') diff --git a/Src/lex.c b/Src/lex.c index baeed1365..910773ca4 100644 --- a/Src/lex.c +++ b/Src/lex.c @@ -162,7 +162,7 @@ static int lex_add_raw; /* variables associated with the above */ -static char *tokstr_raw; +static char *tokstr_raw, *lexbuf_ptr_start; static struct lexbufstate lexbuf_raw; /* text of punctuation tokens */ @@ -229,12 +229,13 @@ lex_context_save(struct lex_stack *ls, int toplevel) ls->lex_add_raw = lex_add_raw; ls->tokstr_raw = tokstr_raw; ls->lexbuf_raw = lexbuf_raw; + ls->lexbuf_ptr_start = lexbuf_ptr_start; ls->lexstop = lexstop; ls->toklineno = toklineno; tokstr = zshlextext = lexbuf.ptr = NULL; lexbuf.siz = 256; - tokstr_raw = lexbuf_raw.ptr = NULL; + tokstr_raw = lexbuf_raw.ptr = lexbuf_ptr_start = NULL; lexbuf_raw.siz = lexbuf_raw.len = lex_add_raw = 0; } @@ -257,6 +258,7 @@ lex_context_restore(const struct lex_stack *ls, int toplevel) lex_add_raw = ls->lex_add_raw; tokstr_raw = ls->tokstr_raw; lexbuf_raw = ls->lexbuf_raw; + lexbuf_ptr_start = ls->lexbuf_ptr_start; lexstop = ls->lexstop; toklineno = ls->toklineno; } @@ -1882,7 +1884,7 @@ zshlex_raw_add(int c) void zshlex_raw_back(void) { - if (!lex_add_raw) + if (!lex_add_raw || lexbuf_raw.ptr == lexbuf_ptr_start) return; lexbuf_raw.ptr--; lexbuf_raw.len--; @@ -1993,7 +1995,7 @@ skipcomm(void) cmdpop(); return lexstop; #else - char *new_tokstr; + char *new_tokstr, *new_lexbuf_ptr_start; int new_lexstop, new_lex_add_raw; struct lexbufstate new_lexbuf; @@ -2040,6 +2042,7 @@ skipcomm(void) } tokstr_raw = new_tokstr; lexbuf_raw = new_lexbuf; + lexbuf_ptr_start = lexbuf_raw.ptr; lex_add_raw = new_lex_add_raw; /* * Don't do any ZLE specials down here: they're only needed @@ -2064,6 +2067,7 @@ skipcomm(void) */ new_tokstr = tokstr_raw; new_lexbuf = lexbuf_raw; + new_lexbuf_ptr_start = lexbuf_ptr_start; /* * We're also going to propagate the lexical state: * if we couldn't parse the command substitution we @@ -2079,6 +2083,7 @@ skipcomm(void) */ tokstr_raw = new_tokstr; lexbuf_raw = new_lexbuf; + lexbuf_ptr_start = new_lexbuf_ptr_start; } else { if (!new_lexstop) { /* Ignore the ')' added on input */ @@ -2093,6 +2098,7 @@ skipcomm(void) tokstr = new_tokstr; lexbuf = new_lexbuf; lexstop = new_lexstop; + lexbuf_ptr_start = (char *)NULL; hist_in_word(0); } -- cgit 1.4.1