7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER START
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
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#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# or http://www.opensolaris.org/os/licensing.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# See the License for the specific language governing permissions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and limitations under the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
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#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER END
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Test whether CR #6766246 ("bug in pattern matching") has been fixed.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
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# /*) ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# *) die "ERROR: The argument to $2 must be an absolute path." ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# }
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#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Test case:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# -- snip --
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# !/bin/sh
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# case "$1" in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# *[!-A-Za-z0-9_./]*)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# echo invalid characters used in $1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# *)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# echo only valid characters used in $1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# -- snip --
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# Workaround
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
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test setup
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction err_exit
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -n "\t"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -r ${Command}[$1]: "${@:2}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner (( Errors < 127 && Errors++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinalias err_exit='err_exit $LINENO'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset -o nounset
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzCommand=${0##*/}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger Errors=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin## test 1 (based on the bug report):
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction do_match
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case "$1" in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *[!-A-Za-z0-9_./]*)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print "match"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print "nomatch"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset pat
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
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
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin## test 2 (gsf's test chain):
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Make sure LC_COLLATE has a value
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ "${LC_COLLATE}" == "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ ${LANG} != "" && "${LC_ALL}" == "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin LC_COLLATE="${LANG}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ "${LC_ALL}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin LC_COLLATE="${LC_ALL}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[[ "${LC_COLLATE}" != "" ]] || err_exit "LC_COLLATE empty."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinset -- \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 'A' 0 1 1 0 1 1 1 0 0 1 0 0 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 'Z' 0 1 1 0 1 1 1 0 0 1 0 0 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '/' 0 0 0 0 0 0 1 1 1 1 1 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '.' 0 0 0 0 0 0 1 1 1 1 1 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '_' 0 0 0 0 0 0 1 1 1 1 1 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '-' 1 1 1 1 1 1 0 0 0 0 0 0 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '%' 0 0 0 0 0 0 1 1 1 1 1 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '@' 0 0 0 0 0 0 1 1 1 1 1 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '!' 0 0 0 0 0 0 1 1 1 1 1 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '^' 0 0 0 0 0 0 1 1 1 1 1 1 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # retain this line #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwhile (( $# >= 13 )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin c=$1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shift
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for p in \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[![.-.]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[![.-.][:upper:]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[![.-.]A-Z]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[!-]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[!-[:upper:]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[!-A-Z]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[[.-.]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[[.-.][:upper:]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[[.-.]A-Z]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[-]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[-[:upper:]]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin '[-A-Z]' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # retain this line #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin do e=$1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shift
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $c == $p ]]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin g=$?
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ $g == $e ]] || err_exit "[[ '$c' == $p ]] for LC_COLLATE=$l failed -- expected $e, got $g"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# tests done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexit $((Errors))