mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Don't allow 'enum' and 'typeset -T' to override special built-ins
Special builtins are undeleteable for a reason. But 'enum' and 'typeset -T' allow overriding them, causing an inconsistent state. @JohnoKing writes: | The behavior is rather buggy, as it appears to successfully | override normal builtins but fails to delete the special | builtins, leading to scenarios where both the original builtin | and type are run: | | $ typeset -T eval=(typeset BAD; typeset TYPE) # This should have failed | $ eval foo=BAD | /usr/bin/ksh: eval: line 1: foo: not found | $ enum trap=(BAD TYPE) # This also should have failed | $ trap foo=BAD | /usr/bin/ksh: trap: condition(s) required | $ enum umask=(BAD TYPE) | $ umask foo=BAD | $ echo $foo | BAD | | # Examples of general bugginess | $ trap bar=TYPE | /usr/bin/ksh: trap: condition(s) required | $ echo $bar | TYPE | $ eval var=TYPE | /usr/bin/ksh: eval: line 1: var: not found | $ echo $var | TYPE This commit fixes the following: The 'enum' and 'typeset -T' commands are no longer allowed to override and replace special built-in commands, except for type definition commands previously created by these commands; these are already (dis)allowed elsewhere. A command like 'typeset -T foo_t' without any assignments no longer creates an incompletely defined 'foo_t' built-in comamnd. Instead, it is now silently ignored for backwards compatibility. This did have a regression test checking for it, but I'm changing it because that's just not a valid use case. An incomplete type definition command does nothing useful and only crashes the shell when run. src/cmd/ksh93/bltins/enum.c: b_enum(): - Do not allow overriding non-type special built-ins. src/cmd/ksh93/sh/name.c: nv_setlist(): - Do not allow 'typeset -T' to override non-type special built-ins. To avoid an inconsistent state, this must be checked for while processing the assignments list before typeset is really invoked. src/cmd/ksh93/bltins_typeset.c: b_typeset(): - Only create a type command if sh.envlist is set, i.e., if some shell assignment(s) were passed to the 'typeset -T' command. Progresses: https://github.com/ksh93/ksh/issues/350
This commit is contained in:
parent
a36b96f9a4
commit
e6d0187dd8
8 changed files with 50 additions and 4 deletions
|
|
@ -161,5 +161,12 @@ then enum PARSER2_t=(a b)
|
|||
fi
|
||||
PATH=/dev/null command -v PARSER2_t >/dev/null && err_exit "PARSER2_t incompletely defined though definition was never executed"
|
||||
|
||||
# ======
|
||||
# https://github.com/ksh93/ksh/issues/350#issuecomment-982168684
|
||||
got=$("$SHELL" -c 'enum trap=(BAD TYPE)' 2>&1)
|
||||
exp=': trap: is a special shell builtin'
|
||||
[[ $got == *"$exp" ]] || err_exit "enum overrides special builtin" \
|
||||
"(expected match of *$(printf %q "$exp"); got $(printf %q "$got"))"
|
||||
|
||||
# ======
|
||||
exit $((Errors<125?Errors:125))
|
||||
|
|
|
|||
|
|
@ -565,8 +565,9 @@ unset z
|
|||
u_t -a x | read z
|
||||
[[ $z == unset ]] && err_exit 'unset discipline called on type creation'
|
||||
|
||||
{ z=$($SHELL 2> /dev/null 'typeset -T foo; typeset -T') ;} 2> /dev/null
|
||||
[[ $z == 'typeset -T foo' ]] || err_exit '"typeset -T foo; typeset -T" failed'
|
||||
got=$("$SHELL" -c 'typeset -T foo; typeset -T' 2>&1)
|
||||
[[ -z $got ]] || err_exit '"typeset -T foo; typeset -T" exposed incomplete type builtin' \
|
||||
"(got $(printf %q "$got"))"
|
||||
|
||||
{ z=$($SHELL 2> /dev/null 'typeset -T foo=bar; typeset -T') ;} 2> /dev/null
|
||||
[[ $z ]] && err_exit '"typeset -T foo=bar" should not creates type foo'
|
||||
|
|
@ -657,5 +658,12 @@ exp='Subsh_t -a v=((typeset -i x=1) (typeset -i x=2) (typeset -i x=3))'
|
|||
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
|
||||
PATH=/dev/null command -v Subsh_t >/dev/null && err_exit "Subsh_t leaked out of subshell"
|
||||
|
||||
# ======
|
||||
# https://github.com/ksh93/ksh/issues/350#issuecomment-982168684
|
||||
got=$("$SHELL" -c 'typeset -T trap=( typeset -i i )' 2>&1)
|
||||
exp=': trap: is a special shell builtin'
|
||||
[[ $got == *"$exp" ]] || err_exit "typeset -T overrides special builtin" \
|
||||
"(expected match of *$(printf %q "$exp"); got $(printf %q "$got"))"
|
||||
|
||||
# ======
|
||||
exit $((Errors<125?Errors:125))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue