mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix field splitting bug triggered by DEBUG trap
An unquoted variable expansion evaluated in a DEBUG trap action caused IFS field splitting to be deactivated in code executed after the trap action. Thanks to Koichi Nakashima for the reproducer: | v='' | trap ': $v' DEBUG | A="a b c" | set -- $A | printf '%s\n' "$@" | | Expected | | a | b | c | | Actual | | a b c src/cmd/ksh93/sh/fault.c: sh_trap(): - Remove incorrect save/restore of sh.ifstable, the internal state table for field splitting. This reverts three lines added in ksh 93t+ 2009-11-30. Analysis: As an expansion is split into fields (macro.c, lines 2367-2471), sh.ifstable is modified. If that happens within a DEBUG trap, any modifications in ifstable are undone by the restoring memccpy, leaving an inconsistent state. src/cmd/ksh93/COMPATIBILITY: - Document the DEBUG trap fixes, particularly the incorrect inheritance by subshells and functions that some scripts may now rely on because this bug is so longstanding. (re:2a835a2d
) src/cmd/ksh93/tests/basic.sh: - Add relevant tests. Resolves: https://github.com/ksh93/ksh/issues/155 TODO: add a -T (-o functrace) option as in bash, which should allow subshells and ksh-style functions to inherit DEBUG traps. P.S.: The very handy multishell repo allows us to use 'git blame' to trace the origin of the recently fixed DEBUG trap bugs. The off-by-one error causing various bugs, reverted in2a835a2d
, was introduced in ksh 93t 2008-07-25:8e947ccf
(fault.c, line 321) The incorrect check causing the exit status bug, reverted ind00b4b39
, was introduced in ksh 93t 2008-11-04:b1ade268
(fault.c, line 459) The ifstable save/restore causing the field splitting bug, reverted in this commit, was introduced in ksh 93t+ 2009-11-30:53d9f009
(fault.c, lines 440, 444, 482) So all the bugs reported in #155 were fixed by simply reverting these specific changes. I think that they are some experiments that the developers simply forgot to remove. I've suspected such a thing multiple times before. ksh93 was developed by researchers who were genius innovators, but incredibly sloppy maintainers.
This commit is contained in:
parent
e664b78f98
commit
70368c57d6
5 changed files with 70 additions and 7 deletions
|
@ -451,11 +451,9 @@ int sh_trap(const char *trap, int mode)
|
|||
int was_verbose = sh_isstate(SH_VERBOSE);
|
||||
int staktop = staktell();
|
||||
char *savptr = stakfreeze(0);
|
||||
char ifstable[256];
|
||||
struct checkpt buff;
|
||||
Fcin_t savefc;
|
||||
fcsave(&savefc);
|
||||
memcpy(ifstable,shp->ifstable,sizeof(ifstable));
|
||||
sh_offstate(SH_HISTORY);
|
||||
sh_offstate(SH_VERBOSE);
|
||||
shp->intrap++;
|
||||
|
@ -493,7 +491,6 @@ int sh_trap(const char *trap, int mode)
|
|||
shp->exitval=savxit;
|
||||
stakset(savptr,staktop);
|
||||
fcrestore(&savefc);
|
||||
memcpy(shp->ifstable,ifstable,sizeof(ifstable));
|
||||
if(was_history)
|
||||
sh_onstate(SH_HISTORY);
|
||||
if(was_verbose)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue