mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix KEYBD
trap crash when inputting a command substitution (#355)
This change fixes a crash that can occur after setting a KEYBD trap then inputting a multi-line command substitution. The crash is similar to issue #347, but it's easier to reproduce since it doesn't require you to setup a kshrc file. Reproducer for the crash: $ ENV=/./dev/null ksh $ trap : KEYBD $ : $( > true) Memory fault(coredump) The bugfix was backported (with considerable changes) from ksh93v- 2013-10-08. The crash was first reported on the old mailing list: https://www.mail-archive.com/ast-users@lists.research.att.com/msg00313.html src/cmd/ksh93/{include/shlex.h,sh/lex.c}: - To fix this properly, we need sizeof(Lex_t) to work as expected in edit.c, but that is thwarted by the _SHLEX_PRIVATE macro in lex.c which shlex.h uses to add private structs to the Lex_t type in lex.c only. So get rid of that _SHLEX_PRIVATE macro and make those members part of the centrally defined struct, renaming them to make it clear they're considered private to lex.c. src/cmd/ksh93/edit/edit.c: - Now that we can get its size, save and restore the shell lexing context when a KEYBD trap is present. src/cmd/ksh93/tests/pty.sh: - Add a regression test for the KEYBD trap crash. Co-authored-by: Martijn Dekker <martijn@inlv.org>
This commit is contained in:
parent
bfad44e56d
commit
370440473e
5 changed files with 70 additions and 52 deletions
|
@ -52,10 +52,11 @@
|
|||
#include "terminal.h"
|
||||
#include "history.h"
|
||||
#include "edit.h"
|
||||
#include "shlex.h"
|
||||
|
||||
static char CURSOR_UP[20] = { ESC, '[', 'A', 0 };
|
||||
static char KILL_LINE[20] = { ESC, '[', 'J', 0 };
|
||||
|
||||
static Lex_t *savelex;
|
||||
|
||||
|
||||
#if SHOPT_MULTIBYTE
|
||||
|
@ -230,6 +231,8 @@ int tty_set(int fd, int action, struct termios *tty)
|
|||
void tty_cooked(register int fd)
|
||||
{
|
||||
register Edit_t *ep = (Edit_t*)(shgd->ed_context);
|
||||
if(ep->sh->st.trap[SH_KEYTRAP] && savelex)
|
||||
memcpy(ep->sh->lex_context,savelex,sizeof(Lex_t));
|
||||
ep->e_keytrap = 0;
|
||||
if(ep->e_raw==0)
|
||||
return;
|
||||
|
@ -845,6 +848,12 @@ void ed_setup(register Edit_t *ep, int fd, int reedit)
|
|||
ep->e_lbuf[n] = *pp++;
|
||||
ep->e_default = 0;
|
||||
}
|
||||
if(ep->sh->st.trap[SH_KEYTRAP])
|
||||
{
|
||||
if(!savelex)
|
||||
savelex = (Lex_t*)sh_malloc(sizeof(Lex_t));
|
||||
memcpy(savelex, ep->sh->lex_context, sizeof(Lex_t));
|
||||
}
|
||||
}
|
||||
#endif /* SHOPT_ESH || SHOPT_VSH */
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue