David Korn wrote:
[snip]
> > === *Description* 
> > ============================================================
> > ksh93 dumps core when an array variable previously declared with "set -A 
> > vname"
> > is reinitialized
> > by redeclaring it using "set -A vname".
> >
> > By reinitializing, we mean throwing away all array data that has been 
> > assigned s
> > o far and
> > recreating the array as a freshly created 'set -A' variable would -- with 
> > no ini
> > tial data
> > until specifically assigned.
> >
> > Attached are a script that reproduces the bug and a core file produced when 
> > the
> > script was run.
> >
> > *** (#1 of 1): 2008-06-17 13:57:39 GMT+00:00 <User 1-5Q-8946>
> >
> > === *Workaround* 
> > =============================================================
> > Instead of using simply 'set -A vname' to reinitialize the array, use
> >         set -A vname -- ""
> > This creates an array of size 1.
> >
> > Do note that this is NOT exactly identical to "set -A vname" which
> > creates an array of ZERO size (i.e., ${vname[*]} returns 0).
> >
> > *** (#1 of 2): 2008-06-17 13:57:39 GMT+00:00 <User 1-5Q-8946>
> >
> > AFAIK it should be possible to do an $ unset arrayname # before the $ set 
> > -A arr
> > ayname # to work around this problem, too.
> >
> > *** (#2 of 2): 2008-06-17 20:09:48 GMT+00:00 <User 1-6Y4MMS>
> 
> I tried to reproduce on Linux without success with the following:
> ============cut here==========
> set -A vname  -- foo bar
> set -A vname
> ============cut here==========
> 
> Is this correct?  If not, what sequence reproduces it?

Attached (as "coreme.ksh") is Ravindra's test script which triggers the
failure for ast-ksh.2007-04-18 ...

----

Bye,
Roland

-- 
  __ .  . __
 (o.\ \/ /.o) roland.mainz at nrubsig.org
  \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
  /O /==\ O\  TEL <currently fluctuating>
 (;O/ \/ \O;)
-------------- next part --------------
#!/usr/bin/ksh93 -p
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I%     %E% SMI"

function create_input_file
{
        input_file=/tmp/coreme.txt
        cp -f /dev/null /tmp/coreme.txt

        cat > /tmp/coreme.txt <<EOF
Z "-z ls" "gtar -z"
y "-y" "shutdown -y"
throwaway "all entires" "read so far"
A "-a" "ls -a"
B "-b" "cpio -b"
C "-c" "tar -c"
D "-d" "make -d"
EOF
}


function process_input_file
{
        typeset -i line_num=0

        set -A argname
        set -A argvalue
        set -A argtype

        typeset specific

        while read argtype[$line_num] specific; do
                eval set -A argvars -- $specific
                if [[ ${argtype[$line_num]} == "throwaway" ]]; then
                        line_num=0
                        unset argname #
                        unset argtype #
                        unset argvalue #
                        set -A argname
                        set -A argtype
                        set -A argvalue
                        continue
                fi
                if [[ -z "${argvars[1]}" ]]; then
                        skip=1
                fi
                argname[$line_num]=${argvars[0]}
                argvalue[$line_num]=${argvars[1]}
                ((line_num = line_num + 1))
        done < /tmp/coreme.txt

        set +x
}

#
# main
#

print "Expected output is:
type    name    value
A       -a      ls -a
B       -b      cpio -b
C       -c      tar -c
D       -d      make -d"

print "
Start script ..."

create_input_file
process_input_file

print "End script
..."

typeset -i idx=0

print "type \t name \t value"

for i in ${argtype[*]}; do
        print "${argtype[$i]} \t ${argname[$i]} \t ${argvalue[$i]}"
        ((i = i + 1))
done

Reply via email to