34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# CDDL HEADER START
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# The contents of this file are subject to the terms of the
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Common Development and Distribution License (the "License").
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# You may not use this file except in compliance with the License.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# or http://www.opensolaris.org/os/licensing.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# See the License for the specific language governing permissions
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# and limitations under the License.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# When distributing Covered Code, include this CDDL HEADER in each
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# If applicable, add the following below this CDDL HEADER, with the
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# fields enclosed by brackets "[]" replaced with your own identifying
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# information: Portions Copyright [yyyy] [name of copyright owner]
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# CDDL HEADER END
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# This test checks whether ksh93 does not execute builtin command
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# "foo" when referencing variable "foo" when the variable is not
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# set (this applies to all builtin commands not bound to a
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# specific PATH element, e.g. "test", "sleep", "print" etc.).
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# This was reported as CR #6848486 ('"echo ${test}" with test
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# undefined crashes the shell')
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ------------ snip ------------
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# This is an odd one:
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# $ ksh93 --version
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# version sh (AT&T Research) 93t 2008-11-04
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# $ ksh93
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# jl138328@gir:~$ echo $test
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# jl138328@gir:~$ echo ${test}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Segmentation Fault (core dumped)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ------------ snip ------------
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# The bug originates from the ksh93 "type system" which allows
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# an application to define it's own types in ksh93. In such cases
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# the output of function "mytype.len" is used when type "mytype"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# has no member variable "len" (note it requires the use of
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# ${foo} since the use of $foo does not allow "foo" to contain
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# a dot in the variable name).
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# The implementation in ast-ksh.2009-11-04 however does this
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# for _all_ types of variables and not only for those which
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# are a member of an application-defined type, therefore
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# causing this bug.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test setup
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzfunction err_exit
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -u2 -n "\t"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -u2 -r ${Command}[$1]: "${@:2}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner (( Errors < 127 && Errors++ ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzalias err_exit='err_exit $LINENO'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset -o nounset
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzCommand=${0##*/}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzinteger Errors=0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Test 1: Test whether the shell crashes when looking for an empty
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# "shell" variable.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# (note: return code 78 was just picked randomly)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz$SHELL -c 'unset test ; print ${test} ; exit 78' >/dev/null 2>&1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz(( $? == 78 )) || err_exit "expected return code is 78, got $?"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Test 2: Test whether the shell can reach a point (which prints
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# "#mark") after the use of ${test} in the script.
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzout=$($SHELL -o errexit -c 'unset test ; print ${test} ; print "#mark"' 2>&1 ) || err_exit "Shell returned error code $?, expected 0."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ "$out" == $'\n#mark' ]] || err_exit "Expected output \$'\n#mark', got '${out}'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# Test 3: Check whether the use of ${sleep} returns nothing
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# (ast-ksh.2008-11-04 will return the usage string of the sleep
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# builtin)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzout=$($SHELL -o errexit -c 'print ${sleep} ; print "#mark"' 2>&1 ) || err_exit "Shell returned error code $?, expected 0."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[[ "$out" == $'\n#mark' ]] || err_exit "Expected output \$'\n#mark', got '${out}'"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# tests done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzexit $((Errors))