1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

Fix ksh exit on syntax error in profile (re: cb67a01b, ceb77b13)

Johnothan King writes:
> There are two regressions related to how ksh handles syntax
> errors in the .kshrc file. If ~/.kshrc or the file pointed to by
> $ENV have a syntax error, ksh exits during startup. Additionally,
> the error message printed is incorrect:
>
> $ cat /tmp/synerror
> ((
> echo foo
>
> # ksh93u+m
> $ ENV=/tmp/synerror arch/*/bin/ksh -ic 'echo ${.sh.version}'
> /tmp/synerror: syntax error: `/t/tmp/synerror' unmatched
>
> # ksh93u+
> $ ENV=/tmp/synerror ksh93u -ic 'echo ${.sh.version}'
> /tmp/synerror: syntax error: `(' unmatched
> Version AJM 93u+ 2012-08-01
>
> The regression that causes the incorrect error message was
> introduced by commit cb67a01. The other bug that causes ksh to
> exit on startup was introduced by commit ceb77b1.

src/cmd/ksh93/sh/lex.c: fmttoken():
- Call stakfreeze(0) to terminate a possible unterminated previous
  stack item before writing the token string onto the stack. This
  fixes the bug with garbage in a syntax error message.

src/cmd/ksh93/sh/main.c: exfile():
- Revert Red Hat's ksh-20140801-diskfull.patch applied in ceb77b13.
  This fixes the bug with interactive ksh exiting on syntax error
  in a profile script. Testing by @JohnoKing showed the patch is no
  longer necessary to fix a login crash on disk full, as commit
  970069a6 (which applied Red Hat patches ksh-20120801-macro.patch
  and ksh-20120801-fd2lost.patch) also fixes that crash.

src/cmd/ksh93/README:
- Fix typos. (re: fdc08b23)

Co-authored-by: Johnothan King <johnothanking@protonmail.com>
Resolves: https://github.com/ksh93/ksh/issues/281
This commit is contained in:
Martijn Dekker 2021-04-21 19:28:46 +01:00
parent fdc08b239b
commit b7dde4e747
6 changed files with 25 additions and 5 deletions

5
NEWS
View file

@ -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. 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: 2021-04-20:
- Fixed three problems with the /opt/ast/bin/getconf built-in command: - Fixed three problems with the /opt/ast/bin/getconf built-in command:

View file

@ -44,7 +44,7 @@ The options have the following defaults and meanings:
built-ins. The value must include double quotes. built-ins. The value must include double quotes.
CRNL off <cr><nl> treated as <nl> in shell grammar. CRNL off <cr><nl> treated as <nl> in shell grammar.
DEVFD Use the more secure /dev/fd mechanism instead of FIFOs for 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.) DYNAMIC on Dynamic loading of builtins. (Requires dlopen() interface.)
ECHOPRINT off Make echo equivalent to print. ECHOPRINT off Make echo equivalent to print.
EDPREDICT on Enables predictive editing. As you type a line beginning 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. 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 RAWONLY on Turn on if the vi line mode doesn't work right unless
you do a set -o viraw. 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. intercepts for testing.
REMOTE off Set --rc (read profile scripts) even if ksh was invoked REMOTE off Set --rc (read profile scripts) even if ksh was invoked
with standard input on a socket, i.e. as a remote shell. with standard input on a socket, i.e. as a remote shell.

View file

@ -20,7 +20,7 @@
#define SH_RELEASE_FORK "93u+m" /* only change if you develop a new ksh93 fork */ #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_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 #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. */ /* Scripts sometimes field-split ${.sh.version}, so don't change amount of whitespace. */

View file

@ -2060,6 +2060,7 @@ static char *fmttoken(Lex_t *lp, register int sym)
return((char*)sh_translate(e_endoffile)); return((char*)sh_translate(e_endoffile));
if(sym==NL) if(sym==NL)
return((char*)sh_translate(e_newline)); return((char*)sh_translate(e_newline));
stakfreeze(0);
stakputc(sym); stakputc(sym);
if(sym&SYMREP) if(sym&SYMREP)
stakputc(sym); stakputc(sym);

View file

@ -424,7 +424,7 @@ static void exfile(register Shell_t *shp, register Sfio_t *iop,register int fno)
sfsync(shp->outpool); sfsync(shp->outpool);
shp->st.execbrk = shp->st.breakcnt = 0; shp->st.execbrk = shp->st.breakcnt = 0;
/* check for return from profile or env file */ /* 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); sh_setstate(states);
goto done; goto done;
@ -603,7 +603,7 @@ done:
} }
if(jmpval == SH_JMPSCRIPT) if(jmpval == SH_JMPSCRIPT)
siglongjmp(*shp->jmplist,jmpval); siglongjmp(*shp->jmplist,jmpval);
else if(jmpval == SH_JMPEXIT || jmpval == SH_JMPERREXIT) else if(jmpval == SH_JMPEXIT)
sh_done(shp,0); sh_done(shp,0);
if(fno>0) if(fno>0)
sh_close(fno); sh_close(fno);

View file

@ -797,5 +797,19 @@ w cd emacste\t123abc
r ^:test-1: cd emacstest/123abc\r\n$ 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)) exit $((Errors<125?Errors:125))