7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER START
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The contents of this file are subject to the terms of the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Common Development and Distribution License (the "License").
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You may not use this file except in compliance with the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# See the License for the specific language governing permissions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and limitations under the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# When distributing Covered Code, include this CDDL HEADER in each
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# If applicable, add the following below this CDDL HEADER, with the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# fields enclosed by brackets "[]" replaced with your own identifying
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# information: Portions Copyright [yyyy] [name of copyright owner]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER END
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Test whether CR #6766246 ("bug in pattern matching") has been fixed.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Quote from CR #6766246:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ---- snip ----
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The bootstrap script of pkgsrc contains this code
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# checkarg_sane_absolute_path() {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# case "$1" in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "") ;; # the default value will be used.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# *[!-A-Za-z0-9_./]*)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# die "ERROR: Invalid characters in path $1 (from $2)." ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# *) die "ERROR: The argument to $2 must be an absolute path." ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# It turns out, the leading "!" in the pattern is not interpreted
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# as negation, and the first "-" not as a literal. Instead the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# character range "! to A" is constructed. Paths containing "%"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# or "@" are accepted, but paths containing "-" are rejected.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Note that this interpretation makes the whole pattern
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# syntactically wrong, which isn't noticed either.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# case "$1" in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# *[!-A-Za-z0-9_./]*)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# echo invalid characters used in $1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# echo only valid characters used in $1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Expected Result:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# strings containing a "-" should be accepted, strings containing
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# a "@" should be rejected
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Actual Result:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# strings containing a "-" are rejected, strings containing a
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "@" are accepted
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The pattern "*[!A-Za-z0-9_./-]*" (i.e. shifting the dash to
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# the end) works as expected.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ---- snip ----
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin## test 1 (based on the bug report):
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *[!-A-Za-z0-9_./]*)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="foo-bar" ; [[ "$(do_match "${pat}")" == "nomatch" ]] || err_exit "${pat} matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="foo+bar" ; [[ "$(do_match "${pat}")" == "match" ]] || err_exit "${pat} not matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="foo/bar" ; [[ "$(do_match "${pat}")" == "nomatch" ]] || err_exit "${pat} matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="foo_bar" ; [[ "$(do_match "${pat}")" == "nomatch" ]] || err_exit "${pat} matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="foo@bar" ; [[ "$(do_match "${pat}")" == "match" ]] || err_exit "${pat} not matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="foobar-" ; [[ "$(do_match "${pat}")" == "nomatch" ]] || err_exit "${pat} matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="foobar+" ; [[ "$(do_match "${pat}")" == "match" ]] || err_exit "${pat} not matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="foobar/" ; [[ "$(do_match "${pat}")" == "nomatch" ]] || err_exit "${pat} matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="foobar_" ; [[ "$(do_match "${pat}")" == "nomatch" ]] || err_exit "${pat} matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="foobar@" ; [[ "$(do_match "${pat}")" == "match" ]] || err_exit "${pat} not matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="-foobar" ; [[ "$(do_match "${pat}")" == "nomatch" ]] || err_exit "${pat} matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="+foobar" ; [[ "$(do_match "${pat}")" == "match" ]] || err_exit "${pat} not matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="/foobar" ; [[ "$(do_match "${pat}")" == "nomatch" ]] || err_exit "${pat} matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="_foobar" ; [[ "$(do_match "${pat}")" == "nomatch" ]] || err_exit "${pat} matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinpat="@foobar" ; [[ "$(do_match "${pat}")" == "match" ]] || err_exit "${pat} not matched."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin## test 2 (gsf's test chain):
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Make sure LC_COLLATE has a value
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ ${LANG} != "" && "${LC_ALL}" == "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ "${LC_COLLATE}" != "" ]] || err_exit "LC_COLLATE empty."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # retain this line #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[![.-.]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[![.-.][:upper:]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[![.-.]A-Z]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[!-[:upper:]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[[.-.][:upper:]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[[.-.]A-Z]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[-[:upper:]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # retain this line #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $c == $p ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $g == $e ]] || err_exit "[[ '$c' == $p ]] for LC_COLLATE=$l failed -- expected $e, got $g"