diff options
author | Peter Stephenson <p.w.stephenson@ntlworld.com> | 2015-03-29 19:47:01 +0100 |
---|---|---|
committer | Peter Stephenson <p.w.stephenson@ntlworld.com> | 2015-03-29 19:47:01 +0100 |
commit | f1c702f2a4159409b27b9576999614a69a51987d (patch) | |
tree | 947a2fef650080a52feb33e7ae359e0cdae1ed80 | |
parent | b4aa9cdc7641c6c923c1bda1c73111d80be79ba1 (diff) | |
download | zsh-f1c702f2a4159409b27b9576999614a69a51987d.tar.gz zsh-f1c702f2a4159409b27b9576999614a69a51987d.zip |
34817: Catch some errors earlier when reading history.
Mostly for the case of an interrupt.
Don't try to process words when we know something's gone wrong.
Also abort history reading earlier on an interrupt.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Src/hist.c | 6 | ||||
-rw-r--r-- | Src/lex.c | 2 |
3 files changed, 13 insertions, 1 deletions
@@ -1,3 +1,9 @@ +2015-03-29 Peter Stephenson <p.w.stephenson@ntlworld.com> + + * 34817: Src/hist.c, Src/lex.c: catch some errors earlier when + handling history to avoid knock-on errors and doing too much + processing. + 2015-03-29 Theo Buehler <theo@math.ethz.ch> * 34792: Src/Modules/langinfo.c: langinfo: Fix pointer type diff --git a/Src/hist.c b/Src/hist.c index 990e609df..185d0a0d8 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -2604,6 +2604,8 @@ readhistfile(char *fn, int err, int readflags) */ if (uselex || remeta) freeheap(); + if (errflag & ERRFLAG_INT) + break; } if (start && readflags & HFILE_USE_OPTIONS) { zsfree(lasthist.text); @@ -3331,7 +3333,7 @@ bufferwords(LinkList list, char *buf, int *index, int flags) got = 1; cur = num - 1; } - } while (tok != ENDINPUT && tok != LEXERR); + } while (tok != ENDINPUT && tok != LEXERR && !(errflag & ERRFLAG_INT)); if (buf && tok == LEXERR && tokstr && *tokstr) { int plen; untokenize((p = dupstring(tokstr))); @@ -3408,6 +3410,8 @@ histsplitwords(char *lineptr, short **wordsp, int *nwordsp, int *nwordposp, wordlist = bufferwords(NULL, lineptr, NULL, LEXFLAGS_COMMENTS_KEEP); + if (errflag) + return; nwords_max = 2 * countlinknodes(wordlist); if (nwords_max > nwords) { *nwordsp = nwords = nwords_max; @@ -1345,6 +1345,8 @@ gettokstr(int c, int sub) break; } brk: + if (errflag) + return LEXERR; hungetc(c); if (unmatched) zerr("unmatched %c", unmatched); |