On 09/02/2016 09:04 AM, Herbert Xu wrote: >> Yes, this looks like a bug in dash. With the default --disable-fnmatch >> code, when dash encounters [ in a pattern, it immediately treats the >> following characters as part of the set. If it then encounters the end >> of the pattern without having seen a matching ], it attempts to reset >> the state and continue as if [ was treated as a literal character right >> from the start.
>
> POSIX says:
>
> 9.3.3 BRE Special Characters
>
> A BRE special character has special properties in certain contexts.
...
> An
> expression containing a '[' that is not preceded by a backslash
> and is not part of a bracket expression produces undefined results.
Ah, but POSIX also says:
2.13.1 Patterns Matching a Single Character
[
If an open bracket introduces a bracket expression as in XBD RE
Bracket Expression, except that the <exclamation-mark> character ( '!' )
shall replace the <circumflex> character ( '^' ) in its role in a
non-matching list in the regular expression notation, it shall introduce
a pattern bracket expression. A bracket expression starting with an
unquoted <circumflex> character produces unspecified results. Otherwise,
'[' shall match the character itself.
So while a lone '[' is unspecified in a normal BRE, it is well-defined
in a shell filename pattern matching context. Since '[' is not a
bracket expression, it MUST be treated as a literal '[', so ${foo#[}
MUST strip the leading [ from the contents of foo, without requiring
that the [ be quoted.
>
>> This also affects
>>
>> case [a in [?) echo ok ;; *) echo bad ;; esac
>>
>> which should print ok.
>
> Even ksh prints bad here.
So ksh is also buggy.
>
> I would however consider a patch that simplifies the code in the
> undefined case.
Except that it is well-defined by POSIX, not undefined.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
