9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# CDDL HEADER START
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# The contents of this file are subject to the terms of the
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# Common Development and Distribution License (the "License").
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# You may not use this file except in compliance with the License.
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# or http://www.opensolaris.org/os/licensing.
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# See the License for the specific language governing permissions
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# and limitations under the License.
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# When distributing Covered Code, include this CDDL HEADER in each
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# If applicable, add the following below this CDDL HEADER, with the
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# fields enclosed by brackets "[]" replaced with your own identifying
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# information: Portions Copyright [yyyy] [name of copyright owner]
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# CDDL HEADER END
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# This test checks whether ksh93 does unneccesaty |libc::getpwnam()|
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# calls for "~(modifer)pattern"-style shell patterns
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# This was reported as CR #6807179 ("ksh93 does unneccesary |libc::getpwnam()| lookups for ~(modifier) pattern patterns"):
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# ------------ snip ------------
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# ksh93 does unneccesary |libc::getpwnam()| lookups for
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# ~(modifer)pattern patterns, e.g. [[ $foo == ~(E)hello.*world ]].
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# The problem is that the shell ~(modifer)pattern is an extended
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# pattern syntax which allows to specify a "modifer" to change
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# the behaviour for "pattern". However the '~' at the beginning
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# of this string is causing a tilde expansion (or better: It's
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# filling an internal buffer as preparation for tilde expansion
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# and this code calls |libc::getpwnam()|) which shouldn't be
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# done in this case.
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# [1]=For example the "modifer" allows to specifcy "perl",
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# "fgrep", "grep", "egrep", "POSIX shell", "korn shell" and
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# other types of pattern matching systems (or select stuff
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# like archors, case-insensitive matching etc. etc.).
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# ------------ snip ------------
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik#
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# test setup
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dikfunction err_exit
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik{
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik print -u2 -n "\t"
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik print -u2 -r ${Command}[$1]: "${@:2}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner (( Errors < 127 && Errors++ ))
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik}
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dikalias err_exit='err_exit $LINENO'
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dikset -o nounset
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. DikCommand=${0##*/}
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dikinteger Errors=0
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Diktypeset tmpfile
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknertmpfile="$(mktemp -t "sun_solaris_cr_6807179_shellpattern_uses_getpwnam.${PPID}.$$.XXXXXX")" || err_exit "Cannot create temporary file."
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dikrm -f "${tmpfile}"
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# test 1: Check if the shell uses |libc::getpwnam()| for pattern "~(Elr)wo.*ld"
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Diktruss -u :: -o "${tmpfile}" ${SHELL} -c '[[ ${hello} == ~(Elr)wo.*ld ]] ; true' || err_exit "truss returned failure=$?"
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik[[ "$( < "${tmpfile}")" != *getpwnam* ]] || err_exit "truss log reports the use of getpwnam() for pattern ~(Elr)wo.*ld"
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dikrm "${tmpfile}" || err_exit "rm ${tmpfile} failed."
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# test 2: Check if the shell uses |libc::getpwnam()| for pattern "~(Si)wo*ld"
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Diktruss -u :: -o "${tmpfile}" ${SHELL} -c '[[ ${hello} == ~(Si)wo*ld ]] ; true' || err_exit "truss returned failure=$?"
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik[[ "$( < "${tmpfile}")" != *getpwnam* ]] || err_exit "truss log reports the use of getpwnam() for pattern ~(Si)wo*ld"
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dikrm "${tmpfile}" || err_exit "rm ${tmpfile} failed."
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# test 3: Same as test 1 but uses ~root/ as pattern which will force the use of |libc::getpwnam()|
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dikgetent passwd root >/dev/null || err_exit "getent passwd root failed" # safeguard to make sure we get a warning if user root is missing
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Diktruss -u :: -o "${tmpfile}" ${SHELL} -c '[[ ${hello} == ~root/ ]] ; true' || err_exit "truss returned failure=$?"
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik[[ "$( < "${tmpfile}" )" == *getpwnam* ]] || err_exit "truss log reports the use of getpwnam() for pattern ~root/"
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dikrm "${tmpfile}" || err_exit "rm ${tmpfile} failed."
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dik# tests done
9a6f360e750e0b14fc9b9bf8347e0ebad3959e3fCasper H.S. Dikexit $((Errors))