diff --git a/NEWS b/NEWS index 9868bedc7..77f69e4ce 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,11 @@ For full details, see the git log at: https://github.com/ksh93/ksh Any uppercase BUG_* names are modernish shell bug IDs. +2021-04-21: + +- Fixed a bug introduced on 2020-09-28 that caused an interactive ksh to exit + if a profile script (such as ~/.kshrc) contains a syntax error. + 2021-04-20: - Fixed three problems with the /opt/ast/bin/getconf built-in command: diff --git a/src/cmd/ksh93/README b/src/cmd/ksh93/README index eb4eaddaf..051c5d3da 100644 --- a/src/cmd/ksh93/README +++ b/src/cmd/ksh93/README @@ -44,7 +44,7 @@ The options have the following defaults and meanings: built-ins. The value must include double quotes. CRNL off treated as in shell grammar. DEVFD Use the more secure /dev/fd mechanism instead of FIFOs for - proces substitutions. On by default on OSs with /dev/fd. + process substitutions. On by default on OSs with /dev/fd. DYNAMIC on Dynamic loading of builtins. (Requires dlopen() interface.) ECHOPRINT off Make echo equivalent to print. EDPREDICT on Enables predictive editing. As you type a line beginning @@ -84,7 +84,7 @@ The options have the following defaults and meanings: value will require the -p flag to run suid/sgid scripts. RAWONLY on Turn on if the vi line mode doesn't work right unless you do a set -o viraw. - REGRESS off Enable the __regress__ built-in command and instrumented + REGRESS off Enable the __regress__ built-in command and instrumented intercepts for testing. REMOTE off Set --rc (read profile scripts) even if ksh was invoked with standard input on a socket, i.e. as a remote shell. diff --git a/src/cmd/ksh93/include/version.h b/src/cmd/ksh93/include/version.h index f7ff7143e..b9725ca5c 100644 --- a/src/cmd/ksh93/include/version.h +++ b/src/cmd/ksh93/include/version.h @@ -20,7 +20,7 @@ #define SH_RELEASE_FORK "93u+m" /* only change if you develop a new ksh93 fork */ #define SH_RELEASE_SVER "1.0.0-alpha" /* semantic version number: https://semver.org */ -#define SH_RELEASE_DATE "2021-04-20" /* must be in this format for $((.sh.version)) */ +#define SH_RELEASE_DATE "2021-04-21" /* must be in this format for $((.sh.version)) */ #define SH_RELEASE_CPYR "(c) 2020-2021 Contributors to ksh " SH_RELEASE_FORK /* Scripts sometimes field-split ${.sh.version}, so don't change amount of whitespace. */ diff --git a/src/cmd/ksh93/sh/lex.c b/src/cmd/ksh93/sh/lex.c index d6f6a4b2a..bdb575818 100644 --- a/src/cmd/ksh93/sh/lex.c +++ b/src/cmd/ksh93/sh/lex.c @@ -2060,6 +2060,7 @@ static char *fmttoken(Lex_t *lp, register int sym) return((char*)sh_translate(e_endoffile)); if(sym==NL) return((char*)sh_translate(e_newline)); + stakfreeze(0); stakputc(sym); if(sym&SYMREP) stakputc(sym); diff --git a/src/cmd/ksh93/sh/main.c b/src/cmd/ksh93/sh/main.c index 86ca971f3..0ff17205a 100644 --- a/src/cmd/ksh93/sh/main.c +++ b/src/cmd/ksh93/sh/main.c @@ -424,7 +424,7 @@ static void exfile(register Shell_t *shp, register Sfio_t *iop,register int fno) sfsync(shp->outpool); shp->st.execbrk = shp->st.breakcnt = 0; /* check for return from profile or env file */ - if(sh_isstate(SH_PROFILE) && (jmpval==SH_JMPFUN || jmpval==SH_JMPEXIT || jmpval==SH_JMPERREXIT)) + if(sh_isstate(SH_PROFILE) && (jmpval==SH_JMPFUN || jmpval==SH_JMPEXIT)) { sh_setstate(states); goto done; @@ -603,7 +603,7 @@ done: } if(jmpval == SH_JMPSCRIPT) siglongjmp(*shp->jmplist,jmpval); - else if(jmpval == SH_JMPEXIT || jmpval == SH_JMPERREXIT) + else if(jmpval == SH_JMPEXIT) sh_done(shp,0); if(fno>0) sh_close(fno); diff --git a/src/cmd/ksh93/tests/pty.sh b/src/cmd/ksh93/tests/pty.sh index 042630086..6ee7cfaa3 100755 --- a/src/cmd/ksh93/tests/pty.sh +++ b/src/cmd/ksh93/tests/pty.sh @@ -797,5 +797,19 @@ w cd emacste\t123abc r ^:test-1: cd emacstest/123abc\r\n$ ! +# err_exit # +echo '((' >$tmp/synerror +ENV=$tmp/synerror tst $LINENO <<"!" +L syntax error in profile causes exit on startup +# https://github.com/ksh93/ksh/issues/281 + +d 15 +r /synerror: syntax error: `\(' unmatched\r\n$ +p :test-1: +w echo ok +r ^:test-1: echo ok\r\n$ +r ^ok\r\n$ +! + # ====== exit $((Errors<125?Errors:125))