sh: Fix '-' from quoted arithmetic in case/glob pattern range.

It does not make much sense to generate the '-' in a pattern bracket
expression using arithmetic expansion, but it does not make sense to forbid
it either.

Try to avoid reprocessing the string if it is unnecessary.
This commit is contained in:
jilles 2017-05-14 13:14:19 +00:00
parent 2910c97c08
commit a1b7b6531d
3 changed files with 20 additions and 2 deletions

View File

@ -440,8 +440,15 @@ expari(const char *p, struct nodelist **restrict argbackq, int flag,
fmtstr(expdest, DIGITS(result), ARITH_FORMAT_STR, result);
adj = strlen(expdest);
STADJUST(adj, expdest);
if (!quoted)
reprocess(expdest - adj - stackblock(), flag, VSNORMAL, 0, dst);
/*
* If this is quoted, a '-' must not indicate a range in [...].
* If this is not quoted, splitting may occur.
*/
if (quoted ?
result < 0 && begoff > 1 && flag & (EXP_GLOB | EXP_CASE) :
flag & EXP_SPLIT)
reprocess(expdest - adj - stackblock(), flag, VSNORMAL, quoted,
dst);
return p;
}

View File

@ -41,6 +41,7 @@ ${PACKAGE}FILES+= case18.0
${PACKAGE}FILES+= case19.0
${PACKAGE}FILES+= case20.0
${PACKAGE}FILES+= case21.0
${PACKAGE}FILES+= case22.0
${PACKAGE}FILES+= cd1.0
${PACKAGE}FILES+= cd2.0
${PACKAGE}FILES+= cd3.0

View File

@ -0,0 +1,10 @@
# $FreeBSD$
case 5 in
[0"$((-9))"]) echo bad1 ;;
esac
case - in
[0"$((-9))"]) ;;
*) echo bad2 ;;
esac