1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

Fix ERE repetition expressions in [[ ... =~ ERE{x,y} ]] (#54)

Regular expressions that combine a repetition expression with
a parenthesized sub-expression throw a garbled syntax error:

$ [[ AATAAT =~ (AAT){2} ]]
ksh: syntax error: `~(E)(AAT){2} ]]
:'%Cred%h%Creseksh: syntax error: `~(E)(AAT){2} ]]
:'%Cred%h%Creseksh: syntax' unexpected

The syntax error occurs because ksh is not fully
accounting for '=~' when it runs into a curly bracket.
This fix disables the syntax error when the operator
is '=~' and adds handling for '(str){x}' (to allow for
more than one sub-expression). This bugfix and the
regression tests for it were backported from ksh93v-
2014-12-24-beta.

src/cmd/ksh93/sh/lex.c:
- Do not trigger a syntax error for '{x}' when the operator
  is '=~' and add handling for multiple parentheses when
  combined with '{x}'.

src/cmd/ksh93/tests/bracket.sh:
- Add two tests from ksh93v- to test sub-expressions
  combined with the '{x}' quantifier.
This commit is contained in:
Johnothan King 2020-07-02 10:40:15 -07:00 committed by GitHub
parent ad9a9219f0
commit db1d539d49
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 1 deletions

3
NEWS
View file

@ -8,6 +8,9 @@ Any uppercase BUG_* names are modernish shell bug IDs.
- 'read -u' will no longer crash with a memory fault when given an out of
range or negative file descriptor.
- The '=~' operator no longer raises an error if a regular expression
combines the '{x}' quantifier with a sub-expression.
2020-06-28:
- Variables created with 'typeset -RF' no longer cause a memory fault

View file

@ -388,6 +388,12 @@ int sh_lex(Lex_t* lp)
switch(n)
{
case S_BREAK:
if(lp->lex.incase>TEST_RE && mode==ST_NORM && c==LPAREN)
{
pushlevel(lp,RPAREN,mode);
mode = ST_NESTED;
continue;
}
fcseek(-LEN);
goto breakloop;
case S_EOF:
@ -1163,7 +1169,7 @@ int sh_lex(Lex_t* lp)
}
if(mode==ST_NONE)
return(0);
if(c!=n)
if(c!=n && lp->lex.incase<TEST_RE)
{
lp->token = c;
sh_syntax(lp);

View file

@ -388,5 +388,10 @@ var=$(echo begin; exec >/dev/tty; [ -t 1 ] && test -t 1 && [[ -t 1 ]]) \
test 123 -eq 123x 2>/dev/null
[[ $? -ge 2 ]] || err_exit 'test builtin should return value greater than 1 on error'
# ======
# The '=~' operator should work with curly brackets
$SHELL -c '[[ AATAAT =~ (AAT){2} ]]' || err_exit '[[ AATAAT =~ (AAT){2} ]] does not match'
$SHELL -c '[[ AATAATCCCAATAAT =~ (AAT){2}CCC(AAT){2} ]]' || err_exit '[[ AATAATCCCAATAAT =~ (AAT){2}CCC(AAT){2} ]] does not match'
# ======
exit $((Errors<125?Errors:125))