*Synopsis*: Korn shell 93 sometimes mishandles return value of its child process

CR 6887363 changed on Apr 3 2010 by <User 1-5Q-9201>

=== Field ============ === New Value ============= === Old Value =============

Root Cause             Another Bug Fix                                        
====================== =========================== ===========================

     
*Change Request ID*: 6887363

*Synopsis*: Korn shell 93 sometimes mishandles return value of its child process

  Product: solaris
  Category: shell
  Subcategory: korn93
  Type: Defect
  Subtype: Functionality
  Status: 7-Fix in Progress
  Substatus: 
  Priority: 2-High
  Introduced In Release: solaris_nevada
  Introduced In Build: snv_128
  Responsible Engineer: <User 1-5Q-9201>
  Keywords: oss-request, oss-sponsor

=== *Description* ============================================================
Following construction sometimes ends with wrong return value.

     56          echo $op | grep rand 2>&1 >/dev/null
     57          if [ $? = 0 ]; then
     58                 randseq="rand${SEED}"
     59          else
     60                 randseq="seq"
     61          fi

Sometimes, the given result is "rand..." even when there is no "rand" word in 
$op. This can be demonstrated with TSufs/SnapShots/Func test case which 
excercises shown code quite often.

As it happens only sometimes, I suppose there is an race-condition in handling 
return value from a child process.

*** (#1 of 1): 2009-10-01 15:38:27 GMT+00:00 <User 1-I30-737>
*** Last Edit: 2009-10-02 12:52:46 GMT+00:00 <User 1-I30-737>


=== *Public Comments* ========================================================
OpenSolaris ksh93 integration project leader Roland Mainz asks:
   Does the problem go away if you apply the ksh93-integration update2
   tarballs from
   http://www.opensolaris.org/os/project/ksh93-integration/downloads/2009-09-22/
   ?
   I am pretty much sure the update should kill such race-conditions...

*** (#1 of 6): 2009-10-02 21:46:47 GMT+00:00 <User 1-5Q-1267>

I'm afraid that it doesn't. I installed the tarball on my test box but the test 
keeps failing.
# /bin/sh --version
  version         sh (AT&T Research) 93t+ 2009-09-09

*** (#2 of 6): 2009-10-05 10:39:13 GMT+00:00 <User 1-I30-737>

Roland says:

Grumpf...
1. ... is it possible that you have the shell option "pipefail" enabled
(e.g. what does $ set -o | fgrep pipefail # say ?) ?
2. If "pipefail" is not enabled then I need a reduced testcase to
reproduce the problem (I don't have SWAN access). I tried $ ksh93 -c
'while true ; do echo $op | grep rand 2>&1 >/dev/null ; if [ $? = 0 ];
then randseq="rand${SEED}" ; else randseq="seq" ; fi ; [[ "$randseq" !=
"seq" ]] && print -- "$randseq" ; done' # over the whole weekend without
success...

Finally:
In general the pipe construct with "echo ... | grep" wins the award for
being horrible inefficient. AFAIK this should be _much_ more efficient:
-- snip --
if [[ "$op" == *rand* ]] ; then
    ...
else
    ...
fi
-- snip --

If you need egrep pattern you can use:
-- snip --
if [[ "$op" == ~(E)egrep_pattern ]] ; then
    ...
else
    ...
fi
-- snip --
(note that blanks and other shell-special character in egrep_pattern
need to be escaped with '\' and anchors need to be specified with
'l'/'r' in the ~(mod) prefix, e.g. ~(Er)pattern means pattern with right
anchor, ~(El)pattern means pattern with left anchor, ~(Ei)pattern means
case-insensitive matching etc.)
(more details on demand, ~(mod) supports much more pattern systems (like
shell, perl etc. patterns))

*** (#3 of 6): 2009-10-05 15:30:22 GMT+00:00 <User 1-5Q-1267>

# set -o | fgrep pipefail
pipefail        off

And I can't use the "if" constructs because the script needs to be backward 
compatible with Bourne shell to be able to run on Solaris 9 and 10.
I'll try to craft a minimal test case.

*** (#4 of 6): 2009-10-06 07:08:36 GMT+00:00 <User 1-I30-737>

Glenn Fowler, in response to the last comment on 
<email address omitted>, suggested:

   (not shirking the duty to find the real problem)
   how about

        case $op in
        *rand*) randseq="rand${SEED}" ;;
        *)      randseq="seq" ;;
        esac

*** (#5 of 6): 2009-10-06 14:58:30 GMT+00:00 <User 1-5Q-1267>

I finally made a test case. Please find it attached.
There seems to be many things contributing to this issue.

*** (#6 of 6): 2009-10-15 15:18:53 GMT+00:00 <User 1-I30-737>


=== *Workaround* =============================================================

=== *Additional Details* =====================================================
        Targeted Release: solaris_nevada
        Commit To Fix In Build: snv_138
        Fixed In Build: 
        Integrated In Build: 
        Verified In Build: 
  See Also: 6886525, 6939349
  Duplicate of: 
  Hooks:
        Hook1: 
        Hook2: 
        Hook3: 
        Hook4: 
        Hook5: <email address omitted>
        Hook6: <email address omitted>
  Program Management: 
  Root Cause: Another Bug Fix
  Fix Affects Documentation: No
  Fix Affects Localization: No

=== *History* ================================================================
        Date Submitted: 2009-10-01 15:38:26 GMT+00:00
        Submitted By: <User 1-I30-737>

        Status Changed    Date Updated                  Updated By
        3-Accepted        2009-10-02 16:03:12 GMT+00:00 <User 1-5Q-6085>
        7-Fix in Progress 2010-04-02 17:06:39 GMT+00:00 <User 1-5Q-9201>


=== *Service Request* ========================================================
        Impact: Significant
        Functionality: Primary
        Severity: 2
        Product Name: storage-tests
        Product Release: v3
        Product Build: 
        Operating System: osol_2009.06
        Hardware: x86
        Submitted Date: 2009-10-01 15:38:27 GMT+00:00


=== *Multiple Release (MR) Cluster* - 0 ======================================

_______________________________________________
ksh93-integration-discuss mailing list
ksh93-integration-discuss@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/ksh93-integration-discuss

Reply via email to