Skip to content

Commit

Permalink
Fix syntax error detection in associative array assignments
Browse files Browse the repository at this point in the history
Reproducer:

$ fn=([foo_key]=foo_val [bar_key])
-ksh: [bar_key]: not found

Expected output:
-ksh: syntax error: `[bar_key]' unexpected

As soon as one correct associative array assignment element has
been processed, a subsequent one, starting with '[' but not
containing ']=', is incorrectly seen as a command to execute.
If a command '[bar_key]' existed on $PATH, it would have been run.

src/cmd/ksh93/sh/parse.c: simple():
- In the syntax check for associative array assignments, don't just
  check for an initial '[' but also verify the presence of ']='.

Thanks to @JohnoKing for finding this bug.

Resolves: #427
  • Loading branch information
McDutchie committed Jul 5, 2022
1 parent e4133f9 commit 9c037b0
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ Any uppercase BUG_* names are modernish shell bug IDs.
following a redirection without being an argument to a redirection.
For example, this now writes 'OK' to standard error: cat >&2 <(echo OK)

- Fixed the detection of a syntax error in compound assignments to
associative arays.

2022-07-02:

- Fixed a bug where, if the last command in a subshell was an external
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/ksh93/sh/parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -1507,7 +1507,7 @@ static Shnode_t *simple(Lex_t *lexp,int flag, struct ionod *io)
lexp->token = LBRACE;
break;
}
if(associative && argp->argval[0]!='[')
if(associative && (argp->argval[0]!='[' || !strstr(argp->argval,"]=")))
sh_syntax(lexp);
/* check for assignment argument */
if((argp->argflag&ARG_ASSIGN) && assignment!=2)
Expand Down
11 changes: 11 additions & 0 deletions src/cmd/ksh93/tests/arrays.sh
Original file line number Diff line number Diff line change
Expand Up @@ -830,5 +830,16 @@ exp=$'typeset -A a=([0]=1 [1]=2 [2]=3)\ntypeset -a a=(1 2 3)'
[[ $got == "$exp" ]] || err_exit 'conversion of indexed array to associative fails in subshell' \
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
# ======
# spurious command execution of a word starting with '[' but not containing ']=' in associative array assignments
# https://github.com/ksh93/ksh/issues/427
exp='*: syntax error at line *: `\[badword]'\'' unexpected'
got=$(set +x; PATH=/dev/null; eval 'typeset -A badword=([x]=1 \[badword])' 2>&1)
case $((e=$?)),$got in
3,$exp) ;;
*) err_exit 'spurious command execution in invalid associative array assignment' \
"(expected status 3 and $(printf %q "$exp"), got status $e and $(printf %q "$got"))" ;;
esac
# ======
exit $((Errors<125?Errors:125))

0 comments on commit 9c037b0

Please sign in to comment.