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

Disable broken KEYBD trap for multibyte characters

In UTF-8 locales, ksh breaks when a KEYBD trap is active, even a
dummy no-op one like 'trap : KEYBD'. Entering multi-byte characters
fails (the input is interrupted and a new prompt is displayed) and
pasting content with multi-byte characters produces corrupted
results.

The cause is that the KEYBD trap code is not multibyte-ready.
Unfortunately nobody yet understands the edit.c code well enough
to implement a proper fix. Pending that, this commit implements
a workaround that at least avoids breaking the shell.

src/cmd/ksh93/edit/edit.c: ed_getchar():
- When a multi-byte locale is active, do not trigger the the KEYBD
  trap except for ASCII characters (1-127).

Resolves: https://github.com/ksh93/ksh/issues/307
This commit is contained in:
Martijn Dekker 2022-02-12 21:27:36 +00:00
parent fc5bd8e8c3
commit 4886463bb6
4 changed files with 15 additions and 2 deletions

6
NEWS
View file

@ -3,6 +3,12 @@ For full details, see the git log at: https://github.com/ksh93/ksh/tree/1.0
Any uppercase BUG_* names are modernish shell bug IDs. Any uppercase BUG_* names are modernish shell bug IDs.
2022-02-12:
- In multibyte locales such as UTF-8, shell input is no longer corrupted when
a KEYBD trap is active. However, the KEYBD trap is not yet multibyte ready
and is now only triggered for ASCII characters (1-127) in a multibyte locale.
2022-02-11: 2022-02-11:
- On the interactive shell, tab/esc completion is no longer disabled as a side - On the interactive shell, tab/esc completion is no longer disabled as a side

View file

@ -1122,7 +1122,10 @@ int ed_getchar(register Edit_t *ep,int mode)
killpg(getpgrp(),SIGINT); killpg(getpgrp(),SIGINT);
siglongjmp(ep->e_env, UINTR); siglongjmp(ep->e_env, UINTR);
} }
if(mode<=0 && sh.st.trap[SH_KEYTRAP]) if(mode<=0 && sh.st.trap[SH_KEYTRAP]
/* workaround for <https://github.com/ksh93/ksh/issues/307>:
* do not trigger KEYBD for non-ASCII in multibyte locale */
&& (CC_NATIVE!=CC_ASCII || !mbwide() || c > -128))
{ {
ep->e_keytrap = 1; ep->e_keytrap = 1;
n=1; n=1;

View file

@ -21,7 +21,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-beta.2" /* semantic version number: https://semver.org */ #define SH_RELEASE_SVER "1.0.0-beta.2" /* semantic version number: https://semver.org */
#define SH_RELEASE_DATE "2022-02-11" /* must be in this format for $((.sh.version)) */ #define SH_RELEASE_DATE "2022-02-12" /* must be in this format for $((.sh.version)) */
#define SH_RELEASE_CPYR "(c) 2020-2022 Contributors to ksh " SH_RELEASE_FORK #define SH_RELEASE_CPYR "(c) 2020-2022 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

@ -9062,6 +9062,10 @@ Thus, a trap on
.B CHLD .B CHLD
won't be executed until the foreground job terminates. won't be executed until the foreground job terminates.
.PP .PP
In locales that use a multibyte character set such as UTF-8, the
.B KEYBD
trap is only triggered for ASCII characters (1-127).
.PP
It is a good idea to leave a space after the comma operator in It is a good idea to leave a space after the comma operator in
arithmetic expressions to prevent the comma from being interpreted arithmetic expressions to prevent the comma from being interpreted
as the decimal point character in certain locales. as the decimal point character in certain locales.