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
9
NEWS
9
NEWS
|
@ -3,11 +3,19 @@ For full details, see the git log at: https://github.com/ksh93/ksh
|
|||
|
||||
Any uppercase BUG_* names are modernish shell bug IDs.
|
||||
|
||||
2021-01-24:
|
||||
|
||||
- Fixed: an unquoted variable expansion evaluated in a DEBUG trap action caused
|
||||
IFS field splitting to be deactivated in code executed after the trap action.
|
||||
This bug was introduced in ksh 93t+ 2009-11-30.
|
||||
|
||||
2021-01-23:
|
||||
|
||||
- Fixed: when the DEBUG trap was redefined in a subshell, the DEBUG trap in
|
||||
the parent environment was corrupted or the shell crashed.
|
||||
When a redirection was used in a DEBUG trap action, the trap was disabled.
|
||||
DEBUG traps were also incorrectly inherited by subshells and ksh functions.
|
||||
All this was caused by a bug introduced in ksh 93t 2008-07-25.
|
||||
|
||||
2021-01-22:
|
||||
|
||||
|
@ -18,6 +26,7 @@ Any uppercase BUG_* names are modernish shell bug IDs.
|
|||
|
||||
- Fixed: executing a DEBUG trap in a command substitution had side effects
|
||||
on the exit status ($?) of non-trap commands.
|
||||
This bug was introduced in ksh 93t 2008-11-04.
|
||||
|
||||
- The typeset builtin command now gives an informative error message if an
|
||||
incompatible combination of options is given.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue